切换JComponent Swing的可见性

时间:2014-05-04 14:26:52

标签: java swing

我正在尝试使用复选框切换JTextField的可见性。如果选中该复选框,我希望显示JTextField,反之亦然。我的程序运行正常,直到我添加初始化JTextField的行在开始时不可见。如果我删除这个细分市场工作正常!你能救我吗?

final JCheckBox chckbxNewCheckBox_1 = new JCheckBox("New Folder");
        panel_3.add(chckbxNewCheckBox_1);

        final JTextField textField_3 = new JTextField();
        panel_3.add(textField_3);

        textField_3.setColumns(20);
        //textField_3.setVisible(false); if a comment it in.. it never becomes visible

        chckbxNewCheckBox_1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                if(chckbxNewCheckBox_1.isSelected()){
                    textField_3.setVisible(true);
                }
                else 
                    textField_3.setVisible(false);
            }
        });

4 个答案:

答案 0 :(得分:2)

尝试使用ActionListener代替MouseListener

checkBox.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        textField_3.setVisible(checkBox.isSelected());
    }
});

- 编辑 -

在更改其可见性后调用panel_3.revalidate();

答案 1 :(得分:1)

当一个元素在容器初始化期间不可见时,它永远不会初始化它的维度。将文本区域设置为可见后,您可以在文本区域调用getWidth()getHeight()进行检查。他们都是零。因此,在更改元素可见性后,请关注@Braj编辑并调用panel.revalidate(),让布局管理员知道是时候重新定位/重新计算某些元素并给它们适当的大小。

答案 2 :(得分:0)

您可以使用ItemListener

做得更好
chckbxNewCheckBox_1.addItemListener(new ItemListener() {

    @Override
    public void itemStateChanged(ItemEvent e) {

        if (e.getStateChange() == ItemEvent.DESELECTED))
            textField_3.setVisible(false);
        else if (e.getStateChange() == ItemEvent.SELECTED))
            textField_3.setVisible(true);
        textField_3.revalidate();
    }
});

注意:pelase遵循命名约定,仅对常量使用下划线。

答案 3 :(得分:-1)

考虑调用pack()方法

以下是我试验过的完整代码:

import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Test {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout());

        final JCheckBox chckbxNewCheckBox_1 = new JCheckBox("New Folder");
        final JPanel panel_3 = new JPanel();
        frame.add(panel_3);

        panel_3.add(chckbxNewCheckBox_1);

        final JTextField textField_3 = new JTextField();
        panel_3.add(textField_3);

        textField_3.setColumns(20);
        textField_3.setVisible(false); //if a comment it in.. it never becomes visible

        chckbxNewCheckBox_1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                if (chckbxNewCheckBox_1.isSelected()) {
                    textField_3.setVisible(true);
                } else
                    textField_3.setVisible(false);

                frame.pack();
            }
        });

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}