2010-06-10 19 views
9

Jest to prawdopodobnie trywialne rozwiązanie, ale jestem na końcu mojej sieci, więc mam nadzieję, że ktoś może pomóc.JTable - Przeniesienie komórki do trybu edycji po naciśnięciu Tab

Używam JTable, który ma niestandardowy renderer i niestandardowy edytor dla zestawu kolumn.
Moduł renderujący używa komponentu JLabel, a edytor używa komponentu JSpinner.
Nasi użytkownicy chcą mieć możliwość wprowadzania wartości w kolumnie, a następnie naciśnij klawisz TAB lub ENTER, aby przejść do kolejnej edytowalnej komórki w tabeli.
Jeśli dobrze rozumiem, jest to domyślne zachowanie dla JTable.

To jednak nie działa poprawnie. Do momentu kliknięcia komórki przez użytkownika wyświetlany jest tylko JLabel.
JSpinner (np. CellEditor) jest wyświetlany tylko wtedy, gdy użytkownik dwukrotnie kliknie komórkę. Wygląda więc na to, że komórka przechodzi w tryb "edycji" tylko w MouseEvents, ale nie wtedy, gdy ma fokus.

Jak ustawić komórkę w trybie edycji natychmiast po ustawieniu ostrości?

Odpowiedz

4

Możesz to osiągnąć programowo, po prostu słuchasz fokusów w komórce, na których ostrość i edycja jest dozwolona, ​​zacznij edycję.

Więcej na ten thread i example

18

Dziękuję n00213f. Wątek i przykład z twojego posta były pomocne. Przeciążając metodę changeSelection w JTable jako wskazaną w wątku, JTable sprawdza, czy komórka jest edytowalna za każdym razem, gdy zmiana jest zmieniana. Jeśli komórka jest edytowalna, pokaże CellEditor i przeniesie fokus do komponentu edytora.

Dla kompletności, tutaj jest moje rozwiązanie:

JTable myTable = new javax.swing.JTable() 
    { 
      public void changeSelection(final int row, final int column, boolean toggle, boolean extend) 
      { 
       super.changeSelection(row, column, toggle, extend); 
       myTable.editCellAt(row, column); 
       myTable.transferFocus(); 
      } 
    }; 
+0

dobry, aby usłyszeć odpowiedź była przydatna. – n002213f

2

Oto fragment kodu, który ułożyła dla projektu, który byłem w pracy. Kod został przetestowany i zweryfikowany pod kątem tabeli, która ma nieedytowalne komórki w pierwszej i ostatniej kolumnie. Klasa ogranicza zakładki do tylko edytowalnych komórek tabeli. Obsługuje także przechodzenie do tabulacji w odwrotnej kolejności.

public class JTableCellTabbing { 
/** 
* 
* Creates a new {@code JTableCellTabbing} object. 
* 
* 
*/ 
private JTableCellTabbing() {   
} 

/** 
* 
* Set Action Map for tabbing and shift-tabbing for the JTable 
* 
* 
* @param theTable - Jtable with NRows and MCols of cells 
* @param startRow - valid start row for tabbing [ 0 - (numRows-1) ] 
* @param numRows - Number of rows for tabbing 
* @param startCol - valid start col for tabbing [ 0 - (numCols-1) ] 
* @param numCols - Number of columns for tabbing 
*/ 
@SuppressWarnings("serial") 
static public void setTabMapping(final JTable theTable, final int startRow, final int numRows, final int startCol, final int numCols) { 
    if (theTable == null) { 
     throw new IllegalArgumentException("theTable is null"); 
    } 

    // Calculate last row and column for tabbing 
    final int endRow = startRow + (numRows - 1); 
    final int endCol = startCol + (numCols - 1); 

    // Check for valid range 
    if ((startRow > endRow) || (startCol > endCol)) { 
     throw new IllegalArgumentException("Table Size incorrect");    
    } 

    // Get Input and Action Map to set tabbing order on the JTable 
    InputMap im = theTable.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
    ActionMap am = theTable.getActionMap(); 

    // Get Tab Keystroke 
    KeyStroke tabKey = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);      
    am.put(im.get(tabKey), new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int row = theTable.getSelectedRow(); 
      int col = theTable.getSelectedColumn(); 

      col++; 

      // Move to next row and left column 
      if (col > endCol) { 
       col = startCol; 
       row++; 
      } 

      // Move to top row 
      if (row > endRow) { 
       row = startRow; 
      } 

      // Move cell selection 
      theTable.changeSelection(row, col, false, false); 
     }    
    }); 

    // Get Shift tab Keystroke 
    KeyStroke shiftTab = 
     KeyStroke.getKeyStroke(KeyEvent.VK_TAB, java.awt.event.InputEvent.SHIFT_DOWN_MASK);      
    am.put(im.get(shiftTab), new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int row = theTable.getSelectedRow(); 
      int col = theTable.getSelectedColumn(); 

      col--; 

      // Move to top right cell 
      if (col < startCol) { 
       col = endCol; 
       row--; 
      } 

      // Move to bottom row 
      if (row < startRow) { 
       row = endRow; 
      } 

      // Move cell selection 
      theTable.changeSelection(row, col, false, false); 
     }    
    });      
} 

}

A oto jak klasa służy do tabeli:

JTable myTable = new JTable(); 
// Set up table attributes.... 
JTableCellTabbing.setTabMapping(myTable, 0, NUM_ROWS, 1, (NUM_COLS-1)); 
Powiązane problemy