2012-01-10 18 views
6

Hola si coloca JComboBox en JTable y String [] en JComboBox todo funciona bien. Buf si coloca su propio tipo de datos en JComboBox, la selección de valores en la misma columna se complica. Aquí está official example. Intente cambiar parte siguiente:JTable, JComboBox utilizando Objetos personalizados

JComboBox comboBox = new JComboBox(); 
comboBox.addItem("Snowboarding"); 
comboBox.addItem("Rowing"); 
comboBox.addItem("Knitting"); 
comboBox.addItem("Speed reading"); 
comboBox.addItem("Pool"); 
comboBox.addItem("None of the above"); 
sportColumn.setCellEditor(new DefaultCellEditor(comboBox)); 

En:

JComboBox comboBox = new JComboBox(); 
comboBox.addItem(new Test("Snowboarding")); 
comboBox.addItem(new Test("Rowing")); 
comboBox.addItem(new Test("Knitting")); 
comboBox.addItem(new Test("Speed reading")); 
comboBox.addItem(new Test("Pool")); 
comboBox.addItem(new Test("None of the above")); 
sportColumn.setCellEditor(new DefaultCellEditor(comboBox)); 

y crear nuevos tipos de datos:

public class Test { 
    private String name; 

    public Test(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 
} 

Verá, que cuando se hace clic en celda de la tabla en la bruja no es JComboBox con tipo de datos personalizados. El valor de la celda de la primera columna se selecciona automáticamente. ¿Cómo arreglar este problema?

EDITAR 1: He añadido SSCCE.

Clase Principal:

import java.awt.BorderLayout; 

public class windw extends JFrame { 

    private JPanel contentPane; 
    private JTable table; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        windw frame = new windw(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public windw() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 

     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     table = new JTable(); 
     String[] grupes2 = new String[3]; 
     grupes2[0] = "first"; 
     grupes2[1] = "second"; 
     grupes2[2] = "third"; 

     table.setModel(new DefaultTableModel(
      new Object[][] { 
       {new JComboBox<String>(grupes2)}, 
       {new JComboBox<String>(grupes2)}, 
       {new JComboBox<String>(grupes2)}, 
       {new JComboBox<String>(grupes2)}, 
       {new JComboBox<String>(grupes2)}, 
       {new JComboBox<String>(grupes2)}, 
       {new JComboBox<String>(grupes2)}, 
      }, 
      new String[] { 
       "Column name" 
      } 
     )); 
     TableColumn sportColumn = table.getColumnModel().getColumn(0); 
     sportColumn.setCellEditor(new DefaultCellEditor(new JComboBox<String>(grupes2))); 
     sportColumn.setCellRenderer(new Renderer(grupes2)); 
     contentPane.add(table, BorderLayout.CENTER); 
    } 

} 

Procesador:

import java.awt.Component; 

import javax.swing.JComboBox; 
import javax.swing.JTable; 
import javax.swing.table.TableCellRenderer; 

public class Renderer extends JComboBox implements TableCellRenderer { 
    public Renderer(String[] items) { 
     super(items); 
    } 

    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 
     if (isSelected) { 
      setForeground(table.getSelectionForeground()); 
      super.setBackground(table.getSelectionBackground()); 
     } else { 
      setForeground(table.getForeground()); 
      setBackground(table.getBackground()); 
     } 

     // Select the current value 
     setSelectedItem(value); 
     return this; 
    } 
} 
+1

Para una mejor ayuda antes, publique un [SSCCE] (http://sscce.org/). –

Respuesta

8

El problema es que su TableModel está almacenando un objeto String y el cuadro combinado contiene un objeto de prueba. Estos objetos no son iguales por lo que no hay ningún elemento para seleccionar y se ve que el primero se resalta automáticamente.

cambiar su código a la siguiente y verá el mismo problema con una cadena desconocida:

{"Joe", "Brown", "Pool?????", new Integer(10), new Boolean(false)} 

Para solucionar el problema, yo supongo que tiene que hacer lo siguiente:

{"Joe", "Brown", new Test("Pool"), new Integer(10), new Boolean(false)} 

Debería implementar el método equals() en su clase de prueba para comparar la propiedad de nombre de ambos componentes. Además, necesitaría implementar el método hashcode().

En el futuro, como Andrew sugirió, incluya su SSCCE con su pregunta ya que no tenemos tiempo para copiar/pegar/editar y probar el código porque nunca sabemos si lo hacemos exactamente de la misma manera que lo hace.

+0

Quizás pregunté mal, pero lo que me ayudó fue que cuando creo una nueva fila de tabla con 'addRow (new Object [] {})'. Previamente estaba agregando esto - 'addRow (new Object [] {" "})' y estaba mal. – Minutis

+0

¡Gracias! Ahora entendí por qué necesito '@ Override'' equals()' y 'hashCode()'. – Minutis

Cuestiones relacionadas