Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame在附加屏幕上最小化_Java_Swing_Jframe_Monitor_Minimized - Fatal编程技术网

Java JFrame在附加屏幕上最小化

Java JFrame在附加屏幕上最小化,java,swing,jframe,monitor,minimized,Java,Swing,Jframe,Monitor,Minimized,我正在创建一个可以在两个监视器上运行的应用程序。为此,我创建了2个JFrames。 第一个是我的客户端应用程序,它将显示只有我才能看到的信息。第二个(我们称之为TweetForm)是一个jframe,它将显示每个人都能看到的信息。(可能的监视器是一台电视)。 我搜索了如何在两个单独的屏幕上显示此内容,并找到了以下解决方案: 这很好,但是: 每当我把注意力集中在我的“主监视器”上时,电视上显示的tweetForm就会最小化。如何防止jframe最小化并始终显示?(即使第一个jframe已最小化或

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

这很好,但是: 每当我把注意力集中在我的“主监视器”上时,电视上显示的tweetForm就会最小化。如何防止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" );
    }
}
/**
*创建新表单TweetForm
*/
公共推文格式()
{
初始化组件();
处置();
未装饰的设置(真实);
包装();
setExtendedState(Frame.MAXIMIZED_两者);
setTitle(“严重请求”);
此.setAlwaysOnTop(true);
屏幕上显示(1,本);
}
公共静态无效显示屏幕(int屏幕,JFrame)
{
GraphicsEnvironment ge=GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsDevice[]gs=ge.getScreenDevices();
如果(屏幕>-1&&screen0)
{
gs[0].setFullScreenWindow(框架);
}
其他的
{
抛出新的RuntimeException(“未找到屏幕”);
}
}

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

也看,


我不确定使用
setFullScreenWindow
比使用
setExtendedState(最大化)
setUndercorated(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();
            }
        });
    }

}

试着只使用一个JFrame。将另一个作为JDialog,并将对话框中的数据更新到您的框架中。谢谢!成功了。没想到会这么简单:)+1个很好的例子。。。但似乎它将使用多个
JFrame
s。。。
JDialog
会不会像@Che提到的那样更好/更好地练习?@DavidKroukamp是的,它将使用多个JFrame。对我来说,如果对话框不是模态的,那么与多个JFrame上的对话框相同的结论也适用。所以对我来说,一个并不比另一个好。唯一的区别是JFrame在任务栏(至少在Windows上)中创建了一个额外的“条目”,这有其优点和缺点。JFrame或JDialog之间的选择没有太大区别,在这种情况下,至少IMHO.+1。。。如果对话框不是模态的,则与我认为的多JFrame ahhh上的结论相同(但没有多个屏幕进行测试):@DavidKroukamp本问题中描述的情况可能会使多帧/对话框的使用成为可接受的(主要是因为它使用了“alwaysOnTop/未装饰/最大化”的组合还有多个屏幕)。啊哈,现在你收买了我:)