JOptionPane使用GraphicsDevice显示JFrame外部

时间:2012-12-25 10:45:28

标签: java swing awt fullscreen joptionpane

package javaapplication1;

import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setTitle("Frame");
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        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("Button");
        JPanel panel = new JPanel();

        panel.add(btn);
        frame.add(panel);

        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "JOptionPane");
            }
        });
    }
}

当我单击按钮时,设置为全屏的应用程序将转到任务栏/最小化,因此我需要先在任务栏中单击它,然后才能看到我触发的JOptionPane。您认为这有什么问题?我希望它能够在没有最小化或进入任务栏的情况下顺利运行。期待您的回答。提前致谢。或者还有其他替代方案吗?

2 个答案:

答案 0 :(得分:5)

该代码适用于我,但您可以尝试使用2个更改来修改此变体。

  1. 它在EDT上创建并显示GUI。
  2. 它使用框架的内容窗格作为JOptionPane
  3. 的父级
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class JavaApplication1 {
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
    
                public void run() {
                    final JFrame frame = new JFrame();
                    frame.setTitle("Frame");
                    frame.setSize(800, 600);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    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("Button");
                    JPanel panel = new JPanel();
    
                    panel.add(btn);
                    frame.add(panel);
    
                    btn.addActionListener(new ActionListener() {
    
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            //JOptionPane.showMessageDialog(frame, "JOptionPane");
                            JOptionPane.showMessageDialog(frame.getContentPane(), "JOptionPane");
                        }
                    });
                }
            };
            SwingUtilities.invokeLater(r);
        }
    }
    

    更新

    当我将以下行添加到上面看到的源的开头时..

    System.out.println(System.getProperty("java.version"));
    System.out.println(System.getProperty("java.vm.version"));
    

    ..输出&结果如下。

    在1.7

    中运行

    结果:问题中描述的失败。

    1.7.0_09
    23.5-b02
    

    在1.6

    中运行

    结果:成功,没有异常的工件或行为。

    1.6.0
    1.6.0-b105
    

    分析

    请注意,评论的其他结果表明行为在早期的1.6版本和1.6.0_25之间发生了一段时间的变化。这似乎是一个回归错误。 OP应检查bug database&如果没有可能出现,请提交一份新报告。

答案 1 :(得分:2)

JOptionPane.showInternalMessageDialog(frame.getContentPane(), "JOptionPane");