2011-02-18 14 views
5

Ho un JTable in una GUI e voglio restituire un numero basato sul valore della cella su cui un utente fa clic. Questo è il codice:Come posso determinare quale cella di una tabella è stata selezionata?

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

Ho un paio di problemi con questo. In primo luogo questo metodo rende la mia tabella modificabile. Prima che usassi questo metodo non potevo modificare la tabella ma ora posso cancellare le voci. Ho guardato nell'API ma non so perché sia ​​così. In secondo luogo, se clicco su una cella nella riga 3, dì, e poi clicco su un'altra riga nella cella 3, nessun evento è registrato. Come posso fare in modo che un evento faccia clic in una cella sulla riga attualmente selezionata?

+0

L'aggiunta di un ListSelectionListener non renderà il vostro tavolo modificabile. La modificabilità di una cella è controllata dal metodo isCellEditable (...) di TableModel o di JTable stesso. – camickr

+0

possibile duplicato di [Come posso verificare quale cella JTable è stata selezionata/selezionata?] (Http://stackoverflow.com/questions/4795586/how-can-i-check-which-jtable-cell-has-been- cliccato-selezionato) – jlordo

risposta

7

Un metodo comune è quello di ottenere il punto in cui l'utente fa clic attraverso l'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) { 
      ...... 

     } 
    } 
}); 

Ecco una seconda opzione utilizzando la modalità di selezione:

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

Se si va:

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

Quindi il tuo JTable non sarà modificabile.

Infine, al fine di ottenere il valore che si desidera, basta chiamare il getValueAt(row,col) del JTable modello, o ottenere il contenuto in questo modo:

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

Mi piace la tua prima soluzione, è quello che uso – user489041

Problemi correlati