2012-07-26 64 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