JTable: как получить выбранные ячейки?

У меня есть JTable и его TableModel, он работает хорошо, но то, что я хочу сделать сейчас, это получить выбранные ячейки. Я подумал о том, чтобы сделать что-нибудь вроде:--2-->

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

но, конечно, чего-то подобного не существует. Что же мне делать?

4 ответов


В JTable у вас есть

JTable.getSelectedRow()

и

JTable.getSelectedColumn()

вы можете попробовать объединить эти два метода с MouseListener и KeyListener. С помощью KeyListener вы проверяете, нажимает ли пользователь клавишу CTRL, что означает, что пользователь выбирает ячейки, а затем с помощью прослушивателя мыши, для каждого клика вы храните, возможно, в векторе или 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);
}

таблица.getSelectedRow() будет выбрана строка.

таблица.getSelectedColumns () получите выбранные столбцы.

getValueAt(параметр rowindex, значение columnindex) даст значение в выбранной строке для каждого столбца.



вы можете использовать:

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()) верните точную таблицу ячейки, которая была нажата в последний раз.