在JTable中侦听KeyEvent - 如何在编辑单元格时执行此操作?

时间:2013-05-10 16:02:32

标签: java swing jtable tablecelleditor key-events

我正在研究一个JFrame,它里面有一个JTable和一些其他元素。我希望用户能够做的是通过表格(具有设定的行数),然后当焦点位于表格的右下方时,再次点击标签将跳转到另一个组件,在此case a JTextField。

我使用KeyListener来完成此操作,以便用户只需在表格中进行选项卡。我遇到的问题是,如果用户正在编辑单元格,然后按Tab键,TableCellEditor似乎有焦点,我添加到表中的KeyListener不会被调用。从我在文档中可以看出,CellEditor只能有一个CellEditorListener,它只能有一个ChangeEvent,这对我在这里尝试做的事情不起作用。

有人知道这方面的解决方法,还是我没想过的技巧?

2 个答案:

答案 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”工作人员)。