如何在中心屏幕中定位表单?

时间:2012-03-03 03:59:59

标签: java swing netbeans layout-manager

我是一名.Net开发人员,但不知怎的,我的任务是在java中创建一个简单的应用程序,原因有些。我能够创建该应用程序但我的问题是如何在应用程序启动时将窗体置于屏幕中心?

这是我的代码:

private void formWindowActivated(java.awt.event.WindowEvent evt) 
{
        // Get the size of the screen
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

        // Determine the new location of the window
        int w = this.getSize().width;
        int h = this.getSize().height;
        int x = (dim.width-w)/2;
        int y = (dim.height-h)/2;

        // Move the window
        this.setLocation(x, y);
}

上面的代码运行正常,但问题是我看到表单从最顶层移动到中心屏幕。我还尝试在formWindowOpened事件中添加该代码,但仍显示相同的操作。有更好的方法吗?就像在.NET Application中一样,有一个CenterScreen Position。或者,如果上面的代码是正确的,我将把它放在什么事件上?

感谢您阅读本文。

9 个答案:

答案 0 :(得分:111)

在JFrame上调用pack后,只需设置相对于null的位置即可。

如,

  JFrame frame = new JFrame("FooRendererTest");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(mainPanel); // or whatever...
  frame.pack();
  frame.setLocationRelativeTo(null);  // *** this will center your app ***
  frame.setVisible(true);

答案 1 :(得分:9)

以下示例在屏幕上居中显示框架:

package com.zetcode;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import javax.swing.JFrame;


public class CenterOnScreen extends JFrame {

    public CenterOnScreen() {

        initUI();
    }

    private void initUI() {

        setSize(250, 200);
        centerFrame();
        setTitle("Center");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void centerFrame() {

            Dimension windowSize = getSize();
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            Point centerPoint = ge.getCenterPoint();

            int dx = centerPoint.x - windowSize.width / 2;
            int dy = centerPoint.y - windowSize.height / 2;    
            setLocation(dx, dy);
    }


    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                CenterOnScreen ex = new CenterOnScreen();
                ex.setVisible(true);
            }
        });       
    }
}

为了在屏幕上居中框架,我们需要获得本地 图形环境。从这个环境,我们确定了 中心点。结合框架尺寸,我们管理 使框架居中。 setLocation()是方法 将框架移动到中心位置。

请注意,这实际上是setLocationRelativeTo(null)的作用:

public void setLocationRelativeTo(Component c) {
    // target location
    int dx = 0, dy = 0;
    // target GC
    GraphicsConfiguration gc = getGraphicsConfiguration_NoClientCode();
    Rectangle gcBounds = gc.getBounds();

    Dimension windowSize = getSize();

    // search a top-level of c
    Window componentWindow = SunToolkit.getContainingWindow(c);
    if ((c == null) || (componentWindow == null)) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
        gcBounds = gc.getBounds();
        Point centerPoint = ge.getCenterPoint();
        dx = centerPoint.x - windowSize.width / 2;
        dy = centerPoint.y - windowSize.height / 2;
    }

  ...

  setLocation(dx, dy);
}

答案 2 :(得分:2)

改变这个:

public FrameForm() { 
    initComponents(); 
}

到此:

public FrameForm() {
    initComponents();
    this.setLocationRelativeTo(null);
}

答案 3 :(得分:1)

$fa-font-path: "../fonts" !default;

答案 4 :(得分:0)

我希望这会有所帮助。

把它放在源代码的顶部:

import java.awt.Toolkit;

然后编写此代码:

private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
    int lebar = this.getWidth()/2;
    int tinggi = this.getHeight()/2;
    int x = (Toolkit.getDefaultToolkit().getScreenSize().width/2)-lebar;
    int y = (Toolkit.getDefaultToolkit().getScreenSize().height/2)-tinggi;
    this.setLocation(x, y);
}
祝你好运:)

答案 5 :(得分:0)

实际上,你并不需要编写代码来使表单进入中心屏幕。

只需修改jframe的属性即可   
按照以下步骤进行修改:

  • 右键点击表格
  • FormSize政策更改为 - 生成调整大小代码
  • 然后编辑表格位置X -200 Y-200

你已经完成了。为什么要承担编码的痛苦。 :)

答案 6 :(得分:0)

如果您使用NetBeans IDE右键单击表单,那么

属性 - >代码 - >查看生成中心

答案 7 :(得分:-2)

尝试使用:

this.setBounds(x,y,w,h);

答案 8 :(得分:-2)

使用此功能你可以定义自己的位置

setBounds(500, 200, 647, 418);