Java 如何将所有swing组件与JPanel/JFrame的左上角对齐

Java 如何将所有swing组件与JPanel/JFrame的左上角对齐,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,我创建了一个简单的程序,它有一个JLabel,上面写着你想继续吗,还有两个JButtons,一个说是,一个说否 我正在使用GridBaGLayout组织JPanel/JFrame。我的程序编译和运行很好,但GridBagLayout将我的所有组件集中在JFrame的中心。由于我是swing新手,有人能告诉我如何将所有组件对齐到JFrame的左上角吗?这可能不是一个真正的答案,但无论如何:停止使用GridBagLayout。它有很多陷阱,使用起来很脆弱,所以请不要使用它 使用更好的替代方案,如,并

我创建了一个简单的程序,它有一个JLabel,上面写着你想继续吗,还有两个JButtons,一个说是,一个说否


我正在使用GridBaGLayout组织JPanel/JFrame。我的程序编译和运行很好,但GridBagLayout将我的所有组件集中在JFrame的中心。由于我是swing新手,有人能告诉我如何将所有组件对齐到JFrame的左上角吗?

这可能不是一个真正的答案,但无论如何:停止使用GridBagLayout。它有很多陷阱,使用起来很脆弱,所以请不要使用它

使用更好的替代方案,如,并了解这一点。不要费心学习任何Java的默认布局管理器,除非您真的需要

使用MigLayout的示例如下:

JPanel panel = new JPanel(new MigLayout("","",""));

panel.add(myJButton1, "wrap");
panel.add(myJButton2, "wrap");
panel.add(myJButton3, "wrap");
panel.add(myJButton4, "wrap");
panel.add(myJButton5, "wrap");
panel.add(myJButton6, "wrap");

有几种方法可以做到这一点,您可以先将所有组件添加到另一个容器中,然后在容器中布局该容器,但基本原则仍然是

导入java.awt.EventQueue;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.weightx=1;
gbc.anchor=GridBagConstraints.WEST;
gbc.gridwidth=GridBagConstraints.rements;
对于(int-index=0;index<10;index++){
添加(新JButton(“测试”),gbc;
}
gbc.weighty=1;
添加(新JLabel(),gbc);
}
}
}

基本上,这增加了一个“隐藏”的组件到最后一行,它想要占用容器的剩余空间,迫使组件到容器的上/左角落

你使用IDE吗?除非你在做作业,考虑JopTePANE,普通的对话的核心Swing功能,例如JopTePANE.SuffRealMcCaldio(NULL,“你想继续吗?”“继续吗?”,JOptionPane。是\否\选项);谢谢你们的反馈!我要用“汉卡”的方式来尝试你们两个家伙的方法:)
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc= new GridBagConstraints();
            gbc.weightx = 1;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            for (int index = 0; index < 10; index++) {
                add(new JButton("Test"), gbc);
            }

            gbc.weighty = 1;
            add(new JLabel(), gbc);
        }

    }

}