繁体   English   中英

切换JComponent Swing的可见性

[英]Toggle visibility of a JComponent 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);
            }
        });

尝试使用ActionListener而不是MouseListener

checkBox.addActionListener(new ActionListener() {

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

- 编辑 -

call panel_3.revalidate(); 改变其可见度后。

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

使用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遵循命名约定,仅对常量使用下划线。

考虑调用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);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM