2013-01-19 27 views
8

Mam JTable i jego TableModel, działa dobrze, ale to, co chcę teraz zrobić, to uzyskać wybrane komórki z niego. Pomyślałem o zrobieniu czegoś takiego:JTable: jak uzyskać wybrane komórki?

int rows = this.getTable().getRowCount(); 
int columns = this.getTable().getColumnCount(); 
for(int i = 0 ; i < rows ; i++) 
{ 
    for(int j = 0 ; j < columns ; j++) 
    { 
     if(table.getCell(i,j).isSelected() //... 
    } 
} 

Ale oczywiście coś takiego nie istnieje. Co powinienem zamiast tego zrobić?

Odpowiedz

19

W JTable, masz

JTable.getSelectedRow() 

i

JTable.getSelectedColumn() 

Można spróbować połączyć te dwie metody z MouseListener i KeyListener. Z KeyListener sprawdzić, czy użytkownik jest naciśnięcie klawisza CTRL, co oznacza, że ​​użytkownik jest wybranie komórek, a następnie z detektorem myszy, za każde kliknięcie, być może przechowywać w Vector lub ArrayList wybranych komórek:

//global variables 
JTable theTable = new JTable();//your table 
boolean pressingCTRL=false;//flag, if pressing CTRL it is true, otherwise it is false. 
Vector selectedCells = new Vector<int[]>();//int[]because every entry will store {cellX,cellY} 

public void something(){ 
    KeyListener tableKeyListener = new KeyAdapter() { 

     @Override 
     public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode()==KeyEvent.VK_CTRL){//check if user is pressing CTRL key 
      pressingCTRL=true; 
     } 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
     if(e.getKeyCode()==KeyEvent.VK_CTRL){//check if user released CTRL key 
      pressingCTRL=false; 
     } 
     } 
    }; 

    MouseListener tableMouseListener = new MouseAdapter() { 

     @Override 
     public void mouseClicked(MouseEvent e) { 
     if(pressingCTRL){//check if user is pressing CTRL key 
      int row = theTable.rowAtPoint(e.getPoint());//get mouse-selected row 
      int col = theTable.columnAtPoint(e.getPoint());//get mouse-selected col 
      int[] newEntry = new int[]{row,col};//{row,col}=selected cell 
      if(selectedCells.contains(newEntry)){ 
       //cell was already selected, deselect it 
       selectedCells.remove(newEntry); 
      }else{ 
       //cell was not selected 
       selectedCells.add(newEntry); 
      } 
     } 
     } 
    }; 
    theTable.addKeyListener(tableKeyListener); 
    theTable.addMouseListener(tableMouseListener); 
} 
+0

+1 za podejście. – Amarnath

6

table.getSelectedRow() otrzyma wybrany wiersz.

table.getSelectedColumns() otrzyma wybrane kolumny.

getValueAt(rowIndex, columnIndex) poda wartość obecną w wybranym wierszu dla każdej kolumny.

+0

Myślę, że chce złapać wszystkie komórki z tłoczonymi komórkami, a nie tylko jedną z nich. – BackSlash

+0

Dobra, może masz rację. Poczekajmy na odpowiedź PO. – Amarnath

+1

@Harlandraka ma rację, mam tabelę jak arkusz kalkulacyjny, więc mogę wybrać wiele komórek. – Rob

0

Można użyć:

int row = table.rowAtPoint(e.getPoint()); 
int col = table.columnAtPoint(e.getPoint()); 

można uzyskać wiersza i kolumny (table.getSelectedRow() i table.getSelectedColumn()), ale jeśli wybrano więcej niż jedną komórkę przy czym sposób table.getSelectedRow() i położenia table.getSelectedColumn() return komórki z pierwszej komórki, która była kliknięte.

Z drugiej strony, table.rowAtPoint(e.getPoint()) i table.columnAtPoint(e.getPoint()) zwraca tabelę dokładnie komórki, która została kliknięta po raz ostatni.