当我按一下按钮,它被设置为全屏应用程序将进入任务栏/最小化,所以我需要先点击任务栏中看到之前JOptionPane
我触发。 你觉得是这个问题吗? 我想它不会被最小化或将任务栏流畅运行。
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setTitle("Sample");
GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
device.setFullScreenWindow(frame);
device.setDisplayMode(new DisplayMode(800, 600, 32, 60));
frame.setVisible(true);
JButton btn = new JButton();
btn.setText("Btn");
JPanel panel = new JPanel();
panel.add(btn);
frame.add(panel);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(frame, "Sample");
throw new UnsupportedOperationException("Not supported yet.");
}
});
}
这里的一个解决办法是使用
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
代替
device.setFullScreenWindow(frame);
另外,作为在评论中提到的, setVisible(true)
应该出现的时候已经添加的所有组件。
围绕我能想到的唯一工作就是添加一个WindowAdpater
到JFrame
这将覆盖windowIconified(..)
还有一个boolean
用作标志的程序当窗口被图标化,由于向知道JOptionPane
被显示。
它虽然真的哈克,只有经过几个屏幕闪烁做我们看到JOptionPane
与JFrame
很好地协同工作。
下面是代码:
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
private static boolean programmatic = false;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Sample");
GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
device.setFullScreenWindow(frame);
device.setDisplayMode(new DisplayMode(800, 600, 32, 60));
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowIconified(WindowEvent we) {
//super.windowIconified(we);
if (programmatic) {
programmatic = false;
frame.setState(JFrame.NORMAL);
}
}
});
JButton btn = new JButton();
btn.setText("Btn");
final JPanel panel = new JPanel();
panel.add(btn);
frame.add(panel);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
programmatic = true;
JOptionPane.showMessageDialog(panel, "Sample");
}
});
frame.setVisible(true);
}
});
}
}
并思考它更多JDialog
也再现了结果,我认为它是由于形态的JOptionPane
S和JDialog
秒。 也许使用JDialog
和设置方式会做的伎俩。