Как установить выбранный индекс JComboBox по значению
Я хочу установить выбранный индекс в JComboBox по значению, а не по индексу. Как это сделать? Пример
public class ComboItem {
private String value;
private String label;
public ComboItem(String value, String label) {
this.value = value;
this.label = label;
}
public String getValue() {
return this.value;
}
public String getLabel() {
return this.label;
}
@Override
public String toString() {
return label;
}
}
JComboBox test = new JComboBox();
test.addItem(new ComboItem(0, "orange"));
test.addItem(new ComboItem(1, "pear"));
test.addItem(new ComboItem(2, "apple"));
test.addItem(new ComboItem(3, "banana"));
test.setSelectedItem("banana");
Хорошо, я немного изменил свой вопрос. Я забыл, что у меня есть пользовательский элемент внутри моего JComboBox, что делает его немного сложнее. я can not do setSelectedItem, поскольку у меня есть ComboItem внутри каждого элемента. Итак, как это сделать?
Ответы
Ответ 1
setSelectedItem("banana")
. Вы могли бы найти его сами, просто прочитав javadoc.
Изменить: поскольку вы изменили вопрос, я изменю свой ответ.
Если вы хотите выбрать элемент с меткой "banana", у вас есть два решения:
- Перебирайте элементы, чтобы найти один (или индекс одного), который имеет данную метку, а затем вызовите
setSelectedItem(theFoundItem)
(или setSelectedIndex(theFoundIndex)
)
- Переопределить
equals
и hashCode
в ComboItem
, чтобы два экземпляра ComboItem
с одинаковым именем были равны и просто использовали setSelectedItem(new ComboItem(anyNumber, "banana"))
;
Ответ 2
public static void setSelectedValue(JComboBox comboBox, int value)
{
ComboItem item;
for (int i = 0; i < comboBox.getItemCount(); i++)
{
item = (ComboItem)comboBox.getItemAt(i);
if (item.getValue().equalsIgnoreCase(value))
{
comboBox.setSelectedIndex(i);
break;
}
}
}
Надеюсь, что эта помощь:)
Ответ 3
Вы должны использовать модель
comboBox.getModel().setSelectedItem(object);
Ответ 4
Почему бы не взять коллекцию, скорее всего, такую Карту, как HashMap, и использовать ее в качестве ядра вашего собственного класса классов со списком, который реализует интерфейс ComboBoxModel? Затем вы можете легко получить доступ к своим элементам со списком через свои ключевые строки, а не int.
Например...
import java.util.HashMap;
import java.util.Map;
import javax.swing.ComboBoxModel;
import javax.swing.event.ListDataListener;
public class MyComboModel<K, V> implements ComboBoxModel {
private Map<K, V> nucleus = new HashMap<K, V>();
// ... any constructors that you want would go here
public void put(K key, V value) {
nucleus.put(key, value);
}
public V get(K key) {
return nucleus.get(key);
}
@Override
public void addListDataListener(ListDataListener arg0) {
// TODO Auto-generated method stub
}
// ... plus all the other methods required by the interface
}
Ответ 5
например
![enter image description here]()
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class ComboboxExample {
private JFrame frame = new JFrame("Test");
private JComboBox comboBox = new JComboBox();
public ComboboxExample() {
createGui();
}
private void createGui() {
comboBox.addItem("One");
comboBox.addItem("Two");
comboBox.addItem("Three");
JButton button = new JButton("Show Selected");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(frame, "Selected item: " + comboBox.getSelectedItem());
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
comboBox.requestFocus();
comboBox.requestFocusInWindow();
}
});
}
});
JButton button1 = new JButton("Append Items");
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
appendCbItem();
}
});
JButton button2 = new JButton("Reduce Items");
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
reduceCbItem();
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(4, 1));
frame.add(comboBox);
frame.add(button);
frame.add(button1);
frame.add(button2);
frame.setLocation(200, 200);
frame.pack();
frame.setVisible(true);
selectFirstItem();
}
public void appendCbItem() {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
comboBox.addItem("Four");
comboBox.addItem("Five");
comboBox.addItem("Six");
comboBox.setSelectedItem("Six");
requestCbFocus();
}
});
}
public void reduceCbItem() {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
comboBox.removeItem("Four");
comboBox.removeItem("Five");
comboBox.removeItem("Six");
selectFirstItem();
}
});
}
public void selectFirstItem() {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
comboBox.setSelectedIndex(0);
requestCbFocus();
}
});
}
public void requestCbFocus() {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
comboBox.requestFocus();
comboBox.requestFocusInWindow();
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ComboboxExample comboboxExample = new ComboboxExample();
}
});
}
}
Ответ 6
http://docs.oracle.com/javase/6/docs/api/javax/swing/JComboBox.html#setSelectedItem(java.lang.Object)
test.setSelectedItem("banana");
Есть некоторые предостережения или потенциально неожиданное поведение, как объяснено в javadoc. Обязательно прочтите это.
Ответ 7
Правильный способ установки элемента, выбранного, когда combobox заполняется некоторым конструктором класса (как опубликовано @milosz):
combobox.getModel().setSelectedItem(new ClassName(parameter1, parameter2));
В вашем случае код будет выглядеть следующим образом:
test.getModel().setSelectedItem(new ComboItem(3, "banana"));
Ответ 8
Просто вызовите comboBox.updateUI()
после выполнения comboBox.setSelectedItem
или comboBox.setSelectedIndex
или comboModel.setSelectedItem
Ответ 9
public boolean preencherjTextCombox (){
int x = Integer.parseInt(TableModelo.getModel().getValueAt(TableModelo.getSelectedRow(),0).toString());
modeloobj = modelosDAO.pesquisar(x);
Combmarcass.getModel().setSelectedItem(modeloobj.getMarca());
txtCodigo.setText(String.valueOf(modeloobj.getCodigo()));
txtDescricao.setText(String.valueOf(modeloobj.getDescricao()));
txtPotencia.setText(String.valueOf(modeloobj.getPotencia()));
return true;
}