Je veux définir l'index sélectionné dans une JComboBox par la valeur et non par l'index. Comment faire ça? Exemple
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");
Ok, j'ai un peu modifié ma question. J'ai oublié que j'ai un élément personnalisé dans ma JComboBox qui le rend un peu plus difficile. je ne peux pas faire setSelectedItem car j'ai un ComboItem à l'intérieur de chaque élément. Alors, comment puis-je faire cela?
setSelectedItem("banana")
. Vous auriez pu le trouver vous-même en lisant simplement le javadoc .
Edit: puisque vous avez changé la question, je vais changer ma réponse.
Si vous souhaitez sélectionner l'article portant le label "banane", vous avez alors deux solutions:
setSelectedItem(theFoundItem)
(ou setSelectedIndex(theFoundIndex)
)equals
et hashCode
dans ComboItem
afin que deux instances de ComboItem
portant le même nom soient égales, et utilisez simplement setSelectedItem(new ComboItem(anyNumber, "banana"))
;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;
}
}
}
J'espère que cette aide :)
Vous devez utiliser le modèle
comboBox.getModel().setSelectedItem(object);
Pourquoi ne pas prendre une collection, probablement une carte telle qu'un HashMap, et l'utiliser comme noyau de votre propre classe de modèle de zone de liste déroulante qui implémente l'interface ComboBoxModel? Ensuite, vous pouvez accéder facilement aux éléments de votre zone de liste déroulante via leurs chaînes de clés plutôt que leurs entiers.
Par exemple...
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
}
par exemple
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();
}
});
}
}
test.setSelectedItem("banana");
Il y a quelques mises en garde ou un comportement potentiellement inattendu, comme expliqué dans le javadoc. Assurez-vous de lire cela.
La bonne façon de définir un élément sélectionné lorsque la zone de liste déroulante est remplie par un constructeur de classe (comme @milosz a posté):
combobox.getModel().setSelectedItem(new ClassName(parameter1, parameter2));
Dans votre cas, le code serait:
test.getModel().setSelectedItem(new ComboItem(3, "banana"));
Appelez simplement comboBox.updateUI()
après avoir fait comboBox.setSelectedItem
ou comboBox.setSelectedIndex
ou comboModel.setSelectedItem
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;
}