I am using a JFormattedTextField
for to format integer input for a Swing app. The default behavior for invalid input is to quietly (i.e. no error message) reset the text field to it's prior value. I want to display an error message with JOptionPane
before returning focus to the JFormattedTextField
.
My original solution was to implement FocusListener
s for my text fields. I considered adding instances of the same FocusListener
subclass to each one, but have encountered problems since I am using the NetBeans GUI Builder. @HovercraftFullOfEels suggested that I use an InputVerifier
. I have implemented the following custom InputVerifier:
public class ValidTextFormatInputVerifier extends InputVerifier {
@Override
public boolean verify(JComponent jc) {
return ((JFormattedTextField)jc).isEditValid();
}
}
While looking into this further, I get the impression that JFormattedTextField
uses InputVerifier
internally. (I haven't found this explicitly stated anywhere yet, though.) Because of this, my custom InputVerifier
seems superfluous.
The bigger issue is that the text field is still reset silently without any error message. I could add a call to JOptionPane.showMessageDialog()
here. However this does not seem an appropriate place to display error messages. The InputVerifier
does not know the exact nature of the invalid input, nor does it know the format of valid input, which is even more crucial to providing a meaningful error message.
The first solution that comes to mind is to add a constructor which takes a String
parameter that contains the error message to display. This seems like I'm putting the error message logic in the wrong place, though.
Is there a common Java idiom for error handling and providing messages to the user? How do you suggest that I design my application to cleanly display error messages? Also, if I decide to design an interface for the software using a different platform (e.g. command-line, mobile, etc.), I want to be able to reuse as much of my existing code-base as possible. (Of course, since this is mostly a UI issue, perhaps that requirement doesn't apply as strongly as I would like here.)