web-dev-qa-db-fra.com

Comment définir l'index sélectionné JComboBox par valeur

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?

25
Arto Uusikangas

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:

  1. Parcourez les éléments pour trouver celui (ou l'index de celui) qui a le libellé donné, puis appelez setSelectedItem(theFoundItem) (ou setSelectedIndex(theFoundIndex))
  2. Remplacez 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"));
39
JB Nizet
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 :)

14
Squall Leonhart

Vous devez utiliser le modèle

comboBox.getModel().setSelectedItem(object);
11
milosz

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

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();
            }
        });
    }
}
4
mKorbel

http://docs.Oracle.com/javase/6/docs/api/javax/swing/JComboBox.html#setSelectedItem (Java.lang.Object )

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.

3
Harrison F

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"));
2
JairKaulitz89

Appelez simplement comboBox.updateUI() après avoir fait comboBox.setSelectedItem ou comboBox.setSelectedIndex ou comboModel.setSelectedItem

1
Pankaj
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;
   }
1
user6412048