java – 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");
        }
    }
}

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...