2013-01-19 34 views
8

我有一个JTable和它的TableModel,它工作的很好,但我现在要做的是获取它的选定单元格。我想做的事情是这样的:JTable:如何获取选定的单元格?

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() //... 
    } 
} 

但是,当然这样的东西不存在。我该怎么做呢?

回答

19

在JTable中,你有

JTable.getSelectedRow() 

JTable.getSelectedColumn() 

你可以尝试用的MouseListener和KeyListener的结合这两方法。 你咨询一下,如果用户按下CTRL键的KeyListener,这意味着用户正在选择的细胞,然后用鼠标监听,每次点击你也许存储在一个Vector或ArrayList中的选定单元格:

//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的方法。 – Amarnath

0

您可以使用:

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

你可以得到(table.getSelectedRow()table.getSelectedColumn())的行和列,但如果你选择了多个单元的方法table.getSelectedRow(),那是第一个单元格的table.getSelectedColumn()恢复单元的位置点击。

另一方面,table.rowAtPoint(e.getPoint())table.columnAtPoint(e.getPoint())返回最后一次点击的确切单元格表。

相关问题