【问题标题】:JOptionPane showing outside JFrame with GraphicsDeviceJOptionPane 在带有 GraphicsDevice 的 JFrame 之外显示
【发布时间】:2012-12-26 20:29:45
【问题描述】:
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。你认为这有什么问题?我希望它能够顺利运行,而不会被最小化或进入任务栏。期待您的回答。提前致谢。或者有没有其他的替代方案?

【问题讨论】:

  • Jframe 上不需要 setVisible(true) 的一件事,因为 setFullScreenWindow(frame); 会将框架设置为可见,如果不是。话虽如此,在将所有组件添加到 JFrame 之后,我也会移动此调用,但这并不能解决问题,而是减少了可能原因的可能性
  • @DavidKroukamp,我删除了我以前的问题。只是我希望它被回答而不是被遗漏。
  • @Jong 我正要建议删除旧问题。在那种情况下,我的错误。我也想要解决方案或 atlesst 可能有什么问题。加 1
  • @Jong 这里是一个没有被删除的副本。stackoverflow.com/questions/14014523/…

标签: java swing awt fullscreen joptionpane


【解决方案1】:

该代码对我有用,尽管您可以尝试使用此变体进行 2 处更改。

  1. 它在 EDT 上创建并显示 GUI。
  2. 它使用框架的内容窗格作为JOptionPane 的父级

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

分析

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

【讨论】:

  • @AndrewThompson 我也很惊讶这个工作,在我的操作系统(windows 7 x64 Java7u10)上,当我单击按钮时,全屏 JFrame 被最小化并且没有显示 JOptionPane(它在那里但在其他窗口等后面并且全屏框架已最小化)只有在应用程序在任务栏上按下以使其重新聚焦时,JoptionPane 才会完美显示在全屏 JFrame 之上
  • @DavidKroukamp 我最初使用 1.6 进行测试,但如 1.7 中所述失败。似乎是一个回归错误。 -- OP 应该检查bug database,如果没有任何结果,请提交一份新报告。
  • @AndrewThompson 就像我认为它必须是关于 OPs 问题的最后一个答案说它有效并且他正在使用 Java 6。+1 发表评论和回答,希望你能编辑你的答案以反映你的评论,因为我找不到已提交的错误,并且网络上的许多其他人都遇到了类似的问题,这可能是解决方案/原因首次亮相的地方,直到提交错误:)
  • @DavidKroukamp 问题按照您的建议进行了编辑,并提供了更具体的信息。本地使用的版本。
  • 鉴于它在 1.6.0_25 和 1.7 中被破坏,我怀疑“不”。
【解决方案2】:
JOptionPane.showInternalMessageDialog(frame.getContentPane(), "JOptionPane");

【讨论】:

  • 这是什么意思?您是否从我的答案中解决了该代码的问题?似乎不太可能,因为该代码在这里失败。因此,这似乎“不是答案”,但我不知道你认为它会是什么。
  • 嗯。我没有注意到该代码行的 Internal 部分。所以这与我展示的代码不同。好的 - 你不妨接受你的答案。很高兴你把它整理好了。
猜你喜欢
  • 2012-07-20
  • 2016-06-08
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多