单击JTextField时,在JTable单元中设置StopCellEditing不会停止编辑

时间:2019-01-14 01:40:22

标签: java swing jtable jtextfield

在我的代码中,我有一些JTextField和一个带有多列和多行的单独的JTable。我想验证表中的特定单元格,如果该单元格无效,则不允许用户将光标移动到另一个字段。如果用户将光标移动到表中的其他单元格(不同的行或列),我的代码将正常工作,但是如果我将光标移动到表单上的其他字段,则光标将被移动。我已经验证了我的stopCellEditing函数已被调用并返回false。无效时,我将边框变成红色。这可以正常工作,并且按预期,只是光标在移动。 这是我的代码。

要使用的受影响列的单元格编辑器是使用

设置的
    // Set up the verifier to make sure the user has entered a valid value
    statusTable.getColumn(statusTable.getColumnName(1)).
            setCellEditor(new CellEditor(new SvidVerifier(), this));

我的扩展DefaultCellEditor是

class CellEditor extends DefaultCellEditor {

  InputVerifier verifier = null;
  ModView view = null;

  public CellEditor(InputVerifier verifier, ModView view) {
    super(new JTextField());
    this.verifier = verifier;
    this.view = view;
  }

  @Override
  public boolean stopCellEditing() {
    if (KeyboardFocusManager.getCurrentKeyboardFocusManager().
            getFocusOwner() == view.publicBrowseButton) {
      super.cancelCellEditing();
      return true;
    }
    boolean canStop = verifier.verify(editorComponent) &&
            super.stopCellEditing();
    return canStop;
  }
}

我的验证者是

class IdVerifier extends InputVerifier {
  @Override
  public boolean verify(JComponent input) {
    JTextField tf = (JTextField) input;
    try {
      if ((Integer.parseInt(tf.getText()) >= 1) &&
              (Integer.parseInt(tf.getText()) <= 32)) {
        tf.setBorder(new LineBorder(
                UIManager.getColor("activeCaptionBorder")));
        return true;
      } else {
        tf.setBorder(new LineBorder(Color.RED));
        return false;
      }
    } catch (Exception ex) {
      tf.setBorder(new LineBorder(Color.RED));
      return false;
    }
  }
}

谢谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如我所见,该表被告知停止编辑,仅此而已。 CellEditor界面未提及stopCellEditing的焦点处理。

您可能必须将焦点侦听器绑定到表单上的其他组件,然后在该侦听器中,验证先前的焦点是否在表上。如果是这样,并且表格仍在编辑中,请将焦点重新设置到表格上。

答案 1 :(得分:0)

使用@camickr指出的文章,我能够通过使用intent.getData();函数成功完成所需的工作并解决了我的问题。