【问题标题】:Concatenating JPanels vertically while keeping their setPreferredSize() sizes垂直连接 JPanel,同时保持其 setPreferredSize() 大小
【发布时间】:2014-07-02 00:22:03
【问题描述】:

我想要一个串联的JPanels 的“列表”,其中每个单元格都有对应的JPanel 的大小。例如:

在本例中,Panel1 的 setPreferredSize 小于 Panel2 的 setPreferredSize。拼接 JPanel 的结果就是上图。

我想过做一个gridbaglayout,但我找不到一种方法来保持每个面板的setPreferredSize 的尺寸......现在我所拥有的是单元格之间的重量比......

    gridBagLayout = new GridBagLayout();
    gridBagLayout.columnWidths = new int[]{0, 0};
    gridBagLayout.rowHeights = new int[]{0, 0, 0};
    gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
    gridBagLayout.rowWeights = new double[]{1.0, 9.0, Double.MIN_VALUE};
    setLayout(gridBagLayout);

    p1 = new Panel1();
    p2 = new Panel2();      
    GridBagConstraints gbc_p1 = new GridBagConstraints();
    gbc_p1.insets = new Insets(0, 0, 0, 0);
    gbc_p1.fill = GridBagConstraints.BOTH;
    gbc_p1.gridx = 0;
    gbc_p1.gridy = 0;
    add(p1, gbc_p1);



    GridBagConstraints gbc_p2 = new GridBagConstraints();
    gbc_p2.fill = GridBagConstraints.BOTH;
    gbc_p2.gridx = 0;
    gbc_p2.gridy = 1;
    add(p2, gbc_p2);

【问题讨论】:

  • 我不清楚功能。您想要一个面板列表及其大小,并使用它沿一个方向以任意顺序连接任意数量的面板?
  • @user1803551 我只想垂直连接 JPanel 并保持其 setPreferredSize() 大小。我会改标题
  • 如果您不想影响组件的宽度或高度,请更改行/列权重或fill 属性并将GridBagConstraints gridwidth 属性设置为GridBagConstraints.REMAINDER。 ..或使用 SwingLab 的 SwingX 库中的 VerticalLayout...
  • @MadProgrammer 我应该将行/列权重或fill 更改为什么?我试图删除fill 行,但它似乎将我的面板调整为 10x10 像素的大小。当我删除 rowWeights / columnWeights 行时发生了同样的事情。
  • 但这不是您想要的吗?那是 GridBagLayout 尊重面板的首选尺寸

标签: java swing jpanel layout-manager gridbaglayout


【解决方案1】:

我只想垂直连接 JPanel 并保持它们的 setPreferredSize() 大小

GridBagLayout 将尊重组件的首选大小。

只是不要使用“填充”约束。

【讨论】:

    【解决方案2】:

    我对@9​​87654322@ 有一个建议,而不是旧的GridBaglayout

    public class PanelTower extends JFrame {
    
        int length = 4 ;
    
        public PanelTower() {
    
            JPanel towerPanel = new JPanel();
            towerPanel.setLayout(new BoxLayout(towerPanel, BoxLayout.Y_AXIS));
    
            JPanel[] panels = new JPanel[length];
            for (int i = 0; i < length; i++) {
                panels[i] = new JPanel();
                panels[i].setBackground(new Color((float)Math.random(), (float)Math.random(), (float)Math.random()));
                Dimension dims = new Dimension((i+1)*50, (i+1)*50);
                panels[i].setPreferredSize(dims);
                panels[i].setMinimumSize(dims);
                panels[i].setMaximumSize(dims);
                towerPanel.add(panels[i]);
            }
    
            add(towerPanel);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            pack();
            setVisible(true);
        }
    
        public static void main(String[] args) {
    
            new PanelTower();
        }
    }
    

    我不确定您的确切要求,但这应该很容易修改(我从您的示例中怀疑宽度是恒定的,只有高度会改变)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-19
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多