Possible Duplicate:
Dynamic JComboBoxes
how to control a combo box by using another combo box swing
// model drop-down
final JComboBox modelName = new JComboBox();
modelName.addItem("Choose One...");
modelName.addItem("Hypercom");
modelName.addItem("Deja Voo");
modelName.addItem("Nurit");
modelName.addItem("Verifone");
int modelIndex = modelName.getSelectedIndex();
modelPanel.add(modelName);
我在下面尝试做的是根据在第一个comboBox中选择的内容来更改第二个comboBox的选项,但是并没有这样做。无论我在顶部的comboBox中选择了什么,第二个选项都不会改变……我缺少什么?
// Terminal Panel (within Panel1)
JPanel termPanel = new P(15);
termPanel.setBackground(Color.WHITE);
panel1.add(termPanel);
final JComboBox termName = new JComboBox();
if (modelIndex == 1) {
termName.addItem("Choose One...");
termName.addItem("T7Plus");
termName.addItem("4205");
termName.addItem("4210");
termName.addItem("4220");
} else if (modelIndex == 2) {
termName.addItem("Choose One...");
termName.addItem("M-3");
termName.addItem("X-5");
termName.addItem("X-8");
termName.addItem("V Series");
} else if (modelIndex == 3) {
termName.addItem("Choose One...");
termName.addItem("2085");
termName.addItem("3020/8320");
termName.addItem("8400");
termName.addItem("8000/8020");
} else if (modelIndex == 4) {
termName.addItem("Choose One...");
termName.addItem("37 Dial");
termName.addItem("37 IP");
termName.addItem("VX Dial");
termName.addItem("VX IP");
} else {
termName.addItem("Select Model Above");
}
termName.getSelectedIndex();
termPanel.add(termName);
更新
我更新了代码,但是现在我遇到了nullPoint Exception Error ...这是它的位置:
final DefaultComboBoxModel termModel = new DefaultComboBoxModel(new String[]{"Choose One...", "Hypercom", "DejaVoo", "Nurit", "Verifone"});
...
// model drop-down
modelName.setModel(termModel); // NULLPOINT EXCEPTION HERE
modelName.addActionListener (new ActionListener () {
public void actionPerformed(ActionEvent e) {
if ("Hypercom".equals(modelName.getSelectedItem())){
termName.setModel(hSpecModel);
} else if ("Deja Voo".equals(modelName.getSelectedItem())){
termName.setModel(dSpecModel);
} else if ("Nurit".equals(modelName.getSelectedItem())){
termName.setModel(nSpecModel);
} else if ("Verifone".equals(modelName.getSelectedItem())){
termName.setModel(vSpecModel);
} else {
termName.setModel(slctAbove);
}
}
});
modelPanel.add(modelName);
最佳答案
您应该添加能够更改第二个JComboBox内容的ActionListener
。另外,您应该考虑在Map中链接模型名称和术语名称。请看我的例子:
class TwoComboboxFrame extends JFrame {
private static final long serialVersionUID = 1L;
private Map<String, List<String>> modelNameTermName = new LinkedHashMap<String, List<String>>();
private JComboBox<String> termNameComboBox;
public TwoComboboxFrame() {
init();
buildDataModel();
JPanel panel = createAndAddPanel();
buildModelNameComboBox(panel);
buildTermNameComboBox(panel);
}
private void buildTermNameComboBox(JPanel panel) {
termNameComboBox = new JComboBox<String>();
termNameComboBox.addItem("Select Model Above");
panel.add(termNameComboBox);
}
private void buildModelNameComboBox(JPanel panel) {
JComboBox<String> modelName = new JComboBox<String>();
modelName.addItem("Choose One...");
for (String value : modelNameTermName.keySet()) {
modelName.addItem(value);
}
panel.add(modelName);
modelName.addActionListener(new ActionListener() {
@SuppressWarnings("unchecked")
@Override
public void actionPerformed(ActionEvent e) {
JComboBox<String> source = (JComboBox<String>) e.getSource();
String selectedValue = source.getSelectedItem().toString();
List<String> termNames = modelNameTermName.get(selectedValue);
termNameComboBox.removeAllItems();
if (termNames == null) {
termNameComboBox.addItem("Select Model Above");
} else {
termNameComboBox.addItem("Choose One...");
for (String name : termNames) {
termNameComboBox.addItem(name);
}
}
}
});
}
private void buildDataModel() {
modelNameTermName.put("Hypercom",
Arrays.asList("T7Plus", "4205", "4210", "4220"));
modelNameTermName.put("Deja Voo",
Arrays.asList("M-3", "X-5", "X-8", "V Series"));
//Add other data
}
private void init() {
setTitle("Two comboboxex");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
}
private JPanel createAndAddPanel() {
JPanel panel = new JPanel(true);
panel.setLayout(new GridLayout(1, 2));
add(panel);
return panel;
}
}
用法示例:
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TwoComboboxFrame ex = new TwoComboboxFrame();
ex.setVisible(true);
}
});
}