Java 固定JPanel大小

Java 固定JPanel大小,java,swing,jpanel,Java,Swing,Jpanel,我在一个对话框中有4个JPanel,它们使用GridBagLayout垂直排列。理想情况下,它们的长度应该相等 除了顶部的面板2外,其他一切都正常工作,其内容根据组合框所做的选择动态添加和删除,组合框也包含在同一面板中,且大小不固定。由于内容的性质,我也将GridBagLayout用于面板2本身,最初将面板的最小、最大和首选大小设置为内容的最大可能大小,并希望此面板保持此大小。但这不起作用,因为Panel2也会受到Panel1和Panel2内容的影响(它们的内容也会被添加和删除,但大小始终相同)

我在一个对话框中有4个JPanel,它们使用GridBagLayout垂直排列。理想情况下,它们的长度应该相等

除了顶部的面板2外,其他一切都正常工作,其内容根据组合框所做的选择动态添加和删除,组合框也包含在同一面板中,且大小不固定。由于内容的性质,我也将GridBagLayout用于面板2本身,最初将面板的最小、最大和首选大小设置为内容的最大可能大小,并希望此面板保持此大小。但这不起作用,因为Panel2也会受到Panel1和Panel2内容的影响(它们的内容也会被添加和删除,但大小始终相同)

有什么建议吗?想要添加面板的照片,但由于这里施加的奇怪限制,无法添加

好的,在查看了关于这个问题的评论之后,我将在这里添加一些代码片段

    JPanel dataPanel=new JPanel();
    dataPanel.setLayout(new GridBagLayout());
    final GridBagConstraints constraintAmpliaciones = new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
           GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0);

   //dataPanel.add(panelIdOrigen, constraintAmpliaciones);

   constraintAmpliaciones.gridy++;
   dataPanel.add(panel1,constraintAmpliaciones );

   constraintAmpliaciones.gridy++;
   dataPanel.add(panel2,constraintAmpliaciones);

   constraintAmpliaciones.gridy++;
   dataPanel.add(panel3, constraintAmpliaciones);

   constraintAmpliaciones.gridy++;
   dataPanel.add(panel4,constraintAmpliaciones);
其中,作为Panel2(有问题的一个)是这样的:

    void initComponents() {
        panelGeneral = new JPanel();
        panelGeneral.setLayout(new GridBagLayout());
        panelGeneral.add(panelLarger, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
                GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
        /**
         *  here for dimension,I have tried different sizes including the fixed size in pixels of panelLarger
         */
        Dimension dimension = new Dimension((int) panelGeneral.getPreferredSize().getWidth(), (int) panelGeneral.getPreferredSize().getHeight());
        panelGeneral.setMaximumSize(dimension);
        panelGeneral.setPreferredSize(dimension);
        panelGeneral.setMinimumSize(dimension);

        this.add(panelGeneral);

    }

    /**
     * is called upon combox selection
     */
    void updateComponents() {
        if (selection1) {
            panelGeneral.remove(panelLarger);
            panelGeneral.add(panelSmaller, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
                    GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));


        } else {
            panelGeneral.remove(panelSmaller);
            panelGeneral.add(panelLarger, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
                    GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));

        }
    }

我不确定我是否理解正确,但您可以尝试以下方法:

将Panel2中的一个JLabel放在Panel2中所有其他组件的下面(我假设Panel2在垂直方向上太小,因为它没有它可能包含的所有组件)。确保Jlabel文本设置为“”,以便用户看不到它

在此之后,您希望将JLabel的GridBagConstraints设置为fill=VERTICAL和weighty=1.0

当JLabel在面板2下方垂直扩展时,这应将所有其他组件推到面板2的顶部,并应保持面板的尺寸,防止其收缩。我想,如果您确切地知道每次图像的大小,您可以放入这样大小的JLabel,而不是垂直缩放


Swing可能很棘手,因为我看不到您的所有代码,但我经常在GUI中使用隐藏的JLabel,使面板也能按我的需要进行缩放。

可以使用可运行的代码示例:)为了更快地获得更好的帮助,请发布一个(最小、完整、可验证的示例)。”。并首先设置面板的最小、最大和首选大小“请参见(是)。”你已经成为会员五个月了!您可以更改您的用户名。Jaja@安德鲁·汤普森(Andrew Thompson)对我来说,MCVE一词比我所问的问题要抽象得多。我认为数据输入限制对数字机器更有效。我们人类更灵活,能力也更多样化。当然,如果我有理想的MCVE水平,那么我可能能够自己解决这个问题。论坛的目的应该是让人们用不同的方式做事,一个人可以用更好的方式做事,而另一个人可能不遵守你的解决方案,除非我在表格的第一列没有一个组合框。在第二组中,我有两件事。第1列的组合框和panelGeneral,如代码段所示。现在,panelGeneral本身的内容会根据使用组合框所做的选择而动态更改。如果我不想固定Panel2的大小,Panel2内的每件事都可以,因为它的大小根据其组件而缩小和增大,但这是不可取的,因为Panel2是4个Panels行的一部分,这4个Panels(包括Panel2)中的任何一个的大小都会受到干扰。