在JavaSwing中对齐屏幕中央的GroupLayout?

在JavaSwing中对齐屏幕中央的GroupLayout?,java,swing,grouplayout,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.EX

如果我有这样一个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的默认位置?

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


我只需要将整个GUI(包含所有内容)放在屏幕的中心

这与
GroupLayout
没有任何关系,一切都与此有关。但是,阅读下面的文章,可以找到一种更好的方法来定位屏幕上的GUI(即,位于比屏幕中心更合理的位置-下面的示例)


将具有
组布局的contianer作为没有约束的单个组件放置。整个容器将居中


我只需要将整个GUI(包含所有内容)放在屏幕的中心

这与
GroupLayout
没有任何关系,一切都与此有关。但是,阅读下面的文章,可以找到一种更好的方法来定位屏幕上的GUI(即,位于比屏幕中心更合理的位置-下面的示例)


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

我把“fix”用倒逗号表示,因为我认为这是一个被打破的要求

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


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

我把“fix”用倒逗号表示,因为我认为这是一个被打破的要求

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


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

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

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

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

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

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

没有可设置布局的组件。我有文本区,滚动面板和一些按钮内布局,但没有把布局。我只是叫pack();和setVisible(true);定义布局后,它开始显示GUI。我从甲骨文网站上采纳了这个想法,但它没有显示对齐选项。类似这样的内容:为了更快地获得更好的帮助,请发布一条消息。“我是否可以将其与屏幕中心或其他自定义位置对齐?”好的,现在我运行该代码,它只会引发更多问题。具体来说,你所说的“它”是什么意思?我原以为你指的是包含组布局的整个面板,但现在我不太确定。另外,从未添加到GUI的标签有什么意义?@AndrewThompson,我的意思是我只需要将整个GUI(包含所有内容)居中到屏幕的中心,而对于没有添加到GUI的标签,我只是按照如下所示:没有可设置布局的组件。我有文本区,滚动面板和一些按钮内布局,但没有把布局。我只是叫pack();和setVisible(true);定义布局后,它开始显示GUI。我从甲骨文网站上采纳了这个想法,但它没有显示对齐选项。类似这样的内容:为了更快地获得更好的帮助,请发布一条消息。“我是否可以将其与屏幕中心或其他自定义位置对齐?”好的,现在我运行该代码,它只会引发更多问题。具体来说,你所说的“它”是什么意思?我原以为你指的是包含组布局的整个面板,但现在我不太确定。另外,从未添加到GUI的标签有什么意义?@AndrewThompson,我的意思是我只需要将整个GUI(包含所有内容)居中到屏幕的中心,而对于没有添加到GUI的标签,如图所示,我只想说:你能给我举个例子吗。GroupLayout不是一个组件,那么我如何才能将它添加到GridBagLayout?您可以发布当前代码的SSCCE(正如我已经建议的那样)?如果没有您提供的可编译代码,您可以从我这里得到最好的答案。+1有一个很好的示例和解释利用了这个问题。@AndrewThompson,我应该在哪里应用方法setLocationRelativeTo(null)。同样,如果我有一个frame,那么我可以用frame.setLocationRelativeTo(null)调用它;但是在这种情况下,我怎么做呢?你能给我举个例子吗。GroupLayout不是一个组件,那么我如何才能将它添加到GridBagLayout?您可以发布当前代码的SSCCE(正如我已经建议的那样)?如果没有您提供的可编译代码,您可以从我这里得到最好的答案。+1有一个很好的示例和解释利用了这个问题。@AndrewThompson,我应该在哪里应用方法setLocationRelativeTo(null)。同样,如果我有一个框架,那么我可以称之为智慧