2011-02-18 9 views
5

Mam JTable w GUI i chcę zwrócić liczbę na podstawie wartości komórki, którą użytkownik kliknie. To jest kod:Jak określić, która komórka w JTable została wybrana?

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

Mam z tym kilka problemów. Po pierwsze, ta metoda umożliwia edycję mojego stołu. Zanim użyłem tej metody, nie mogłem edytować tabeli, ale teraz mogę usuwać wpisy. Zajrzałem do API, ale nie wiem, dlaczego tak jest. Po drugie, jeśli kliknę komórkę w wierszu 3, powiedz, a następnie kliknę na inny wiersz w komórce 3, żadne zdarzenie nie zostanie zarejestrowane. Jak utworzyć zdarzenie po kliknięciu komórki w aktualnie wybranym wierszu?

+0

Dodawanie ListSelectionListener nie będzie tabela edytowalne. Edytowalność komórki jest kontrolowana przez metodę isCellEditable (...) TableModel lub samą JTable. – camickr

+0

możliwy duplikat [Jak mogę sprawdzić, która komórka JTable została kliknięta/wybrana?] (Http://stackoverflow.com/questions/4795586/how-can-i-check-which-jtable-cell-has-been- kliknięte-wybrane) – jlordo

Odpowiedz

7

Powszechną metodą jest zdobycie punktu, w którym użytkownik kliknął poprzez imprezy:

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

     } 
    } 
}); 

Oto druga opcja korzystania z trybu wyboru:

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

Jeśli pójdziesz:

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

Następnie Twoja JTable nie będzie edytowalna.

Wreszcie, aby uzyskać żądaną wartość, wystarczy zadzwonić do getValueAt(row,col) swojego JTable modelu, lub uzyskać zawartość tak:

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

Podoba mi się twoje pierwsze rozwiązanie, to jest to, czego używam – user489041

Powiązane problemy