我有 6 个组合框使用相同的 DefaultListModel 和 6 个元素。我使用ActionListener,这样当其中一个组合框从另一个组合框选择的列表中选择一个元素时,它们会交换谁选择了这些元素。AKA 组合框 1(选择了元素 1)选择组合框 3 选择的元素 2,侦听器运行组合框 3 后,元素 3 将选择元素 1。
ActionListener abilCBListener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt){
JComboBox cb = (JComboBox)evt.getSource();
int ind = abilCBArray.indexOf(cb);
int num = 15;
int dup = 7;
if(abilCBArray.size() == 6 && abilCBBoo == true){
abilCBBoo = false;// prevents another combobox's listener from firing
for(int i = 0; i < abilCBArray.size();i++){
//System.out.println("i = " + i + " index = "+abilCBArray.get(i).getSelectedIndex());
if(i != ind){
num -= abilCBArray.get(i).getSelectedIndex();
System.out.println("i = "+ i+" num = "+ num+ " Index = "+abilCBArray.get(i).getSelectedIndex() );
if(abilCBArray.get(i).getSelectedIndex() == cb.getSelectedIndex()){
dup = i;
}
}
}
if(num < abilCBArray.size() && dup != 7){
abilCBArray.get(dup).setSelectedIndex(num);
}
}else{
System.out.println("Tried to run abilCBArrayChange without full array");
}
abilCBBoo = true;
}
};
问题是用户可以将一组随机数字放入 DefaultListModel,如果任何数字相同,组合框将选择该数字的第一个实例的索引,这会弄乱我的 ActionListener。 我读到的所有内容似乎都表明,您必须使列表中的每个项目都独一无二才能解决组合框选择问题,我仍然无法使用getSelectIndex(),因为如果我这样做,因为它仍然会返回数字的第一个实例。
@camickr
import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Vector;
public class TestDuplicatesItems {
private Vector<String> vec = new Vector<String>();
private String[] degrees = {"AAS1", "AAS2", "AAS1", "AAS1"};
private JComboBox combo = new JComboBox(vec);
private JComboBox combo1 = new JComboBox(degrees);
private JTextField txt = new JTextField(10);
private JFrame frame = new JFrame("JComboBox with Duplicates Items");
private JPanel panel = new JPanel();
public TestDuplicatesItems() {
vec.add("AAS1");
vec.add("AAS1");
vec.add("AAS1");
vec.add("AAS1");
//combo.setEditable(true);
//combo.setBackground(Color.gray);
//combo.setForeground(Color.red);
//combo.setEditable(true);
//combo1.setBackground(Color.gray);
//combo1.setForeground(Color.red);
txt.setText("1");
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(combo.getSelectedIndex());
System.out.println(combo.getSelectedItem().toString());
txt.setText(String.valueOf(combo.getSelectedIndex()));
}
});
combo1.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if ((e.getStateChange() == ItemEvent.SELECTED)) {
System.out.println(combo1.getSelectedIndex());
System.out.println(combo1.getSelectedItem().toString());
txt.setText(String.valueOf(combo1.getSelectedIndex()));
}
}
});
panel.add(combo);
panel.add(combo1);
panel.add(txt);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TestDuplicatesItems tdi = new TestDuplicatesItems();
}
});
}
}
并基于基元数组
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
public class SelectedComboBoxID {
private JComboBox combo = new JComboBox();
private JFrame frame = new JFrame("MyComboEg");
private JTextField txt = new JTextField(10);
private JPanel panel = new JPanel();
public SelectedComboBoxID() {
combo.addItem(new Item(1, "-"));
combo.addItem(new Item(2, "Snowboarding"));
combo.addItem(new Item(3, "Rowing"));
combo.addItem(new Item(4, "Knitting"));
combo.addItem(new Item(5, "Speed reading"));
combo.addItem(new Item(6, "Pool"));
combo.addItem(new Item(7, "None of the above"));
//comboBox.setMaximumRowCount(3);
combo.setPrototypeDisplayValue(" None of the above ");
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JComboBox comboBox = (JComboBox) e.getSource();
Item item = (Item) comboBox.getSelectedItem();
System.out.println(item.getId() + " : " + item.getDescription());
txt.setText(String.valueOf(combo.getSelectedIndex()));
}
});
//comboBox.setRenderer(new ItemRenderer());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.add(combo);
panel.add(txt);
frame.add(panel);
frame.pack();
//frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private class ItemRenderer extends BasicComboBoxRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value != null) {
Item item = (Item) value;
setText(item.getDescription().toUpperCase());
}
if (index == -1) {
Item item = (Item) value;
setText("" + item.getId());
}
return this;
}
}
private class Item {
private int id;
private String description;
public Item(int id, String description) {
this.id = id;
this.description = description;
}
public int getId() {
return id;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return description;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SelectedComboBoxID selectedComboBoxID = new SelectedComboBoxID();
}
});
}
}
你可以调用方法 getSelectedItem()。它将返回所选值。
JComboBox有一个底层的ComboBoxModel。您可以在其声明中设置其类型。
JComboBox<String> j = new JComboBox();
所以这个组合框使用字符串作为它的模型。当您想获取所选项目时,您可以调用:
j.getSelectedItem()
您将从中获得选定的字符串。如果您致电
j.getSelectedIndex()
您将在模型中获取所选字符串的索引,并且必须将其映射回来,以获取所选值。因此,getSelectedItem() 是继续操作的正确方法。
我有 6 个组合框使用相同的 DefaultListModel 和 6 个元素。
如果组合框共享同一模型,则当您在一个组合框中进行选择时,所有组合框都将使用相同的选择进行更新。
您需要创建 6 个不同的 DefaultListModels,每个模型都包含相同的数据。
,组合框将选择数字的第一个实例的索引
问题是"选择项"存储在组合框模型中,而不是所选项的索引中。
当您调用 'getSelectedIndex() 方法时,它会循环访问模型中的所有项,直到找到与所选对象相等的对象。
如果添加到模型的对象实现了 equals 方法,则这始终是找到的第一个对象。
因此,解决方案是创建一个要存储在模型中的自定义对象。
请参阅@mKorbel提供的答案。