【问题标题】:Java JFrame Gets Minimized On Additional ScreenJava JFrame 在附加屏幕上最小化
【发布时间】:2013-01-14 09:22:45
【问题描述】:

我正在创建一个可以在两个监视器上运行的应用程序。为此,我创建了 2 个 JFrame。 第一个是我的客户端应用程序,它只会显示我必须看到的信息。第二个(我们称之为 TweetForm)是一个 jframe,它将显示每个人都可以看到的信息。 (可能的显示器是电视)。 我搜索了如何将其放在两个单独的屏幕上并找到以下解决方案: Show JFrame in a specific screen in dual monitor configuration

这很好用,但是: 每当我将注意力集中在我的“主监视器”上时,电视上显示的 tweetForm 就会被最小化。如何防止 jframe 最小化并始终显示? (即使第一个 jframe 是否最小化)

来自第二个 JFRAME 的代码

/**
 * Creates new form TweetForm
 */
public TweetForm()  
{
    initComponents();
    dispose();
    setUndecorated(true);
    pack();
    setExtendedState(Frame.MAXIMIZED_BOTH);
    setTitle("Serious Request");
    this.setAlwaysOnTop(true);

    showOnScreen(1, this);
}

public static void showOnScreen( int screen, JFrame frame )
{
    GraphicsEnvironment ge = GraphicsEnvironment
        .getLocalGraphicsEnvironment();
    GraphicsDevice[] gs = ge.getScreenDevices();
    if( screen > -1 && screen < gs.length )
    {
        gs[screen].setFullScreenWindow( frame );
    }
    else if( gs.length > 0 )
    {
        gs[0].setFullScreenWindow( frame );
    }
    else
    {
        throw new RuntimeException( "No Screens Found" );
    }
}

【问题讨论】:

  • 尝试只使用一个 JFrame。将另一个设置为 JDialog 并将对话框中的数据更新到您的框架。
  • 谢谢!那行得通。没想到这么简单:)

标签: java swing jframe monitor minimized


【解决方案1】:

只使用一个JFrame。将另一个设为JDialog 并在对话框中更新与您的框架相关的数据。

另见,

Use of Multiple JFrames.

Working with Multiple JFrames

【讨论】:

    【解决方案2】:

    不确定我是否理解使用setFullScreenWindow 比使用setExtendedState(MAXIMIZED)setUndecorated(true) 结合的好处。无论如何,无论我是否使用setFullScreenWindow(),我都没有观察到您提到的行为(参见下面的示例代码,使用 ESC 退出应用程序)。

    在你的构造函数中调用dispose() 有什么理由吗?我觉得很奇怪。

    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    
    import javax.swing.AbstractAction;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.KeyStroke;
    import javax.swing.SwingUtilities;
    
    public class Test2JFrame {
    
        protected void initUI() {
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            int i = 1;
            for (GraphicsDevice gd : ge.getScreenDevices()) {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(createLabel(String.valueOf(i)));
                frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "exit");
                frame.getRootPane().getActionMap().put("exit", new AbstractAction() {
    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.exit(0);
                    }
                });
                frame.setLocation(gd.getDefaultConfiguration().getBounds().getLocation());
                frame.setUndecorated(true);
                frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
                frame.setVisible(true);
                gd.setFullScreenWindow(frame);
                i++;
            }
        }
    
        private JLabel createLabel(String label) {
            JLabel jLabel = new JLabel(label);
            jLabel.setHorizontalAlignment(JLabel.CENTER);
            jLabel.setFont(jLabel.getFont().deriveFont(48.0f));
            jLabel.setFocusable(true);
            return jLabel;
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Test2JFrame().initUI();
                }
            });
        }
    
    }
    

    【讨论】:

    • +1 不错的例子...但似乎它将使用多个JFrames...JDialog 不会像@Che 提到的那样更好/更好的做法吗?
    • @DavidKroukamp 是的,它将使用多个 JFrame。对我来说,如果对话框不是模态的,则与多个 JFrame 上的结论相同。所以对我来说,一个并不比另一个好。唯一的区别是 JFrame 在任务栏中创建了一个额外的“条目”(至少在 Windows 上),这有其优点和缺点。 JFrame 或 JDialog 之间的选择并没有太大的区别,在这种情况下,至少恕我直言。
    • +1 ... 如果对话框不是模态的,则与多个 JFrame 上的结论相同 啊哈,正如我所想的那样(但没有要测试的多个屏幕. :))
    • @DavidKroukamp 这个问题中描述的情况可能使使用多个框架/对话框可以接受(主要是因为它使用了“alwaysOnTop/Undecorated/Maximized”和多个屏幕的组合)。
    • 啊,现在你把我收买了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多