【问题标题】:Prevent Java Swing JTable losing focus when invalid data entered防止输入无效数据时 Java Swing JTable 失去焦点
【发布时间】:2012-05-29 22:23:26
【问题描述】:

我们目前在 java swing 中遇到了 JTable/JTextEditor 的焦点问题。 JTable 有一个自定义单元格编辑器,它是 JTextField

问题是当一个单元格被编辑并且包含无效数据时,用户点击JButton,文本字段将停止编辑并调用JButton actionPerformed(点击)。 JTable#setValueAt 处理验证,因此如果 JTextField 中的数据无效,则底层 TableModel 不会更新。

理想情况下,我们不想让JButton 点击发生。焦点应留在JTableJTextField

单击按钮将执行提交操作并关闭表格所在的框架。由于TableModel#setValueAt 中的验证不会更新值,它会提交旧值。

这可以吗?我对 Swing 还很陌生,所以我不知道要检查什么。

不幸的是,我们的代码不是直截了当的。 UI 是从 XML 构造的,使得按钮对表单上的任何其他内容一无所知(这是我继承的代码)。

在 .net 中,您可以通过处理 Validating 事件并设置取消标志来阻止控件失去焦点。 Java有没有类似的机制。

【问题讨论】:

  • 为了更好的帮助,请尽快使用SSCCE编辑您的问题
  • 您能告诉我们按钮的用途吗?为什么用户会点击它,为什么它首先存在?你不能在他们打字时简单地禁用按钮吗?帮助我们了解具体的用例,我们可以更准确地帮助您。
  • 干杯,伙计们。稍微编辑问题以帮助尝试绘制图片。我更习惯 .NET,由于我们系统的复杂性,我无法真正发布代码 sn-p。不过,我会尝试用表格和按钮编写一个简单的场景。

标签: java swing focus jtable tablecelleditor


【解决方案1】:

您可以尝试在编辑器组件(即文本字段)上使用 inputverifier 吗?

【讨论】:

    【解决方案2】:

    当一个组件失去焦点时,会调用失去焦点的方法(更多参考http://docs.oracle.com/javase/tutorial/uiswing/events/focuslistener.html)。因此,您可以在失去焦点时调用验证方法。

    如果您不需要知道正在编辑的特定字段,您也可以在按钮内执行验证,如果不成功则阻止提交。

    【讨论】:

      【解决方案3】:

      setValueAt() 中编辑结束后验证输入可能会很晚。编辑器本身可以排除无效值的导航,如链接到相应 tutorial sectionexample 所示。

      对于有效值,您可以在失去焦点时使表格提交:

      table.putClientProperty("terminateEditOnFocusLost", true);
      

      【讨论】:

      • 嗨垃圾神,客户端属性似乎很有趣,但它们似乎在 Java 中没有记录。并且是特定于组件的。您知道任何列出每个组件的这些属性的好资源吗?谢谢
      • 检查JTable 源,靠近CellEditorRemover
      【解决方案4】:

      我通过覆盖我的JTableCellEditor 中的stopCellEditing 方法实现了类似的功能。

      @Override
      public boolean stopCellEditing() {
         String s = (String) getCellEditorValue();       
         if (s != null) {           
             if (!testYourValue()) {           
                 Toolkit.getDefaultToolkit().beep();           
                 return false;
             }
         }
         return super.stopCellEditing();
      } 
      

      【讨论】:

      • 覆盖stopCellEditing 将不起作用。当表格失去焦点时,stopCellEditing 方法中的内容无关紧要,单元格编辑器将关闭,单元格的值将恢复为原来的值。
      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      相关资源
      最近更新 更多