在第二个屏幕或监视器上居中JFrame - Java

时间:2015-06-25 18:04:36

标签: java jframe

我正在尝试在第二个屏幕上打开一个JFrame并将其居中。我可以在第二个屏幕上打开JFrame但是如何居中它。以下是我制作的示例代码:

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

public class Question {

public Question() {
    JFrame f = new JFrame();
    JPanel panel = new JPanel();
    f.getContentPane().add(panel);
    f.pack();
    f.setTitle("Hello");
    f.setSize(200,200);
    showOnScreen(1,f);
    f.setVisible(true);
}

public static void main(String[] args) {
    Runnable r = new Runnable() {
        @Override
        public void run() {
            new Question();
        }
    };
    SwingUtilities.invokeLater(r);
}
public static void showOnScreen( int screen, JFrame frame ) {
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] gd = ge.getScreenDevices();
    if( screen > -1 && screen < gd.length ) {
         frame.setLocation(gd[screen].getDefaultConfiguration().getBounds().x, frame.getY());


    } else if( gd.length > 0 ) {
        frame.setLocation(gd[0].getDefaultConfiguration().getBounds().x, frame.getY());
    } else {
        throw new RuntimeException( "No Screens Found" );
    }
}

}

我试过这样的东西把它放在第二个屏幕中: frame.setLocation((gd [screen] .getDefaultConfiguration()。getBounds()。x * 3/2)-200,((gd [screen] .getDefaultConfiguration()。getBounds()。height)/ 2)-200) ;

它有效,但我不想硬编码,因为在实际程序的后期,帧大小会发生变化。

我也试过这个:      frame.setLocation((gd [screen] .getDefaultConfiguration()。getBounds()。width)/2-frame.getSize()。width / 2,(gd [screen] .getDefaultConfiguration()。getBounds()。height)/ 2-frame.getSize()高度/ 2);

但是它会在第一个屏幕上打开它。有道理。

请有人帮忙申请正确的解决方案。感谢您的帮助。感谢。

2 个答案:

答案 0 :(得分:1)

这就是我解决的问题。我的应用程序最多可以有两个屏幕。

  public void showOnScreen( int screen, JFrame frame ) {
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] gd = ge.getScreenDevices();
    if( screen > 0 && screen < 2 ) {
        int x = frame.getWidth()/2;
        int y = frame.getHeight()/2;
        frame.setLocation((gd[screen].getDefaultConfiguration().getBounds().width * 3/2) - x,   (gd[screen].getDefaultConfiguration().getBounds().height *1/2) - y);
    } else if( gd.length > 0 ) {
        frame.setLocationRelativeTo(null);
    } else {
        throw new RuntimeException( "No Screens Found" );
    }
}

答案 1 :(得分:1)

要在第二个屏幕上居中显示(在此示例中为最后一个),我这样做:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
GraphicsConfiguration gc = gd[gd.length - 1].getDefaultConfiguration();
frame.setLocationRelativeTo(new JFrame(gd));

根据setLocationRelativeTo(Component c)文档:

  

如果组件不为null,但当前未显示,则   窗口位于目标屏幕所定义的中心   与该组件关联的GraphicsConfiguration。