5

我正在尝试将我的框架定位在屏幕的中心,我知道这段代码必须运行良好:

Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((screen.getWidth() - getWidth()) /2);
int y = (int) ((screen.getHeight() -getHeight()) /2);
setLocation(x, y); 

或者这个:

Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
setSize(screenWidth / 2, screenHeight / 2);
setLocation(screenWidth / 4, screenHeight / 4);

我已经尝试了所有可能的代码,但我不知道为什么它们不起作用,只需将框架移动到屏幕的右下角我使用 setRelative 为 null 但它再次不起作用。

我终于可以通过将宽度乘以 5 并将其除以某物来使框架非常靠近中心,但我知道这不是正确的方法。

谁能向我解释一下可能出了什么问题?

问题修复:

解决方案:我自己找到了最好的方法,如果您遇到同样的问题,只需让 netbeans 通过转到属性并检查生成中心来自动执行此操作,忘记愚蠢的代码。

4

4 回答 4

14

在主屏幕上居中框架的最简单方法(如果您有多个屏幕,则有选项)是使用 setLocationRelativeTo(...) 框架方法,并将 null 作为参数:

JFrame frame = new JFrame ();
frame.setSize ( 500, 300 );
frame.setLocationRelativeTo ( null );
frame.setVisible ( true );

如果这不起作用 - 试试这个(直接坐标):

Dimension ss = Toolkit.getDefaultToolkit ().getScreenSize ();
Dimension frameSize = new Dimension ( 500, 300 );

JFrame frame = new JFrame ();
frame.setBounds ( ss.width / 2 - frameSize.width / 2, 
                  ss.height / 2 - frameSize.height / 2,
                  frameSize.width, frameSize.height );
frame.setVisible ( true );

最后一个也是“终极”的例子——它将在每个可用的系统屏幕上显示居中的框架:

public static void main ( String[] args )
{
    Dimension frameSize = new Dimension ( 500, 300 );
    for ( GraphicsDevice screen : getGraphicsDevices () )
    {
        GraphicsConfiguration gc = screen.getDefaultConfiguration ();
        Rectangle sb = gc.getBounds ();

        JFrame frame = new JFrame ( gc );
        frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
        frame.setBounds ( sb.x + sb.width / 2 - frameSize.width / 2,
                sb.y + sb.height / 2 - frameSize.height / 2, frameSize.width,
                frameSize.height );
        frame.setVisible ( true );
    }
}

public static List<GraphicsDevice> getGraphicsDevices ()
{
    List<GraphicsDevice> devices = new ArrayList<GraphicsDevice> ();
    for ( GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment ()
            .getScreenDevices () )
    {
        if ( gd.getType () == GraphicsDevice.TYPE_RASTER_SCREEN )
        {
            if ( gd == GraphicsEnvironment.getLocalGraphicsEnvironment ()
                    .getDefaultScreenDevice () )
            {
                devices.add ( 0, gd );
            }
            else
            {
                devices.add ( gd );
            }
        }
    }
    return devices;
}
于 2012-06-27T17:52:30.787 回答
6

It's enough if you use

setLocationRelativeTo(null);

According to Javadoc for java.awt.Window.setLocationRelativeTo(),

If the component is null, ... the window is placed in the center of the screen.

于 2013-11-17T11:37:25.863 回答
3

我已经尝试过了,它不起作用,netbeans有什么问题吗?

netbeans 也许没有错

我正在尝试将我的框架定位在屏幕的中心

你可以试试

JFrame frame = new JFrame ();
frame.pack(); // or frame.setSize(int, int);
frame.setLocationByPlatform(true);
frame.setVisible(true);
于 2012-06-27T17:57:23.807 回答
2

在设置 JFrame 的大小之前,我会向甜甜圈打赌,您设置相对于 null 的位置/通过 x 和 y 坐标设置位置。如果尚未设置大小,则将其视为 0x0,将其死点设置为屏幕中心。如果您随后更改大小,它会将左上角留在原来的位置(屏幕中心)并将其缩放到屏幕的右下角。

换句话说,让 setSize() 在屏幕居中之前出现。

你做的其他一切在我看来都很好。

于 2014-05-25T02:01:53.510 回答