Java 使用带有JCheckBox的itemListener显示/隐藏JTextField
我正在尝试创建一个应用程序,允许用户在JCheckbox中选择保险选项。对于选定的每个选项,名称和价格应显示在文本字段中。我的问题是,即使我选择它,它也不会显示名称和价格。目前,我只是想让HMO复选框起作用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 {
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_价格)
toJTextField 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)代码>位于主()的末尾。这将有助于您的框架在屏幕中央打开。