Quiero establecer el índice seleccionado en un Jtree por el valor no en el índice. Cómo hacerlo? Ejemplo

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, he modificado mi pregunta un poco. Se me olvido que tenia la costumbre de tener un elemento dentro de mi Jtree que hace que sea un poco más difícil. yo no puedo hacer setSelectedItem como tengo un ComboItem dentro de cada elemento. Aún así, ¿cómo puedo hacer esto?

  • no uso de contenedor de los elementos. En lugar de implementar una costumbre ListCellRenderer que hace a la asignación de la componente en su representación de cadena

9 Comentarios

  1. 39

    setSelectedItem("banana"). Usted podría haber encontrado a ti mismo por solo lectura el javadoc.

    Edit: desde que cambió la pregunta, voy a cambiar mi respuesta.

    Si desea seleccionar el elemento que tienen la «banana» de la etiqueta, entonces usted tiene dos soluciones:

    1. Iterar a través de los elementos para encontrar el uno (o el índice de la uno) que tiene la etiqueta y, a continuación, llamar a setSelectedItem(theFoundItem) (o setSelectedIndex(theFoundIndex))
    2. Reemplazar equals y hashCode en ComboItem de modo que dos ComboItem instancias con el mismo nombre son iguales, y sólo tiene que utilizar setSelectedItem(new ComboItem(anyNumber, "banana"));
    • Im sorry que me perdí la función obvia, pero he actualizado mi pregunta como me olvidé de que yo no tengo «normal» artículos en mi combobox
    • La segunda solución es muy útil, gracias.
  2. 14
    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;
                }
            }
        }

    Espero que esta ayuda 🙂

    • Ayuda mucho! Gracias!
  3. 12

    Debe utilizar el modelo de

    comboBox.getModel().setSelectedItem(object);
    • esta es la respuesta correcta. también evita la construcción de bucle otros han sugerido.
  4. 6

    ¿Por qué no tomar una colección, probablemente un Mapa, tales como un HashMap, y utilizarlo como el núcleo de su propia cuadro combinado modelo de la clase que implementa el ComboBoxModel interfaz? Entonces usted podría tener acceso a su cuadro combinado de elementos fácilmente a través de su clave de Cadenas en lugar de enteros.

    Por ejemplo…

    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. 4

    por ejemplo

    Cómo establecer el índice seleccionado Jtree por valor de

    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. 2

    La forma correcta de establecer un elemento seleccionado cuando el combobox está poblada por algunos de la clase’ constructor (como @milosz publicado):

    combobox.getModel().setSelectedItem(new ClassName(parameter1, parameter2));

    En su caso, el código sería el siguiente:

    test.getModel().setSelectedItem(new ComboItem(3, "banana"));
  7. 1
    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;
    }
  8. 1

    Acaba de llamar comboBox.updateUI() después de hacer comboBox.setSelectedItem o comboBox.setSelectedIndex o comboModel.setSelectedItem

    • Por favor podría elaborar más su respuesta añadiendo un poco más de descripción acerca de la solución que usted proporciona?

Dejar respuesta

Please enter your comment!
Please enter your name here