使用带有JCheckBox的itemListener来显示/隐藏JTextField

时间:2015-05-06 20:01:07

标签: java jtextfield jcheckbox itemlistener

我正在尝试创建一个允许用户在JCheckBoxes中选择保险选项的应用程序。对于所选的每个选项,名称和价格应显示在文本字段中。我的问题是,即使我选择它,它也不显示名称&价钱。目前我只是想让HMO复选框工作。

package p3s4;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JInsurance extends JFrame implements ItemListener
{       
        FlowLayout flow = new FlowLayout();
        final double HMO_PRICE = 200;
        final double PPO_PRICE = 600;
        final double DENTAL_PRICE = 75;
        final double VISION_PRICE = 20;
        JLabel heading = new JLabel("Choose insurance options: ");
        JCheckBox hmo = new JCheckBox("HMO");
        JCheckBox ppo = new JCheckBox("PPO");
        ButtonGroup providersGroup = new ButtonGroup();
        JCheckBox dental = new JCheckBox("Dental");
        JCheckBox vision = new JCheckBox("Vision");
        JTextField hmoSelection = new JTextField(hmo + " " + HMO_PRICE);
public JInsurance()
{
    super("Insurance Options");

    setLayout(flow);
    add(heading);
    providersGroup.add(hmo);
    providersGroup.add(ppo);
    add(hmo);
    add(ppo);
    add(dental);
    add(hmoSelection);
    hmoSelection.setVisible(false);
    add(vision);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    hmo.addItemListener(this);
}
public void itemStateChanged(ItemEvent event)
{
    if(event.getStateChange() == ItemEvent.SELECTED)
    {
            hmoSelection.setVisible(true);
    }    
    else
        hmoSelection.setVisible(false);
}
public static void main(String[] args) 
{
    JInsurance first = new JInsurance();
    final int WIDTH = 400;
    final int HEIGHT = 300;
    first.setSize(WIDTH, HEIGHT);
    first.setVisible(true);
}
}

2 个答案:

答案 0 :(得分:2)

在if块中添加以下代码,它将按预期工作

hmoSelection.getParent().revalidate();

revalidate的API文档:

  

将组件层次结构重新验证到最近的验证根目录。

     

此方法首先使从此组件开始的组件层次结构无效,直至最近的验证根。然后,从最近的验证根开始验证组件层次结构。

     

这是一种方便的方法,可以帮助应用程序开发人员避免手动查找验证根。基本上,它相当于首先在此组件上调用invalidate()方法,然后在最近的验证根上调用validate()方法。

答案 1 :(得分:1)

如果您在已经可见的UI中添加或删除某些内容,则必须在父容器上调用revalidaterepaint

hmoSelection.setVisible(true);
hmoSelection.getParent().revalidate();
//above revalidate method was introduced to Container in 1.7, call validate for earlier versions
hmoSelection.repaint();

可以在After calling setVisible(false) my JFrame contents are gone when calling set Visible(true)

找到类似的问题(和答案)