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等。