2010-06-10 7 views
9

'a basıldığında Düzenleme moduna hücrenin alınması Bu, muhtemelen önemsiz bir çözüme sahiptir, ancak ben benim ipucumun sonundayım, böylece umarım birileri yardım edebilir.JTable - Sekme

Özel bir oluşturucuya ve bir sütun kümesi için özel bir düzenleyiciye sahip bir JTable kullanıyorum.
İşleyici bir JLabel bileşeni kullanır ve düzenleyici bir JSpinner bileşeni kullanır.
Kullanıcılarımız, bir sütuna değerler girmeyi ve ardından tablodaki bir sonraki düzenlenebilir hücreye gitmek için SEKME veya ENTER tuşuna basmayı ister.
Doğru anlıyorsam, bu bir JTable için varsayılan davranıştır. Ancak, bu benim için doğru çalışmıyor gibi görünmüyor. Kullanıcı hücreye tıklayana kadar sadece JLabel görüntülenir.
JSpinner (örn. CellEditor) sadece bir kullanıcı hücreye çift tıkladığında görüntülenir. Dolayısıyla, hücrenin yalnızca Fare Çözümleri'nde "düzenleme" moduna girdiği, ancak odaklandığı zaman değil gibi görünüyor.

Hücre, odağı olduğu anda düzenleme moduna geçmek için nasıl alabilirim?

cevap

4

Bu programatik olarak elde edersiniz, yalnızca hücre üzerindeki odak olaylarını dinler, odaklanır ve izin verilir, düzenlemeye başlar. Bu thread ve example

18

üzerinde

Daha sen n00213f ederiz. Gönderinizdeki konu ve örnek yardımcı oldu. JTable içindeki changeSelection yöntemini, iş parçacığı için ima edildiği gibi aşırı yükleyerek, JTable, seçim her değiştirildiğinde bir hücrenin düzenlenebilir olup olmadığını denetler. Hücre düzenlenebilirse, CellEditor'ı gösterir ve odağı düzenleyici bileşenine aktarır.

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

iyi faydalı oldu. – n002213f

2

İşte ben üzerinde çalıştığım bir proje için bir araya kod parçacığı var: Bütünlüğü için

, işte çözümdür. Kod, ilk ve son sütunda düzenlenemeyen hücreleri olan bir tablo için test edilmiş ve doğrulanmıştır. Sınıf, sekmeyi yalnızca masanın düzenlenebilir hücrelerine sınırlar. Ayrıca, ters sekmeye kaydırmalı sekmeyi de destekler. Burada

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); 
     }    
    });      
} 

}

Ve sınıf tablonuz için nasıl kullanıldığını var: cevabını duymak

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