Java JPanel消失时可调整大小的布局摆动
我有许多jPanel(panelF)被添加到其他jPanel(panelB)中。 jPanelF包含jPanelC。 我已将布局设置为添加它们,如下所示: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();
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之间的距离。谢谢