我有一个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