我使用JFormattedTextField
来格式化Swing应用程序的整数输入。无效输入的默认行为是安静地(即没有错误消息)将文本字段重置为其先前值。我希望在将焦点返回到JOptionPane
之前显示包含JFormattedTextField
的错误消息。
我原来的解决方案是为我的文本字段实现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习惯用法?您如何建议我设计我的应用程序以干净地显示错误消息?此外,如果我决定使用不同的平台(例如命令行,移动设备等)为软件设计界面,我希望能够尽可能多地重用现有的代码库。 (当然,由于这主要是一个UI问题,也许这个要求并不像我想的那样强烈适用。)
答案 0 :(得分:4)
我的第一个意见是,每当文本字段焦点丢失时向用户显示JOptionPane对用户来说可能非常烦人。当用户点击表单的“确定”按钮时,我会显示一条错误消息。错误消息可能包含所有错误消息的列表,或仅包含第一个错误消息的列表,并将该元素与错误集中在一起。
另一种选择是使用常规JTextField
并编写自己的自定义验证器。焦点更改时,IntegerValidator(或其他实现)将验证输入字符串,UI可能会在字段旁边显示错误或警告图标,与某些Web应用程序相同。
答案 1 :(得分:4)
我看一下JLayer(Java 7)或JXLayer(Java 6及以下)
这将允许您用真实的不同状态来装饰字段或表单。
至于何时。
我首先使用某种荧光笔,Dan建议使用图标,这是一个好主意,加上JLayer
/ JXLayer
这会降低对表单的整体影响。
我要等到用户在显示对话框之前尝试提交表单&强制焦点回到无效字段。
基本思想是允许用户自由地移动表单而不受太多限制(导致并非所有人都以线性方式思考),而是鼓励他们纠正他们正在产生的任何可能的错误,而不必等到他们提交表单以找出错误(想想你曾经使用过的更糟糕的网页形式,不要这样做)
显然,如果他们尝试提交有错误的表单,您将需要显示错误消息并突出显示第一个违规字段
有关JLayer
/ JXLayer
的示例,请查看Validation overlays using JXLayer& How to decorate components