4

我有一个包含 JComboBox 编辑器的 JTable 初始化有点像

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

这工作正常,但我希望能够在表格中导航并仅使用键盘更新值。现在这可以通过组合框实现,但如果我想更新值“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 但如果有一个更简单的解决方案会很好 =)

兄弟,图科

4

2 回答 2

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. 这种方法的原因是如果编辑器组件还不可见,焦点请求将失败。

希望这可以帮助任何人。

于 2013-05-17T12:21:41.220 回答
0

您必须将 a 添加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
        }
    }
});

您还可以将此解决方案与将 keyCode 与操作接口相关联的字典结合使用。

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

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
    }
}

我希望这可以帮助你。

问候!

于 2011-07-27T08:19:59.333 回答