2010-01-15 9 views
12

que han desarrollado una costumbre JTableModel básica de la siguiente maneracorrectamente obteniendo datos de un (ordenados) JTable

public class CustomTableModel extends DefaultTableModel { 
    List<MyClass> data; 
    public CustomTableModel(List<MyClass> data) { 
    this.data = data; 
    } 

    public Class<?> getColumnClass(int columnIndex) { 
    return MyClass.class; 
    } 

    public MyClass getValueAt(int rowIndex, int columnIndex) { 
    return data.get(rowIndex); 
    } 

    // ... 
} 

entonces utilizar una costumbre JTableCellRenderer básica de la siguiente manera

public class CustomTableCellRenderer extends JLabel implements TableCellRenderer { 

    public Component getTableCellRendererComponent(JTable table, Object value, 
     boolean isSelected, boolean hasFocus, int row, int column) { 

    MyClass myClass = (MyClass)value; 

    lbl.setText(myClass.getString()); 

    return this; 
    } 
} 

También tengo un JPanel personalizados que muestra diversa información de la siguiente

public class MyPanel extends JPanel { 
    private MyClass myClass; 

    public MyPanel(MyClass myClass) { 
    // initialize components 
    } 

    public setMyClass(MyClass myClass) { 
    this.myClass = myClass; 
    updateFields(); 
    } 

    private void updateFields() { 
    this.fieldString.setText(myClass == null ? "" : myClass.getString()); 
    // ... 
    } 
} 

Por último, utilizo una tabla a la lista d mi ata y el panel personalizado para mostrar los detalles de los datos seleccionados.

public class JCustomFrame extends JFrame { 
    public JCustomFrame(List<MyClass> data) { 
    // ... 
    JTable table = new JTable(new CustomTableModel(data)); 
    table.setDefaultRenderer(MyClass.class, new CustomTableCellRenderer()); 

    } 
} 

Lo que estoy tratando de lograr es conseguir los MiClase seleccionados de la tabla , independientemente del orden.

Intenté ListSelectionListener pero los métodos no devuelven nada más que los índices seleccionados. Incluso si tengo el índice, si la tabla está ordenada, mi modelo no es tan sofisticado y devolverá el objeto equivocado.

Respuesta

30

... Aunque tenga el índice, si se ordena la mesa, mi modelo no es tan sofisticado y devolverá el objeto equivocado ...

Tienes que utilizar:

JTable.convertRowIndexToModel(int viewIndex)

mapas del índice de la fila en términos de la vista a la TableModel subyacente. Si los contenidos del modelo no están ordenados, los índices del modelo y la vista son los mismos.

Con ese índice, puede acceder al modelo de su mesa y ver cuál es el objeto que necesita.

Nota mesa de selección junto con este método fue introducido en Java 1.6

+1

Usted puede obtener un JTable para visualizar datos ordenados de manera diferente a partir del modelo subyacente? ¿Cómo se ordena y cuándo se introdujo? –

+3

@Carl Smoticz: desde Java 1.6 creo – OscarRyz

Cuestiones relacionadas