JPanel意外调整大小

时间:2017-11-01 12:48:02

标签: java swing

我正面临着JPanel如何根据其拥有的组件数量自行调整大小的问题。这里总结了上下文:

  1. 有一个容器面板,有GridBagLayout,有2列和1行。列的权重分别为0.0和1.0,而行的权重为1.0(第二列应占用父项的所有额外区域)。两个组件的填充标准是" BOTH"。
  2. 作为行中的第二个组件,添加了一个包含内容面板的JScrollPane。这个小组可以有不同数量的孩子。但是,它应该只是水平增长,而不是垂直增长(子项在第二个面板中分别作为新列添加)。
  3. 但是,当子面板的大小增加超出父级的大小时,它会占用 5像素的空间垂直,这不应该是发生。两种情况的屏幕截图如下:
  4. enter image description here

    enter image description here

    第一种情况下,包含条形图的面板大小 310 ,而在第二种情况下, 315 。这个,当两个案例中唯一改变的是栏数时,它们作为单独的列添加到内容面板中。

    有人能指点我如何调试这个问题吗?我应该在哪里看?在我看来,小组所采取的额外垂直空间是没有根据的,但我没理由。

    代码的相关部分如下:

            GridBagLayout gridBagLayout = new GridBagLayout();
            gridBagLayout.columnWidths = new int[]{0};
            gridBagLayout.rowHeights = new int[]{0, 0};
            gridBagLayout.columnWeights = new double[]{0.0, 1.0};
            gridBagLayout.rowWeights = new double[]{1.0};
            setLayout(gridBagLayout);
    
            YAxis yAxis = new YAxis(start, end);
            GridBagConstraints gbc_yAxis = new GridBagConstraints();
            gbc_yAxis.gridx = 0;
            gbc_yAxis.gridy = 0;
            gbc_yAxis.fill = GridBagConstraints.BOTH;
            add(yAxis, gbc_yAxis);
            JPanel chartsContainer = new JPanel() {
                public void paint(Graphics g) {
                    super.paint(g);
        //              System.out.println(getSize());
                }
            };
            chartsContainer.setOpaque(false);
            GridBagLayout gbl_chartsContainer = new GridBagLayout();
            int[] colWidths = new int[statsToDisplay.size() + 1];
            Arrays.fill(colWidths, 25);
            colWidths[colWidths.length-1] = 0;
            gbl_chartsContainer.columnWidths = colWidths;
            double[] colWeights = new double[statsToDisplay.size()+1];
            Arrays.fill(colWeights, 0);
            colWeights[colWeights.length-1] = 1.0;
            gbl_chartsContainer.rowHeights = new int[] {50};
            gbl_chartsContainer.columnWeights = colWeights;
            gbl_chartsContainer.rowWeights = new double[]{1.0};
            chartsContainer.setLayout(gbl_chartsContainer);
    
                /* Code to fill chartsContainer goes here */
    
            JScrollPane chartScrollPane = new JScrollPane(chartsContainer);
            chartScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
            chartScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
            GridBagConstraints gbc_chartScrollPane = new GridBagConstraints();
            gbc_chartScrollPane.fill = GridBagConstraints.BOTH;
            gbc_chartScrollPane.gridx = 1;
            gbc_chartScrollPane.gridy = 0;
            add(chartScrollPane, gbc_chartScrollPane);
    

0 个答案:

没有答案