Java JPanel消失时可调整大小的布局摆动

Java JPanel消失时可调整大小的布局摆动,java,swing,layout,jpanel,Java,Swing,Layout,Jpanel,我有许多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();

我有许多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之间保持距离,而不是空白。 我试图验证()并更改布局,但失败了。怎么办? 非常感谢你。对不起,我的英语不好


知道有没有像$(“#panelC1”).淡出(“慢”)这样的东西吗?非常理想。

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

不过,更灵活(可能更合适)的方法是通过布局管理器本身。阅读,如果它没有达到您想要的效果,请尝试使用其他布局管理器。
GroupLayout
gridbagloayout
都非常灵活,但也很难管理。我最近有点喜欢上了

编辑

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

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

调用
panelC1.setVisible(false)
会使
panelC1
不可见,但不会更改方法定义的几何体。你可以

  • 重写定义方法,如中所示

  • 如图所示,从封闭的
    panelF1
    中移除
    panelC1
    ,并在其再次可见时将其恢复

  • 使用非
    框的布局

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

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


      我想这就是
      BoxLayout
      的工作原理……就我个人而言,我会尝试使用SwingX中的
      VerticalLayout
      ,那么布局应该使用什么呢?我考虑使用一个列表,因为没有根据您描述的内容进行任何布局,
      VerticalLayout
      可以实现您想要的。它以“列表”(本质上)的形式布置组件,因此它们被锚定到父容器的顶部。它依赖于组件的首选高度,因此当您隐藏子组件时,布局会反映这些更改…非常感谢您的帮助,但我失败了。我已经导入了import org.jdesktop.swingx.VerticalLayout,我添加了布局面板b.setLayout(新的VerticalLayout())。即使我验证了()以消除PanelC1No,我也希望减小JPanelF1和JPanelF1之间的距离。谢谢