【问题标题】:Java GridBagLayout - Equal column width in different containersJava GridBagLayout - 不同容器中的相同列宽
【发布时间】:2016-10-14 16:48:06
【问题描述】:

几个小时以来,我一直遇到 GridBagLayout 的问题,但我无法解决它。我在一个 JFrame 中有两个 JPanel(其中包含 JTextFields)。第一个(上部)JPanel 有一个 3 行 2 列的网格。第二个(下部)JPanel 有一个 3 行 3 列的网格。我需要它们对齐,如下图所示(上方 JPanel 中的白色列表示空间;数字表示相对宽度)并且比例随着窗口大小的变化保持一致。

我的代码是下一个:

    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.border.TitledBorder;

    public class FrameWithTwoPanels {

        private GridBagConstraints constraints;
        private JFrame frame;

        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        FrameWithTwoPanels window = new FrameWithTwoPanels();
                        window.frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        public FrameWithTwoPanels() {
            initialize();
        }

        private void initialize() {
            frame = new JFrame();
            frame.setBounds(100, 100, 800, 800);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // Populate the frame with two Panels
            frame.setLayout(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();
            c.gridwidth = GridBagConstraints.REMAINDER;
            c.weightx = 1;
            c.fill = GridBagConstraints.HORIZONTAL;
            c.gridy = 0;
            // PANEL 1: 3 rows and 2 columns
            frame.add(this.createPanel(3, 2), c);
            // PANEL 2: 3 rows and 3 columns
            c.gridy = 1;
            frame.add(this.createPanel(3, 3), c);

            frame.pack();
            frame.setLocationRelativeTo(null);
        }

        private JPanel createPanel(int numrows, int numcols){
            JPanel panel = new JPanel();
            panel.setLayout(new GridBagLayout());
            constraints = new GridBagConstraints();
            //constraints.fill = GridBagConstraints.BOTH;
            for(int row=0; row<numrows; row++){

                for(int col =0; col<numcols; col++){

                    JTextField component = new JTextField(row + "-" + col);

                    if(col == 0){
                        constraints.weightx = 0.5;
                    }else if(col == 1){
                        constraints.weightx = 0.4;
                    }else if(col == 2){
                        constraints.weightx = 0.1;
                    }           
                    constraints.gridy = row;
                    constraints.gridx = col;
                    panel.add(component, constraints);

                    if(numcols == 2 && col == 1){   
                        // Add auxiliar panel
                        constraints.weightx = 0.1;
                        constraints.gridx = col + 1;
                        panel.add(new JLabel());
                    }
                }   
            }
            panel.setBorder(new TitledBorder("Number of columns: " + numcols));
            return panel;       
        }
    }

代码给出了屏幕截图所示的形式:

【问题讨论】:

  • 我假设图片是预期的结果,但我看不到实际的截图,可以吗?
  • 我刚刚编辑了包括实际截图在内的问题

标签: java gridbaglayout column-width


【解决方案1】:

在这种情况下,您实际上最好使用普通的 GridLayout。我认为以下代码可以满足您的要求:

private JPanel createPanel(int numrows, int numcols) {
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(numrows, 3));
    for (int row = 0; row < numrows; row++) {
        for (int col = 0; col < numcols; col++) {
            JTextField component = new JTextField(row + "-" + col);
            panel.add(component);
            if (numcols == 2 && col == 1) {
                JPanel spacer = new JPanel();
                panel.add(spacer);
            }
        }
    }
    panel.setBorder(new TitledBorder("Number of columns: " + numcols));
    return panel;
}

【讨论】:

  • 是否可以使用 GridLayout 为我们的列保持某些比例,例如 50%、40% 和 10%?
  • David:不,GridLayout 的特征/约束之一是每个单元格的大小相同。为了做 OP 想要的,我通常会等到整个窗口被打包/调整大小/等,然后查询实际大小并强制更改适当的单元格组件。重新验证将导致GridBagLayout 相应更新。这不是很好,但是对于我的目的来说,让每个单元格都相同会更糟。或者,放置一个不可见的间隔对象,这将迫使列增长,等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2016-10-01
  • 2013-12-28
  • 2011-06-29
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
相关资源
最近更新 更多