4

我在其他 jPanel(panelB) 中添加了许多 jPanel (panelF)。jPanelF 包含 jPanelC。 在此处输入图像描述

我已设置布局以添加它们,如下所示:

    PanelB.setLayout(new BoxLayout(this.PanelB, BoxLayout.PAGE_AXIS));
    PanelF panelF1 = new PanelF(); 
    PanelB.add(panelF1);
    PanelF panelF2 = new PanelF(); 
    PanelB.add(panelF2);

我在 jPanelC1 中设置了可见的 false。但是 JPanelF2 保留了距离,不想留下那个空白

在此处输入图像描述 我想要的是当 JPanelC1 消失时。jPanelF 之间保持距离,而不是空白。我尝试了 validate() 并更改了布局,但失败了。会有什么办法?非常感谢。对不起我的英语不好

知道是否有类似 $("#panelC1").fadeOut("slow") 的东西吗?将是理想的。

4

3 回答 3

3

调用panelC1.setVisible(false)使panelC1不可见,但它不会更改get[Preferred|Maximum|Minimum]Size方法定义的几何图形。你可以

于 2013-10-03T00:42:25.747 回答
3

(这是垂直布局的演示,本身不是答案)。

根据我对您问题的理解,VerticalLayout可能是首选解决方案...

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
import org.jdesktop.swingx.VerticalLayout;

public class VerticalLayoutTest {

    public static void main(String[] args) {
        new VerticalLayoutTest();
    }

    public VerticalLayoutTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {

            setLayout(new VerticalLayout());

            JPanel outter = new JPanel(new BorderLayout());
            outter.setBorder(new LineBorder(Color.BLACK));
            outter.add(new JLabel("Outter 1"), BorderLayout.NORTH);
            JPanel inner = new JPanel(new GridBagLayout());
            inner.setBackground(Color.GREEN);
            inner.add(new JLabel("Inner 1"));
            outter.add(inner);
            add(outter);

            inner.addMouseListener(new MouseAdapter() {

                @Override
                public void mouseClicked(MouseEvent e) {
                    Component component = e.getComponent();
                    component.setVisible(false);
                    component.invalidate();
                    component.validate();
                    revalidate();
                    repaint();
                }

            });

            add(Box.createVerticalGlue());

            outter = new JPanel(new BorderLayout());
            outter.setBorder(new LineBorder(Color.BLACK));
            outter.add(new JLabel("Outter 1"), BorderLayout.NORTH);
            inner = new JPanel(new GridBagLayout());
            inner.setBackground(Color.GREEN);
            inner.add(new JLabel("Inner 1"));
            outter.add(inner);
            add(outter);

        }
    }
}
于 2013-10-03T00:47:38.363 回答
0

如果我理解正确,您希望 panelF1 在隐藏其中的面板时保持其大小。有几种方法可以做到这一点。根据您的布局设置方式,您可以调用setMinimumSize()panelF1 并确保其最小尺寸略大于 panelC1 的首选尺寸。

但是,一种更灵活(并且可能更合适)的方法是通过布局管理器本身。阅读有关 BoxLayout 的教程,如果它不符合您的要求,请尝试使用不同的布局管理器。两者GroupLayoutGridBagLayout都非常灵活,但它们也可能难以管理。我最近有点喜欢 MigLayout

编辑

好的,我想我误解了你的问题,因为图片和文字的布局是如何结束的。那实际上比我想象的要容易。查看我链接的 BoxLayout 教程 - 我认为您正在寻找的是:

PanelB.add(panelF1);
PanelB.add(Box.createVerticalGlue()):
PanelB.add(panelF2);
于 2013-10-02T23:55:54.597 回答