JFormattedTextField
* to display and edit numbers. Shows null
* * * To look under the hood of this component, this class exposes * the bound properties text, value and editValid. * * @author Karsten Lentzsch * @version $Revision: 1.8 $ * * @see JFormattedTextField * @see JFormattedTextField.AbstractFormatter */ public final class DateExample { public static void main(String[] args) { try { UIManager.setLookAndFeel("com.jgoodies.looks.plastic.PlasticXPLookAndFeel"); } catch (Exception e) { // Likely Plastic is not in the classpath; ignore it. } JFrame frame = new JFrame(); frame.setTitle("Formatted :: Dates"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JComponent panel = new DateExample() .buildPanel(); frame.getContentPane().add(panel); frame.pack(); TutorialUtils.locateOnScreenCenter(frame); frame.setVisible(true); } /** * Builds and returns a panel with a header row and the sample rows. * * @return the example panel with a header and the sample rows */ public JComponent buildPanel() { FormLayout layout = new FormLayout( "r:max(80dlu;pref), 4dlu, 45dlu, 1dlu, pref, 4dlu, pref, 0:grow"); DefaultFormBuilder builder = new DefaultFormBuilder(layout); builder.setDefaultDialogBorder(); builder.getPanel().setFocusTraversalPolicy( MyFocusTraversalPolicy.INSTANCE); Utils.appendTitleRow(builder, "Description"); List fields = appendDemoRows(builder); String validText = DateFormat.getDateInstance().format(new Date(67, 11, 5)); String invalidText = "aa" + validText; Utils.appendButtonBar(builder, fields, validText, invalidText); return builder.getPanel(); } /** * Appends the demo rows to the given builder and returns the List of * formatted text fields. * * @param builder the builder used to add components to * @return the List of formatted text fields */ private List appendDemoRows(DefaultFormBuilder builder) { // The Formatter is choosen by the initial value. JFormattedTextField defaultDateField = new JFormattedTextField(new Date()); // The Formatter is choosen by the given Format. JFormattedTextField noInitialValueField = new JFormattedTextField(DateFormat.getDateInstance()); // Uses a custom DateFormat. DateFormat customFormat = DateFormat.getDateInstance(DateFormat.SHORT); JFormattedTextField customFormatField = new JFormattedTextField(new DateFormatter(customFormat)); // Uses a RelativeDateFormat. DateFormat relativeFormat = new RelativeDateFormat(); JFormattedTextField relativeFormatField = new JFormattedTextField(new DateFormatter(relativeFormat)); // Uses a custom DateFormatter that allows relative input and // prints natural language strings. JFormattedTextField relativeFormatterField = new JFormattedTextField(new RelativeDateFormatter()); // Uses a custom FormatterFactory that used different formatters // for the display and while editing. DefaultFormatterFactory formatterFactory = new DefaultFormatterFactory(new RelativeDateFormatter(false, true), new RelativeDateFormatter(true, true)); JFormattedTextField relativeFactoryField = new JFormattedTextField(formatterFactory); // Wraps a DateFormatter to map empty strings to null and vice versa. JFormattedTextField numberOrNullField = new JFormattedTextField(new EmptyDateFormatter()); // Wraps a DateFormatter to map empty strings to -1 and vice versa. Date epoch = new Date(0); // January 1, 1970 JFormattedTextField numberOrEmptyValueField = new JFormattedTextField(new EmptyDateFormatter(epoch)); numberOrEmptyValueField.setValue(epoch); // Commits value on valid edit text DefaultFormatter formatter = new RelativeDateFormatter(); formatter.setCommitsOnValidEdit(true); JFormattedTextField commitOnValidEditField = new JFormattedTextField(formatter); // A date field as created by the BasicComponentFactory: // Uses relative date input, and maps empty strings to null. ValueModel dateHolder = new ValueHolder(); JFormattedTextField componentFactoryField = ExampleComponentFactory.createDateField(dateHolder); Format displayFormat = new DisplayFormat(DateFormat.getDateInstance()); List fields = new LinkedList(); fields.add(Utils.appendRow(builder, "Default", defaultDateField, displayFormat)); fields.add(Utils.appendRow(builder, "No initial value", noInitialValueField, displayFormat)); fields.add(Utils.appendRow(builder, "Empty <-> null", numberOrNullField, displayFormat)); fields.add(Utils.appendRow(builder, "Empty <-> epoch", numberOrEmptyValueField, displayFormat)); fields.add(Utils.appendRow(builder, "Short format", customFormatField, displayFormat)); fields.add(Utils.appendRow(builder, "Relative format", relativeFormatField, displayFormat)); fields.add(Utils.appendRow(builder, "Relative formatter", relativeFormatterField, displayFormat)); fields.add(Utils.appendRow(builder, "Relative factory", relativeFactoryField, displayFormat)); fields.add(Utils.appendRow(builder, "Commits on valid edit", commitOnValidEditField, displayFormat)); fields.add(Utils.appendRow(builder, "Relative, maps null", componentFactoryField, displayFormat)); return fields; } } validation.zip( 654 k)