我正在尝试创建一个允许用户在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);
}
}
答案 0 :(得分:2)
在if块中添加以下代码,它将按预期工作
hmoSelection.getParent().revalidate();
revalidate的API文档:
将组件层次结构重新验证到最近的验证根目录。
此方法首先使从此组件开始的组件层次结构无效,直至最近的验证根。然后,从最近的验证根开始验证组件层次结构。
这是一种方便的方法,可以帮助应用程序开发人员避免手动查找验证根。基本上,它相当于首先在此组件上调用invalidate()方法,然后在最近的验证根上调用validate()方法。
答案 1 :(得分:1)
如果您在已经可见的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();
可以在After calling setVisible(false) my JFrame contents are gone when calling set Visible(true)
找到类似的问题(和答案)