web-dev-qa-db-fra.com

JTable: comment obtenir les cellules sélectionnées?

J'ai un JTable et son TableModel, cela fonctionne bien, mais ce que je veux faire maintenant, c'est en obtenir les cellules sélectionnées. J'ai pensé faire quelque chose comme:

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

Mais bien sûr, quelque chose comme ça n'existe pas. Que devrais-je faire à la place?

8
Rob

Dans JTable, vous avez le

JTable.getSelectedRow()

et

JTable.getSelectedColumn()

Vous pouvez essayer de combiner ces deux méthodes avec un MouseListener et un KeyListener. Avec le KeyListener, vous vérifiez si l'utilisateur appuie sur la touche CTRL, ce qui signifie qu'il sélectionne des cellules peut-être stocker dans un vecteur ou ArrayList les cellules sélectionnées:

//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);
}
19
BackSlash

table.getSelectedRow () obtiendra la ligne sélectionnée.

table.getSelectedColumns () obtiendra les colonnes sélectionnées.

getValueAt (rowIndex, columnIndex) donnera la valeur présente dans la ligne sélectionnée pour chaque colonne.

6
Amarnath
3
sbridges

Vous pouvez utiliser:

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

Vous pouvez obtenir la ligne et la colonne avec (table.getSelectedRow() et table.getSelectedColumn()), mais si vous avez sélectionné plusieurs cellules, les méthodes table.getSelectedRow() et table.getSelectedColumn() renvoient la position de la première cellule sur laquelle la cellule a été cliquée.

De même, table.rowAtPoint(e.getPoint()) et table.columnAtPoint(e.getPoint()) renvoient la table de la cellule exacte sur laquelle vous avez cliqué pour la dernière fois.

0
Fred Brasil