Swing JTable:如何获取选定的单元格?

Swing JTable:如何获取选定的单元格?,swing,jtable,cell,selected,Swing,Jtable,Cell,Selected,我有一个JTable和它的TableModel,它工作得很好,但我现在想做的是得到它的选定单元格。我想做一些事情,比如: 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(ta

我有一个JTable和它的TableModel,它工作得很好,但我现在想做的是得到它的选定单元格。我想做一些事情,比如:

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() //...
    }
}
int rows=this.getTable().getRowCount();
int columns=this.getTable().getColumnCount();
对于(int i=0;i

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

JTable有方法,而在JTable中,你有

JTable.getSelectedRow()

您可以尝试将这两种方法与MouseListener和KeyListener结合使用。 使用KeyListener,您可以检查用户是否按下CTRL键,这意味着用户正在选择单元格,然后使用鼠标侦听器,对于存储在向量或数组中的每次单击,请列出所选单元格:

//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);
}
//全局变量
JTable theTable=新的JTable();//您的表
boolean pressingCTRL=false;//标志,如果按CTRL,则为true,否则为false。
Vector selectedCells=new Vector();//int[],因为每个条目都将存储{cellX,cellY}
公之于众{
KeyListener tableKeyListener=新的KeyAdapter(){
@凌驾
按下公共无效键(按键事件e){
如果(e.getKeyCode()==KeyEvent.VK_CTRL){//检查用户是否正在按CTRL键
按Ctrl=true;
}
}
@凌驾
公共无效密钥已释放(密钥事件e){
如果(e.getKeyCode()==KeyEvent.VK_CTRL){//检查用户是否释放了CTRL键
按Ctrl=false;
}
}
};
MouseListener tableMouseListener=新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
如果(按CTRL){//检查用户是否按CTRL键
int row=table.rowAtPoint(e.getPoint());//获取鼠标选中的行
int col=table.columnAtPoint(e.getPoint());//获取鼠标选中的列
int[]newEntry=newint[]{row,col};//{row,col}=所选单元格
if(selectedCells.contains(newEntry)){
//单元格已选定,请取消选择它
所选单元格。删除(新建条目);
}否则{
//未选择单元格
选择单元格。添加(新条目);
}
}
}
};
table.addKeyListener(tableKeyListener);
table.addMouseStener(tableMouseStener);
}
将获得选中的行

将获取选定的列

将给出每列所选行的值。

您可以使用:

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())
返回上一次单击的确切单元格表。

我认为他希望捕获所有按下的单元格,而不是只捕获一个按下的单元格cell@Harlandraka是的,我有一个类似于电子表格的表格,所以我可以选择许多单元格。@Rob好的。所以我想我甚至必须尝试这个方法才能获得所有选定的单元格。@Rob查看我的解决方案,它做的是你需要
int row = table.rowAtPoint(e.getPoint());
int col = table.columnAtPoint(e.getPoint());