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

Java 使用带有JCheckBox的itemListener显示/隐藏JTextField,java,jtextfield,jcheckbox,itemlistener,Java,Jtextfield,Jcheckbox,Itemlistener,我正在尝试创建一个应用程序,允许用户在JCheckbox中选择保险选项。对于选定的每个选项,名称和价格应显示在文本字段中。我的问题是,即使我选择它,它也不会显示名称和价格。目前,我只是想让HMO复选框起作用 package p3s4; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class JInsurance extends JFrame implements ItemListener {

我正在尝试创建一个应用程序,允许用户在JCheckbox中选择保险选项。对于选定的每个选项,名称和价格应显示在文本字段中。我的问题是,即使我选择它,它也不会显示名称和价格。目前,我只是想让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);
}
}

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

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

类似的问题(和答案)可以在

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

hmoSelection.getParent().revalidate();
API文档用于:

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

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

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


如果在方法itemStateChange()中设置了断点,是否正在调用该方法?不,我不这样认为。仅供参考,组件类中没有名为getParentContainer()的方法。不过,我感谢你的解释!!另外,我不想调用repaint()并通过调用update(graphics)实现need@Lalit拉奥,谢谢。引用自己的话:
您需要在添加组件后调用revalidate并重新绘制,然后组件才会显示在您的容器中。
我完全同意您的观点,mate,但在Eleyna的情况下,组件(JTextField hmoSelection)已经在构造函数中初始化。因此,只需调用revalidate()就可以了。这段代码是我自己调试的。如果Eleyna尝试动态添加textfield,情况会有所不同。谢谢!JTextField现在可以工作了,问题是它仍然没有显示名称和价格。如果我把它写成一个字符串,它就可以工作,但是如果我试图将字符串与hmo变量或hmo_价格常量连接起来,它就不会工作。我不确定这样做是否可行。尝试替换
JTextField hmoSelection=newjtextfield(hmo+“”+hmo_价格)
to
JTextField hmoSelection=newjtextfield(hmo.getName()+“”+hmo_PRICE)
你帮了我很大的忙。谢谢大家!@Eleyna还尝试添加
Dimension dim=Toolkit.getDefaultToolkit().getScreenSize();first.setLocation(dim.width/2-first.getSize().width/2,dim.height/2-first.getSize().height/2)位于主()的末尾。这将有助于您的框架在屏幕中央打开。