2011-02-18 17 views
5

Tengo un JTable en una GUI y deseo devolver un número basado en el valor de la celda en la que un usuario hace clic. Este es el código:¿Cómo puedo determinar qué celda de una JTable se seleccionó?

ListSelectionModel newmodel = mytable.getSelectionModel(); 
newmodel.addListSelectionListener(new ListSelectionListener() { 
    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     int row = mytable.getSelectedRow(); 
     int column = mytable.getSelectedColumn(); 

     int cell = getNewNum(); 
     datefield.setText(String.valueOf(cell)); 
    } 
}); 

Tengo un par de problemas con esto. En primer lugar, este método hace que mi mesa sea editable. Antes de usar este método, no podía editar la tabla, pero ahora puedo eliminar entradas. Busqué en la API, pero no sé por qué es así. En segundo lugar, si hago clic en una celda en la fila 3, por ejemplo, y luego hago clic en otra fila en la celda 3, no se registra ningún evento. ¿Cómo puedo hacer que un evento haga clic en una celda en la fila seleccionada actualmente?

+0

Adición de un ListSelectionListener no hará que su tabla editable. La editabilidad de una celda está controlada por el método isCellEditable (...) del TableModel o la JTable misma. – camickr

+0

posible duplicado de [¿Cómo puedo verificar en qué celda JTable se ha hecho clic/seleccionar?] (Http://stackoverflow.com/questions/4795586/how-can-i-check-which-jtable-cell-has-been- clicked-selected) – jlordo

Respuesta

7

Un método común es conseguir el punto donde el usuario ha hecho clic a través del evento:

jTable1.addMouseListener(new java.awt.event.MouseAdapter() { 
    @Override 
    public void mouseClicked(java.awt.event.MouseEvent evt) { 
     int row = jTable1.rowAtPoint(evt.getPoint()); 
     int col = jTable1.columnAtPoint(evt.getPoint()); 
     if (row >= 0 && col >= 0) { 
      ...... 

     } 
    } 
}); 

Aquí es una segunda opción utilizando el modo de selección:

jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); 
    jTable1.addMouseListener(new java.awt.event.MouseAdapter() { 
     @Override 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      ... 
      int row = jTable1.getSelectedRow(); 
      int col = jTable1.getSelectedColumn()); 
      if (evt.getClickCount() > 1) { // double-click etc... 
       ... 

Si vas:

public boolean isCellEditable(int row, int col) { 
    return false; 
} 

Entonces su Jable no será editable.

último con el fin de obtener el valor que desee, sólo tiene que llamar al getValueAt(row,col) de su modelo JTable, o conseguir el contenido de esta manera:

Object foo = jTable1.getModel().getValueAt(row, col); 
+0

Me gusta su primera solución, es lo que uso – user489041

Cuestiones relacionadas