我正在尝试使用复选框切换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);
}
});
答案 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);
}
}