JTable与复杂的编辑器

Tom*_*tin 8 java user-interface swing editor jtable

我有很多针对JTable的自定义编辑器,并且认为可用性,特别是关于使用键盘编辑的可用性是缺乏的,这是轻描淡写的.

这样做的主要原因是我的编辑器总是创建一个类似的(虽然通常更复杂)的情况:

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
  JPanel container = new JPanel();
  container.setLayout(new BorderLayout());
  container.add(field, BorderLayout.CENTER);
  field.setText((String) value);
  container.add(new JButton("..."), BorderLayout.EAST);
  return container;
}
Run Code Online (Sandbox Code Playgroud)

IE是一个内部有多个组件的面板.实际的文本编辑器是作为编辑器返回的组件的后代.所以,从我所知的问题来看,除了渲染问题之外,JTable正在关注getTableCellEditorComponent方法返回的组件,因此当您按下一个突出显示单元格的键时,它会通过焦点并按下按键到面板,认为是编辑器.
无论如何我可以通知JTable"真正的"编辑器是JTextfield吗?requestFocusInWindow在正确的组件上添加hacky 是不够的,因为按键不会被传递.

Bar*_*end 2

如果我正确地阅读了您的问题,您希望用户能够立即在单元格中键入内容,而无需先激活单元格编辑器,即,您希望激活单元格的任何击键都成为输入到文本字段中的第一个字符。

我的第一次尝试是在 KeyboardFocusManager 的 focusOwner 属性上添加 propertyChangeListener,结果发现焦点永远不会离开 JTable。您可能也遇到过这种情况。是时候实施 B 计划了。

我通过向表中添加一个 KeyListener 来实现“第一次按键”,该表记录实例字段中 keyPressed() 方法的最后一个 KeyEvent。getTableCellEditorComponent() 方法从那里读取字符。我还需要那个 hacky requestFocusInWindow() 调用你提到用户是否要在第一个字符之后继续输入任何字符。

对于我的示例应用程序,我创建了 JTable 的子类,它向自身添加了 KeyListener。让您的 CellEditor 实例实现 KeyListener 并将其添加到常规 JTable 中是一个更好的主意,但我将把它留给您。

这是我修改后的代码片段:

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    JPanel container = new JPanel();
    container.setLayout(new BorderLayout());
    container.add(field, BorderLayout.CENTER);

    // Will want to add an instanceof check as well as a check on Character.isLetterOrDigit(char).
    char keypressed = ((StickyKeypressTable)table).getLastKeyPressed();
    field.setText(String.valueOf(keypressed));

    container.add(new JButton("..."), BorderLayout.EAST);

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            // This needs to be in an invokeLater() to work properly
            field.requestFocusInWindow();
        }
    });
    return container;
}
Run Code Online (Sandbox Code Playgroud)

就肮脏程度而言,这与 Vogon Poetry 的地位相当,但它应该可以解决您眼前的问题。