Java JFrame在附加屏幕上最小化



我正在创建一个可以在两台显示器上运行的应用程序。为此,我创建了 2 个 JFrames。第一个是我的客户端应用程序,它将显示只有我必须看到的信息。第二个(我们称之为TweetForm)是一个jframe,它将显示每个人都可以看到的信息。(可能的显示器将是电视)。我已经搜索了如何将其放在两个单独的屏幕上,并找到了以下解决方案:在双显示器配置的特定屏幕中显示 JFrame

这工作得很好,但是:每当我将某些内容集中在我的"主显示器"上时,电视上显示的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,并在对话框中更新与您的框架相关的数据。

另请参阅,

使用多个 JFrames。

使用多个 JFrames

不确定我是否理解使用 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();
            }
        });
    }
}

相关内容

  • 没有找到相关文章

最新更新