2010-01-27 55 views
4

我有含初始化有点像JTable的JComboBox的使用编辑:是否有可能与一个按键

JComboBox comboBox = ...; 
TableColumn tc = table.getColumnModel().getColumn(i); 
tc.setCellEditor(new DefaultCellEditor(comboBox)); 

到此JComboBox编辑一个JTable编辑从键盘单元格的值是否正常或者很好,但我会喜欢能够在表格中导航并仅使用键盘更新值。现在可以使用组合框,但是如果我想更新值“1”,我必须先按一个键激活组合框,然后按“1”选择项目。

所以,我想要的是,我可以按“1”,该项目将被选中只有一个按键。

因为我已经设法与prepareEditor做到这一点类似下面的文本的单元格...

@Override 
public Component prepareEditor(TableCellEditor editor, int row, int column) { 
    Component c = super.prepareEditor(editor, row, column); 
    if (c instanceof JTextComponent) { 
     ((JTextComponent) c).selectAll(); 
    } 
    return c; 
} 

...但我没有设法找出与组合框做。

一种可能是自己的TableCellEditor的,但如果有一个更简单的解决方案,将是很好=)

BR, Touko

+1

您可以随时用KeyListener自己捕捉按键。或者您的问题更多,一旦您知道按下了哪个按键,您将如何给予恰当的JComboBox焦点。 – Pace 2010-01-27 13:13:42

+0

或者可能重写JTable#processKeyBinding或JTable#processKeyEvent ..还是要看看是否有一些更简单的解决方案=) – Touko 2010-01-27 15:42:38

+0

我知道这是一个老问题,但我很想知道人们如何设法实现这一点。 – Andree 2013-05-17 11:04:51

回答

0

您必须添加一个KeyListener到您的代码。

最好的解决办法是把它添加到JTable组件你在哪里铺设JComboBox和实施方法keyPressed(KeyEvent e)keyReleased(KeyEvent e)一个为了知道哪些是关键,做必要的行动。

在这里,我给你举个例子:

JTable table = new JTable(); 

// Your necessary code (create combo box, cell editor...etc) 

table.addKeyListener(new KeyListener() { 

    public void keyTyped(KeyEvent e) { 
    } 

    public void keyReleased(KeyEvent e) { 
    } 

    public void keyPressed(KeyEvent e) { 
     int keyCode = e.getKeyCode(); 
     switch(keyCode) { 
     case KeyEvent.VK_1: 
      // manage key 1 
      break; 
     case KeyEvent.VK_A: 
      // manage key A 
      break; 
     case KeyEvent.VK_F1: 
      // manage key F1 
      break; 
     case KeyEvent.VK_TAB: 
      // manage key TAB 
      break; 
     default: 
      // manage other keys 
     } 
    } 
}); 

您也可以用它涉及与动作界面键代码字典该解决方案结合起来。

这第二个解决方案需要下面的代码: 全局属性(字典):

Map<Integer,MyAction> keyActions = new Hashmap<Integer,MyAction>(); 

一个自己的行动接口:

public interface MyAction { 

    public void doAction(); 
} 

而且KeyListener.keyPressed()函数将如下:

public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    MyAction ma = keyActions.get(keyCode); 
    if (ma != null) { 
     ma.doAction(); 
    } 
    else { 
     // do default action for other keys 
    } 
} 

我希望这可以帮助你。

问候!

2

如果有些人仍然有兴趣,我做一个简单的修改Touko的代码,这对我的作品:

public class CustomTable extends JTable { 
    private static final long serialVersionUID = -8855616864660280561L; 

    public CustomTable(TableModel tableModel) { 
     super(tableModel); 
    } 

    @Override 
    public Component prepareEditor(TableCellEditor editor, int row, int column) { 
     final Component comp = super.prepareEditor(editor, row, column); 

     // Text component should select all text when initiated for editing. 
     if (comp instanceof JTextComponent) 
      ((JTextComponent) comp).selectAll(); 

     // Try to obtain focus for the editor component. 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override public void run() { comp.requestFocusInWindow(); } 
     }); 

     return comp; 
    } 
} 

所以基本上,我使用的是在一段时间后只是请求焦点编辑器组件SwingUtilities.invokeLater。这种方法的原因是因为如果编辑器组件还不可见,焦点请求将失败。

希望这可以帮助任何人。

相关问题