【问题标题】:Setting StopCellEditing in JTable Cell Doesn't Stop Editing When Clicking in JTextField在 JTable 单元格中设置 StopCellEditing 在 JTextField 中单击时不会停止编辑
【发布时间】:2019-06-08 01:10:09
【问题描述】:

在我的代码中,我有一些 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;
    }
  }
}

感谢您的帮助。

【问题讨论】:

  • 查看:stackoverflow.com/questions/20390445/… 示例编辑器,它强制您输入“5 个字符”的字符串。您应该能够自定义工作示例以满足您的编辑要求。
  • @camickr 这正是我需要做的事情。简单有效。谢谢。

标签: java swing jtable jtextfield


【解决方案1】:

使用@camickr 指出的文章,我能够使用TextField.requestFocusInWindow() 函数成功完成我需要的工作并解决我的问题。

【讨论】:

    【解决方案2】:

    在我看来,表格被告知停止编辑,但仅此而已。 CellEditor 界面没有提及stopCellEditing 的焦点处理。

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

    【讨论】:

    • 我怀疑我可能需要做这样的事情,但它的簿记方面不是我想要的,特别是因为我(错误地)觉得我正在做的事情应该小心的问题。我使用了@camickr 响应(指向不同的页面)并且效果很好。感谢您的回复。
    猜你喜欢
    • 2016-11-18
    • 2010-12-07
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2013-05-30
    相关资源
    最近更新 更多