2

我正在使用JFormattedTextFieldfor 来格式化 Swing 应用程序的整数输入。无效输入的默认行为是悄悄地(即没有错误消息)将文本字段重置为其先前的值。我想JOptionPane在将焦点返回到JFormattedTextField.

FocusListener我最初的解决方案是为我的文本字段实现s 。我考虑为每个实例添加相同FocusListener子类的实例,但由于我使用的是 NetBeans GUI Builder,因此遇到了问题。@HovercraftFullOfEels 建议我使用InputVerifier. 我已经实现了以下自定义 InputVerifier:

public class ValidTextFormatInputVerifier extends InputVerifier {

    @Override
    public boolean verify(JComponent jc) {
        return ((JFormattedTextField)jc).isEditValid();
    }
}

JFormattedTextField在进一步研究这一点时,我得到了内部使用的印象InputVerifier。(不过,我还没有在任何地方发现这一点。)因此,我的习惯InputVerifier似乎是多余的。

更大的问题是文本字段仍然静默重置,没有任何错误消息。我可以在JOptionPane.showMessageDialog()这里添加一个电话。但是,这似乎不是显示错误消息的合适位置。不知道无效输入的InputVerifier确切性质,也不知道有效输入的格式,这对于提供有意义的错误消息更为关键。

想到的第一个解决方案是添加一个构造函数,该构造函数接受一个String包含要显示的错误消息的参数。不过,这似乎是我将错误消息逻辑放在了错误的位置。

是否有用于错误处理和向用户提供消息的通用 Java 习惯用法?您如何建议我设计我的应用程序以清晰地显示错误消息?此外,如果我决定使用不同的平台(例如命令行、移动设备等)为软件设计一个界面,我希望能够尽可能多地重用我现有的代码库。(当然,由于这主要是一个 UI 问题,因此该要求可能不像我在这里想要的那样强烈适用。)

4

2 回答 2

5

我的第一个观点是,每当文本字段焦点丢失时向用户显示 JOptionPane 对用户来说可能非常烦人。当用户点击表单的 OK 按钮时,我会显示一条错误消息。错误消息可以包含所有错误消息的列表,也可以只包含第一个错误消息,并将错误集中在元素上。

另一种选择是使用常规JTextField并编写您自己的自定义验证器。当焦点改变时,您的 IntegerValidator(或其他实现)将验证输入字符串,并且 UI 可能会在字段旁边显示错误或警告图标,这与某些 Web 应用程序相同。

于 2012-08-28T18:39:39.440 回答
4

我会看看JLayer (Java 7) 或JXLayer (Java 6 & below)

这将允许您使用不同状态的真实性来装饰字段或表单。

至于什么时候。

我会从使用某种荧光笔开始,Dan 建议使用图标,这是一个好主意,再加上JLayer/JXLayer这会减少对表单的整体影响。

我会等到用户尝试提交表单,然后再显示对话框并强制焦点回到无效字段。

基本思想是允许用户在没有太多限制的情况下自由移动表单(因为并非所有人都以线性方式思考),但鼓励他们纠正他们在此过程中产生的任何可能的错误,而不必等到他们提交表单以查找错误(想想您曾经使用过的最糟糕的网络表单,不要这样做)

显然,如果他们尝试提交有错误的表单,您将希望显示错误消息并突出显示第一个违规字段

有关JLayer/JXLayer的示例,请查看使用 JXLayer 的验证覆盖以及如何装饰组件

于 2012-08-28T20:32:16.993 回答