2012-07-26 68 views
2

我有一個JTable帶有可編輯單元格。當我點擊一個單元格時,它進入編輯模式;當我使用方向箭頭移動單元時會發生同樣的情況。 現在我想選擇單元格而不是開始編輯,並且只有在按下Enter鍵時才編輯單元格。更改JTable關鍵操作的行爲

如果需要其他信息,請直接詢問。

編輯:爲操作輸入關鍵

class EnterAction extends AbstractAction { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JTable tbl = (JTable) e.getSource(); 
     tbl.editCellAt(tbl.getSelectedRow(), tbl.getSelectedColumn()); 
     if (tbl.getEditorComponent() != null) { 
      tbl.getEditorComponent().requestFocus(); 
     } 
    } 
} 

現在,這是左箭頭行動3,其餘都不難從這個推斷:

class LeftAction extends AbstractAction { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     JTable tbl = (JTable)e.getSource(); 
     tbl.requestFocus(); 
     tbl.changeSelection(tbl.getSelectedRow(), tbl.getSelectedColumn() > 0 ? tbl.getSelectedColumn()-1:tbl.getSelectedColumn(), false, false); 
     if(tbl.getCellEditor()!=null) 
      tbl.getCellEditor().stopCellEditing(); 
    } 
} 

這是怎麼你綁定這個動作:

final String solve = "Solve"; 
      KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); 
      table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(enter, solve); 
      table.getActionMap().put(solve, new EnterAction()); 
final String sel = "Sel"; 
      KeyStroke arrow = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0); 
      table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(arrow, sel); 
      table.getActionMap().put(sel, new LeftAction()); 

哦,我幾乎f orgot,選擇的單元格,而不是在鼠標編輯點擊:

public static MouseListener mAdapterTable = new MouseListener() 
{ 
    @Override 
    public void mousePressed(MouseEvent e) 
    { 
     JTable tbl=((JTable)e.getComponent()); 
     if(tbl.isEditing()) 
     { 
      tbl.getCellEditor().stopCellEditing(); 
     } 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     JTable tbl=((JTable)e.getComponent()); 
     if(tbl.isEditing()) 
      tbl.getCellEditor().stopCellEditing(); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     JTable tbl=((JTable)e.getComponent()); 
     if(tbl.isEditing()) 
      tbl.getCellEditor().stopCellEditing(); 
    } 
}; 

EventListner必須添加到表像這樣:

table.addMouseListener(mAdapterTable); 
+1

您不需要mouseListener來防止在點擊時啓動編輯:而是在事件是MouseEvent時實現所有編輯器以在isCellEditable(EventObject)中返回false。對於DefaultCellEditor,您可以將clickCountToStart屬性設置得如此之高,以至於它可以有效地禁用鼠標事件的編輯 – kleopatra 2012-07-30 07:13:44

+0

嗯,我試過了,但是在if語句中返回false後,isCellEditable沒有結束,並且正在返回真正的值方法。這怎麼可能hapen我不明白,但我一步一步地運行,它是進入如果後返回false的狀態是在這個返回true的方法的最後一行跳轉; – 2012-07-30 08:09:21

回答

3

爲此使用Key Bindings。多數外觀&感覺已經實現綁定F2表中的startEditing動作,但你添加一個不同的結合:

tree.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "startEditing"); 

這將有效地取代以前綁定輸入表中的selectNextRowCell行動。

0

這裏是我會做:

您可以在的keyPressed()方法來檢查,如果用戶按下右邊按鈕編輯。我不確定,如果在表格中禁用正常(雙擊)編輯,那麼如果您嘗試以編程方式編輯它,會發生什麼情況,但如果它不起作用,那麼您可以啓用對所選單元格的編輯,當用戶按下編輯按鈕時,當他/她完成時,再次禁用它。

+1

不,KeyListener不是答案 - 正如@trashgod所建議的那樣,Swing中的句柄keyStrokes是鍵綁定。始終使用可用的最高抽象 – kleopatra 2012-07-30 07:08:27