Java JFrame在双监控系统中的应用

Java JFrame在双监控系统中的应用,java,swing,jframe,multiple-monitors,Java,Swing,Jframe,Multiple Monitors,我试图显示两个jframe,每个监视器上显示一个,代码似乎输出了错误的内容。我的问题是边界线类似于这些… 除了我的JFrames基本上被覆盖并显示为空白。下面的示例代码来自我测试的一个问题,看看它是否是我想要的,但是JFrames显示的与我想要的完全不同。它们是空白的,即使它们应该显示图标。代码是赤裸裸的,因为我试图弄清楚为什么JFrames会变得可重新调整大小,并且不会像预期的那样退出 import java.awt.*; import java.awt.event.*; import

我试图显示两个jframe,每个监视器上显示一个,代码似乎输出了错误的内容。我的问题是边界线类似于这些…



除了我的JFrames基本上被覆盖并显示为空白。下面的示例代码来自我测试的一个问题,看看它是否是我想要的,但是JFrames显示的与我想要的完全不同。它们是空白的,即使它们应该显示图标。代码是赤裸裸的,因为我试图弄清楚为什么JFrames会变得可重新调整大小,并且不会像预期的那样退出

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Dual extends JFrame implements ActionListener, ChangeListener {
    public Dual(String one) {
        JFrame frame = new JFrame(one);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setResizable(false);
    }

    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" );
        }
    }

    public static void main(String[] args) {
        showOnScreen(1, new Dual("Test"));
        showOnScreen(2, new Dual("1...2"));
        GraphicsDevice[] devices = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
        for ( int i = 0; i < devices.length; i++ ) {
            System.out.println( "Device " + i + " width: " + devices[ i ].getDisplayMode().getWidth() );
            System.out.println( "Device " + i + " height: " + devices[ i ].getDisplayMode().getHeight() );
        }       
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.event.*;
公共类双扩展JFrame实现ActionListener、ChangeListener{
公共双(字符串一){
JFrame=新JFrame(一个);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setresizeable(false);
}
公共静态无效显示屏幕(int屏幕,JFrame){
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[]gs=ge.getScreenDevices();
如果(屏幕>-1&&screen0){
gs[0].setFullScreenWindow(框架);
}否则{
抛出新的RuntimeException(“未找到屏幕”);
}
}
公共静态void main(字符串[]args){
屏幕显示(1,新双(“测试”);
屏幕上显示(2,新双(“1…2”);
GraphicsDevice[]设备=GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
对于(int i=0;i
据我所知,你把你的推荐信搞砸了。你不需要JFrame,你实际上需要一个窗口

请查看一个示例。我用它来修改您的代码,以创建一个工作模型,结果看起来像:

public class Dual extends Window implements ActionListener, ChangeListener {

    private int screen;

    public Dual(String one) {

        super(new Frame());

        setLayout(new FlowLayout());

        JButton button = new JButton(one);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
                GraphicsDevice[] gs = ge.getScreenDevices();
                if (screen > -1 && screen < gs.length) {
                    gs[screen].setFullScreenWindow(null);

                }

                dispose();
                System.exit(0);

            }
        });

        add(button);

    }

    public void setScreen(int screen) {

        this.screen = screen;

    }

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

    public static void main(String[] args) {
        showOnScreen(1, new Dual("Test"));
    showOnScreen(2, new Dual("1...2"));
//        GraphicsDevice[] devices = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
//        for ( int i = 0; i < devices.length; i++ ) {
//            System.out.println( "Device " + i + " width: " + devices[ i ].getDisplayMode().getWidth() );
//            System.out.println( "Device " + i + " height: " + devices[ i ].getDisplayMode().getHeight() );
//        }       
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    }

    @Override
    public void stateChanged(ChangeEvent e) {
    }
}
公共类双扩展窗口实现ActionListener、ChangeListener{ 专用int屏幕; 公共双(字符串一){ 超级(新框架()); setLayout(新的FlowLayout()); JButton按钮=新JButton(一个); addActionListener(新建ActionListener()){ @凌驾 已执行的公共无效操作(操作事件e){ GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[]gs=ge.getScreenDevices(); 如果(屏幕>-1&&screen-1&&screen0){ gs[0].setFullScreenWindow(框架); }否则{ 抛出新的RuntimeException(“未找到屏幕”); } } 公共静态void main(字符串[]args){ 屏幕显示(1,新双(“测试”); 屏幕上显示(2,新双(“1…2”); //GraphicsDevice[]设备=GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(); //对于(int i=0;i请对代码块使用一致且符合逻辑的缩进。