SetVisible(false)更改面板中组件的布局

|| 将子面板之一设置为不可见时,如何使主面板中的子面板保持原样? 我长什么样:
[ (Panel1) (Panel2) (Panel3) (Panel4) ]
当我做“ 1”时,它看起来像:
[      (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);
如果需要,我将提供更多代码,并且我不在乎我使用哪种布局,只要它可以让我得到所需的内容即可。     
已邀请:
我建议在各个单元格中使用“ 6”,而不是将其设置为不可见,而是切换到空白面板。 下面的代码演示了这一点。在
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等布局。     

要回复问题请先登录注册