2011-11-30 27 views
22

Quiero establecer el índice seleccionado en un JComboBox por el valor, no por el índice. ¿Como hacer eso? EjemploCómo configurar el índice seleccionado JComboBox por el valor

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 un poco mi pregunta. Olvidé que tengo un artículo personalizado dentro de mi JComboBox que lo hace un poco más difícil. No puedo hacer SetSelectedItem ya que tengo un ComboItem dentro de cada elemento. Así que, aún así, ¿cómo hago esto?

+1

dont artículos utilización de envoltura.En lugar de implementar un ListCellRenderer personalizado que hace la asignación del componente a su representación de cadena – kleopatra

Respuesta

36

setSelectedItem("banana"). Podrías haberlo encontrado solo leyendo the javadoc.

Editar: como ha cambiado la pregunta, cambiaré mi respuesta.

Si desea seleccionar el elemento que tiene la etiqueta "banana", entonces usted tiene dos soluciones:

  1. iterar a través de los objetos para encontrar el uno (o el índice del uno) que tiene el dado etiqueta y, a continuación, llamar setSelectedItem(theFoundItem) (o setSelectedIndex(theFoundIndex))
  2. Override equals y hashCode en ComboItem de modo que dos ComboItem casos que tienen el mismo nombre son iguales, y sólo tiene que utilizar setSelectedItem(new ComboItem(anyNumber, "banana"));
+0

Lamento haber perdido esa función obvia, pero he actualizado mi pregunta ya que olvidé que no tengo elementos "normales" en mi cuadro combinado –

+3

La segunda solución es muy útil, gracias. –

5

¿Por qué no tomar una colección, probablemente un Mapa como un HashMap, y usarlo como el núcleo de su propia clase de modelo de cuadro combinado que implementa la interfaz ComboBoxModel? A continuación, puede acceder a los elementos de su cuadro combinado fácilmente a través de sus cadenas clave en lugar de enter.

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

por ejemplo

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

Esperanza esta ayuda :)

6

Debe utilizar el modelo

comboBox.getModel().setSelectedItem(object); 
1

Sólo tiene que llamar comboBox.updateUI() después de haces g comboBox.setSelectedItem o comboBox.setSelectedIndex o comboModel.setSelectedItem

+0

¿Podría por favor elaborar más su respuesta agregando un poco más de descripción sobre la solución que proporciona? – abarisone

2

La forma correcta de establecer un elemento seleccionado cuando el cuadro combinado está poblada por algún constructor de la clase (como @milosz publicado):

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

En su caso de que el código sería:

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