SetVisible(false)更改我的Panel中组件的布局

当我将其中一个子面板设置为不可见时,如何使主面板中的子面板保持原样?

我看起来像:

[ (Panel1) (Panel2) (Panel3) (Panel4) ] 

当我执行panel3.setVisible(false)它看起来像:

 [ (Panel1) (Panel2) (Panel4) ] 

我希望它看起来像:

 [ (Panel1) (Panel2) (Panel4) ] 

我正在使用GridBagLayout,我的mainPanel声明如下所示:

 final JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); 

我添加了一个新的面板,如:

 final JTextField valueTextField = new JTextField(); valueTextField.setPreferredSize(new Dimension(80, 25)); valueTextField.setName("Value"); c.gridx =0; panel.add(valueTextField, c); 

如果需要,我会提供更多代码,我不关心我使用哪种布局,只要它能得到我想要的东西。

我建议在单个单元格中使用CardLayout ,而不是将其设置为不可见,而是切换到空面板。

下面的代码演示了这一点。 在hidePanel() ,有两个选项可以隐藏当前启用了CardLayout路径的单元格。

 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class InvisiblePanels { public static void main(String... args) throws Exception { JFrame frame = new JFrame(); frame.setLayout(new GridBagLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GridBagConstraints c = new GridBagConstraints(); c.gridx = 0; frame.add(new MyPanel(), c); c.gridx = 1; frame.add(new MyPanel(), c); c.gridx = 2; frame.add(new MyPanel(), c); frame.pack(); frame.setVisible(true); } private static class MyPanel extends JPanel { CardLayout layout; public MyPanel() { layout = new CardLayout(); setLayout(layout); JButton button = new JButton("Click me"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { hidePanel(); } }); add(button, "visible"); add(new JPanel(), "invisible"); layout.show(this, "visible"); } public void hidePanel() { // setVisible(false); layout.show(this, "invisible"); } } } 

我相信所有布局管理器都尊重组件的可见性,并且不包括首选大小和布局计算中的不可见组件。

一种解决方案可能是使用OverlayLayout将所有面板包裹在面板中:

 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class OverlayLayoutInvisible { public static void main(String[] args) { JPanel panel = new JPanel(); panel.add( createPanel("Button 1") ); panel.add( createPanel("Button 2") ); panel.add( createPanel("Button 3") ); panel.add( createPanel("Button 4") ); panel.add( createPanel("Button 5") ); JFrame frame = new JFrame(); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); frame.add( panel ); frame.pack(); frame.setLocationRelativeTo( null ); frame.setVisible(true); } public static JPanel createPanel(String text) { JButton button = new JButton( text ); button.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { Component c = (Component)e.getSource(); c.setVisible(false); } }); InvisibleComponent ic = new InvisibleComponent( button ); JPanel panel = new JPanel(); panel.setLayout( new OverlayLayout(panel) ); panel.add( ic ); panel.add( button ); return panel; } public static class InvisibleComponent extends JComponent { private Component master; public InvisibleComponent(Component master) { this.master = master; setAlignmentX( master.getAlignmentX() ); setAlignmentY( master.getAlignmentY() ); } public Dimension getPreferredSize() { return master.getPreferredSize(); } } } 

你可能能够调整GridLayout(你有SSCCE吗?)

除此以外:

将Panel3和Panel4放在一起添加到GridBagLayout的面板中。 然后在一个布局中设置新面板,如FlowLayout(左边用首选大小对齐),BorderLayout,GridLayout等。