1

我正在开发一个 JFrame,其中包含一个 JTable 和一些其他元素。我希望用户能够做的是通过表格(具有设定的行数)进行选项卡,然后当焦点位于表格的右下方时,再次点击选项卡将跳转到另一个组件,在这个案例一个 JTextField。

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

有谁知道这个的解决方法,或者我没有想到的技巧?

4

2 回答 2

3

我使用 KeyListener 来完成此操作,以解决用户只是在表格中进行选项卡的情况。

不要使用 KeyListener。Swing 被设计为与键绑定一起使用。

请参阅Table Tabbing以了解如何在提供自定义的同时重用现有选项卡操作的方法。由于这种方法使用默认选项卡操作,因此希望它也能解决您的问题。

于 2013-05-10T16:15:02.190 回答
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”人员)。

于 2013-05-11T09:59:43.357 回答