我有一個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);
您不需要mouseListener來防止在點擊時啓動編輯:而是在事件是MouseEvent時實現所有編輯器以在isCellEditable(EventObject)中返回false。對於DefaultCellEditor,您可以將clickCountToStart屬性設置得如此之高,以至於它可以有效地禁用鼠標事件的編輯 – kleopatra 2012-07-30 07:13:44
嗯,我試過了,但是在if語句中返回false後,isCellEditable沒有結束,並且正在返回真正的值方法。這怎麼可能hapen我不明白,但我一步一步地運行,它是進入如果後返回false的狀態是在這個返回true的方法的最後一行跳轉; – 2012-07-30 08:09:21