2012-08-28 39 views
1

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

我原来的解决方案是为我的文本字段实现FocusListener。我考虑为每个子类添加相同的FocusListener子类的实例,但自从使用NetBeans GUI Builder以来遇到了问题。 @HovercraftFullOfEels suggested我使用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语言用于错误处理和向用户提供消息?你如何建议我设计我的应用程序以清晰地显示错误消息?另外,如果我决定使用不同平台(例如命令行,移动设备等)为软件设计界面,我希望能够尽可能多地重复使用我现有的代码库。 (当然,因为这主要是一个用户界面问题,也许这个要求并不像我想要的那样强烈。)

回答

4

我的第一个看法是,当文本字段焦点丢失时向用户显示一个JOptionPane可能会让用户非常讨厌。当用户点击表单的“确定”按钮时,我会显示一条错误消息。错误消息可能包含所有错误消息的列表或仅包含第一个错误消息,并将错误的元素集中在一起。

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

+0

呜呜呜......我没有想到一个图标旁边的领域。我想我会在下一个版本中添加这个功能。 –

+0

某些框架还会在该字段旁边显示一条简短的错误消息。不知道它会是什么样子的Swing应用程序:) –

+0

无论机制我决定使用通知无效的输入的用户,我的核心问题是:什么是“最好”的设计?当*显示错误信息多于* how *显示错误信息时,我主要处理*。 –

4

我看看JLayer(Java 7中)或JXLayer(Java 6的下面&)

这将允许你来装饰领域或不同状态的真理形成。

至于何时。

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

我会等到用户试图显示一个对话框&迫使焦点回到无效字段前提交表单。

基本的想法是允许用户在没有太多限制的情况下自由地移动表单(不是所有人都以线性方式思考),而是鼓励他们纠正他们一路上产生的任何可能的错误,必须等到他们提交表单才能找到错误(想想你使用过的最差的网页表单,不要那么做)

显然,如果他们尝试提交带错误的表单,想要显示并出现错误信息并突出显示第一个违规字段

有关JLayer/JXLayer的示例,请参阅Validation overlays using JXLayer & How to decorate components

+0

一如既往,你对我有一些非常有见地的答案!这看起来像一些令人兴奋的东西(并且我正在用Java 7开发!)这看起来像我将不得不添加到2.0版的待办事项列表中。 –

+0

你还谈到了一个关于'InputVerifier'的问题,它已经给我带来了错误的方式。我不喜欢强制用户在将注意力集中到另一个组件之前输入正确值的想法。 –

+0

@代码大师我同意。我无法遵守“立即修理我”的领域。对许多用户来说,不要以线性方式来思考。我在工作中争辩了这一点,并最终赢得了(有一些让步)。基本上,你想“引导”用户,而不是砸头 - 不要害怕违反规则。有时,这将是需要用户来有效之前被允许继续前进场,这些都是“指导线”,“建议”不是一成不变的,在演唱会集,烧在地狱规则:P – MadProgrammer

相关问题