在Java Swing中将GroupLayout对齐屏幕中心?

时间:2011-12-09 10:11:00

标签: java swing grouplayout

所以如果我有这样的GUI:

import javax.swing.GroupLayout;
public class MyTest extends javax.swing.JFrame {

    public MyTest() {
        initComponents();
    }

    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("This is a sample GUI");

        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);

        layout.setHorizontalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGap(0, 244, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGap(0, 85, Short.MAX_VALUE)
        );

        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyTest().setVisible(true);
            }
        });
    }   
}

现在,当我运行程序时,它与屏幕左上角的(0,0)位置对齐。无论如何,我可以将它与屏幕中心或另一个自定义位置对齐吗? 如果我只使用不使用GroupLayout的框架,就像setLocation(左,上)一样,这样可以正常工作,但是通过这个实现,我该如何更改此GUI的默认定位?

3 个答案:

答案 0 :(得分:4)

将带有GroupLayout的contianer作为GridBagLayout的单个组件,没有约束。整个容器将居中。


  

我只需要将整个GUI(包含其中的内容)集中到scree的中心,

GroupLayout一切setLocationRelativeTo(null)有关。但是阅读How to best position Swing GUIs以获得更好的方法来在屏幕上定位GUI(即在比屏幕中心更合理的位置 - 例如下面的例子)。

答案 1 :(得分:3)

就像我之前提到的问题中提到的,在我认为你指的是框架本身居中之前 - 使用没有约束的GridBagLayout。这将产生将组件放在父容器的中心的效果。请注意,由于框架具有窗口装饰,这意味着父容器'本身略低于屏幕中心。如果这是一个问题,唯一的解决方法是“解决问题”。我能想到的是使用一个未修饰的框架。

我把' fix'在引号中,因为我认为这是要求被打破。

Centered GroupLayout

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

public class MyTest extends JFrame {

    public MyTest() {
        initComponents();
    }

    private void initComponents() {

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setTitle("This is a sample GUI");
        getContentPane().setLayout(new GridBagLayout());

        JPanel gui = new JPanel();
        gui.setBackground(Color.GREEN);

        GroupLayout layout = new GroupLayout(gui);
        gui.setLayout(layout);

        layout.setHorizontalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGap(0, 244, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGap(0, 85, Short.MAX_VALUE)
        );

        add(gui);

        pack();
        setExtendedState(Frame.MAXIMIZED_BOTH );
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyTest().setVisible(true);
            }
        });
    }
}

答案 2 :(得分:0)

我猜你确实回答了这个问题,但关于如何使用它我并不是很清楚。 只需在pack()之前调用下面;正是我想要的:

this.setLocation(500,300); //value left, top in pixes
pack();  

基本上我需要知道的是setLocation(x,y);的确切用法,以及使用关键字"this",谢谢。