代码之家  ›  专栏  ›  技术社区  ›  SamHoque

GridBagLayout中的项目未正确对齐

  •  0
  • SamHoque  · 技术社区  · 7 年前

    我试图在网格布局中对齐3个项目,其中2个在顶部,1个在底部。两个项目的大小应该相同。我试过用borderlayout和gridbaglayout来实现这一点,但没有运气。

    这是我对GridBagLayout的尝试,因为您可以看到它们没有正确对齐。这就是我所要做的。

    添加第一项 设置x为1 添加第二项 设置Y到1 添加最后一项 < /代码>

    我希望这能起作用,因为这对我没有意义,为什么这不起作用,这里是它的代码。

    gridBagConstraints gbc=new gridBagConstraints();
    gbc.gridx=0;
    GCID=0;
    jtextfield oldpkg=新jtextfield();
    容器添加(oldpkg,gbc);
    GbcGrIdx=1;
    jtextfield newpkg=新jtextfield();
    GCID=1;
    jtextfield apkpath=new jtextfield();
    container.add(apkpath,gbc)添加;
    < /代码> 
    
    

    我想要达到的结果是

    我已经用flowlayout实现了它,但是在调整框架大小时它不会退出压缩,并且底部栏有点大。

    如何使用GridBagLayout或任何其他布局来实现这一点,以便在大小更改时保持不变?

    enter image description here

    这是我对GridBagLayout的尝试,因为您可以看到它们没有正确对齐。这就是我想做的。

    Add first item
    Set the x to 1
    Add second item
    Set the y to 1
    Add the last item
    

    我希望这能起作用,因为我不明白为什么这不起作用,这是它的代码。

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        JTextField oldPkg = new JTextField();
        container.add(oldPkg, gbc);
        gbc.gridx = 1;
        JTextField newPkg = new JTextField();
        gbc.gridy = 1;
        JTextField apkPath = new JTextField();
        container.add(apkPath, gbc);
    

    我想要达到的结果是

    enter image description here

    我已经用flowlayout实现了它,但是在调整框架大小时,它不会放弃打包,底部的条也有点大。

    如何使用GridBagLayout或任何其他布局来实现这一点,以便在大小更改时保持不变?

    2 回复  |  直到 7 年前
        1
  •  4
  •   MadProgrammer    7 年前

    有时候,你需要退后,尝试一种不同的方法。也许从和一张纸开始,在那里你可以画出布局和绘制出约束条件。

    这会让你明白 apkPath 需要从开始 x 属于 0 和“跨距”两列。

    目前 APKPATH 使用相同的 X 作为位置 newPkg ,您需要在再次使用之前更改它。

    gbc.gridy = 1;
    gbc.gridx = 0;
    JTextField apkPath = new JTextField();
    container.add(apkPath, gbc);
    

    好吧,但现在它和 oldPkg 我们要告诉你 GridBagLayout 我们要跨越多个列

    gbc.gridy = 1;
    gbc.gridx = 0;
    gbc.gridwidth = 2;
    JTextField apkPath = new JTextField();
    container.add(apkPath, gbc);
    

    现在应该允许文本字段在两列上流动

    我建议你看看 How to Use GridBagLayout 有关详细信息

        2
  •  -2
  •   Teddy    7 年前

    稍微偏离主题: 我建议您不要打扰90%的内置布局,只使用miglayout。

    有一个miglayout核心jar和miglayout swing jar。(不要误取miglayout swt jar,也不要在import语句中使用swt版本)。

    我想许可证是自由的。但是,您可以检查它是否符合您的需要。

    http://www.miglayout.com/

    (只是一个快乐的用户。无关联)

    这只需要几行就可以做到:

    公共类布局应答扩展jframe{ 公共静态void main(string[]args){ swingUtilities.Invokelater(new runnable()){ @重写 public void run()。{ layoutAnswer window=new layoutAnswer(); 窗口; 窗口,包(); window.setVisible(真); window.setLocationRelativeTo(空); window.setDefaultCloseOperation(jframe.exit在关闭时退出); } (}); } private jpanel panel=new jpanel(new miglayout(“insets 10”,“[300::,grow][400::,grow]”,“[100:150:200][100:150:200]”); private jlabel lbl1=新jlabel(“one”); private jlabel lbl2=新jlabel(“两个”); private jlabel lbl3=新jlabel(“三”); public void init()。{ 添加(面板,borderlayout.center); panel.add(lbl1,“”); 面板添加(lbl2,“包装”); 面板。添加(lbl3,“跨度2”); } } < /代码>

    jar和miglayout swing jar。(不要误取miglayout swt jar,也不要在import语句中使用swt版本)。

    我想许可证是自由的。但是,你可以检查它是否符合你的需要。

    http://www.miglayout.com/

    (只是一个快乐的用户。非附属机构)

    这只需要几行就可以做到:

    public class LayoutAnswer extends JFrame {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    LayoutAnswer window = new LayoutAnswer();
    
                    window.init();
                    window.pack();
    
                    window.setVisible(true);
                    window.setLocationRelativeTo(null);
                    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                }
            });
    
        }
    
        private JPanel panel = new JPanel( new MigLayout("insets 10","[300::, grow][400::, grow]","[100:150:200][100:150:200]") );
        private JLabel lbl1 = new JLabel("One");
        private JLabel lbl2 = new JLabel("Two");
        private JLabel lbl3 = new JLabel("Three");
        public void init() {
            add(panel, BorderLayout.CENTER);
    
            panel.add(lbl1, "");
            panel.add(lbl2, "wrap");
            panel.add(lbl3, "span 2");
        }
    }
    

    Sample image. Resizes nicely.