【问题标题】:resizable layout swing when disappears JPanelJPanel 消失时可调整大小的布局摆动
【发布时间】:2013-10-09 12:38:03
【问题描述】:

我有很多 jPanel (panelF) 添加到其他 jPanel(panelB) 中。 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 中设置了 visible false。但是 JPanelF2 保留了距离,不想留下那个空白

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

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

【问题讨论】:

  • 我认为这就是BoxLayout 的工作原理...
  • 就个人而言,我会尝试使用来自 SwingX 的VerticalLayout
  • 那个布局应该使用呢?我正在考虑使用列表,因为没有任何布局
  • 根据你所描述的,VerticalLayout可以实现你想要的。它将组件布置为“列表”(本质上),因此它们锚定在父容器的顶部。它依赖于组件的首选高度,因此当您隐藏子组件时,布局会反映这些更改...
  • 非常感谢您的帮助,但我失败了。我已经导入了import org.jdesktop.swingx.VerticalLayout,我添加了布局PanelB.setLayout(new VerticalLayout())。甚至我确实验证了()以消失 PanelC1

标签: java swing layout jpanel


【解决方案1】:

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

根据我对您问题的理解,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);

        }
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      编辑

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

      PanelB.add(panelF1);
      PanelB.add(Box.createVerticalGlue()):
      PanelB.add(panelF2);
      

      【讨论】:

      • 不,我想减小 JPanelF1 和 JPanelF1 之间的距离。谢谢
      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2012-07-12
      • 2023-02-26
      • 1970-01-01
      相关资源
      最近更新 更多