我正在研究一个JFrame,它里面有一个JTable和一些其他元素。我希望用户能够做的是通过表格(具有设定的行数),然后当焦点位于表格的右下方时,再次点击标签将跳转到另一个组件,在此case a JTextField。
我使用KeyListener来完成此操作,以便用户只需在表格中进行选项卡。我遇到的问题是,如果用户正在编辑单元格,然后按Tab键,TableCellEditor似乎有焦点,我添加到表中的KeyListener不会被调用。从我在文档中可以看出,CellEditor只能有一个CellEditorListener,它只能有一个ChangeEvent,这对我在这里尝试做的事情不起作用。
有人知道这方面的解决方法,还是我没想过的技巧?
答案 0 :(得分:3)
我使用KeyListener来完成此操作,以便用户只需在表格中进行选项。
不要使用KeyListener。 Swing旨在与Key Bindings一起使用。
请参阅Table Tabbing,了解如何在提供自定义时重用现有标签操作的方法。由于此方法使用默认选项卡操作,因此它也可以解决您的问题。
答案 1 :(得分:1)
试试这个:
table.setDefaultEditor(Object.class,new TableEditor());
class TableEditor extends DefaultCellEditor{
public TableEditor(){
super(new JTextField());
setClickCountToStart(1);
getComponent().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("enter");
}
});
}
public Component getTableCellEditorComponent(JTable table,Object value,boolean isSelected,int row,int column){
JTextField com=(JTextField)super.getTableCellEditorComponent(table,value,isSelected,row,WIDTH);
com.setText((String)value);
return com;
}
}
和
table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),"");
如果需要,删除Enter键的标准反应
或者:
editorComponent.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),"ent");
editorComponent.getActionMap().put("ent",new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e){
System.out.println("opp");
}
});
TableEditor构造函数中的(而不是“getComponent”工作人员)。