001: /*
002: * Copyright (c) 2003-2007 JGoodies Karsten Lentzsch. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JGoodies Karsten Lentzsch nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package com.jgoodies.validation.tutorial.formatted;
032:
033: import java.text.NumberFormat;
034: import java.util.LinkedList;
035: import java.util.List;
036:
037: import javax.swing.*;
038: import javax.swing.text.JTextComponent;
039:
040: import com.jgoodies.forms.builder.DefaultFormBuilder;
041: import com.jgoodies.forms.layout.FormLayout;
042: import com.jgoodies.validation.tutorial.util.MyFocusTraversalPolicy;
043: import com.jgoodies.validation.tutorial.util.TutorialUtils;
044:
045: /**
046: * Demonstrates the <code>JFormattedTextField</code> in different focus lost
047: * behavior modes. To look under the hood of this component, this class exposes
048: * the bound properties <em>text</em>, <em>value</em> and <em>editValid</em>.
049: *
050: * @author Karsten Lentzsch
051: * @version $Revision: 1.16 $
052: *
053: * @see JFormattedTextField
054: * @see javax.swing.InputVerifier
055: */
056:
057: public final class FocusLostBehaviorExample {
058:
059: /**
060: * Describes a focus lost behavior that is based on
061: * <code>JFormattedTextField.COMMIT</code> but locks focus
062: * if the edited text is invalid.
063: */
064: private static final int COMMIT_OR_LOCK = JFormattedTextField.COMMIT + 16;
065:
066: public static void main(String[] args) {
067: try {
068: UIManager
069: .setLookAndFeel("com.jgoodies.looks.plastic.PlasticXPLookAndFeel");
070: } catch (Exception e) {
071: // Likely Plastic is not in the classpath; ignore it.
072: }
073: JFrame frame = new JFrame();
074: frame.setTitle("Formatted :: Focus Lost Behavior");
075: frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
076: JComponent panel = new FocusLostBehaviorExample().buildPanel();
077: frame.getContentPane().add(panel);
078: frame.pack();
079: TutorialUtils.locateOnOpticalScreenCenter(frame);
080: frame.setVisible(true);
081: }
082:
083: /**
084: * Builds and returns a panel with a header row and the sample rows.
085: *
086: * @return the example panel with a header and the sample rows
087: */
088: public JComponent buildPanel() {
089: FormLayout layout = new FormLayout(
090: "r:max(80dlu;pref), 4dlu, 45dlu, 1dlu, center:pref, 4dlu, pref, 0:grow");
091:
092: DefaultFormBuilder builder = new DefaultFormBuilder(layout);
093: builder.setDefaultDialogBorder();
094: builder.getPanel().setFocusTraversalPolicy(
095: MyFocusTraversalPolicy.INSTANCE);
096:
097: Utils.appendTitleRow(builder, "Mode");
098: List<JTextComponent> fields = appendDemoRows(builder);
099: Utils.appendButtonBar(builder, fields, "42", "aa42");
100: return builder.getPanel();
101: }
102:
103: /**
104: * Appends the demo rows to the given builder and returns the List of
105: * formatted text fields.
106: *
107: * @param builder the builder used to add components to
108: * @return the List of formatted text fields
109: */
110: private List<JTextComponent> appendDemoRows(
111: DefaultFormBuilder builder) {
112: List<JTextComponent> fields = new LinkedList<JTextComponent>();
113: fields.add(appendRow(builder, JFormattedTextField.COMMIT));
114: fields.add(appendRow(builder,
115: JFormattedTextField.COMMIT_OR_REVERT));
116: fields.add(appendRow(builder, COMMIT_OR_LOCK));
117:
118: builder.appendRow("16dlu");
119: builder.nextLine(2);
120:
121: fields.add(appendRow(builder, JFormattedTextField.PERSIST));
122: fields.add(appendRow(builder, JFormattedTextField.REVERT));
123: return fields;
124: }
125:
126: /**
127: * Appends a row to the given builder that consists of
128: * a label for the focus lost behavior mode name,
129: * a <code>JFormattedTextField</code> configured with this focus lost behavior,
130: * a text label that displays the field's <em>value</em> property,
131: * and an icon label that is visible iff the field's <em>editValid</em>
132: * property is <code>true</code>.<p>
133: *
134: * The formatted text field is constructed with an Integer value
135: * and will accept Integers only.
136: *
137: * @param builder the builder used to append the components
138: * @param mode the focus lost behavior mode
139: * @return the created JFormattedTextField
140: */
141: private JTextComponent appendRow(DefaultFormBuilder builder,
142: int mode) {
143: return Utils.appendRow(builder,
144: focusLostBehaviorModeName(mode),
145: createFormattedTextField(mode), NumberFormat
146: .getIntegerInstance());
147: }
148:
149: /**
150: * Creates and return a formatted text field with the specified
151: * focus lost behavior. The mode is either one of the modes
152: * of the <code>JFormattedTextField</code> or <code>COMMIT_OR_LOCK</code>.
153: * In the latter case, the <code>COMMIT</code> mode will be used
154: * and the focus will be locked down for invalid edit texts using
155: * the <code>FormattedTextFieldVerifier</code>.
156: *
157: * @param mode <code>COMMIT_OR_LOCK</code> or one of the
158: * focus lost behavior modes of the JFormattedTextField
159: * @return the JFormattedTextField that has been created
160: */
161: private JFormattedTextField createFormattedTextField(int mode) {
162: Object initialValue = Integer.valueOf(42);
163: boolean focusLocked = mode == COMMIT_OR_LOCK;
164:
165: JFormattedTextField field = new JFormattedTextField(
166: initialValue);
167: field
168: .setFocusLostBehavior(focusLocked ? JFormattedTextField.COMMIT
169: : mode);
170: if (focusLocked) {
171: field.setInputVerifier(new FormattedTextFieldVerifier());
172: }
173: return field;
174: }
175:
176: /**
177: * Returns a String representation for the specified focus lost behavior
178: * mode as used with <code>JFormattedTextField</code>.
179: *
180: * @param focusLostBehaviorMode the mode to be converted
181: * @return a String representation for the specified mode
182: *
183: * @see JFormattedTextField#setFocusLostBehavior(int)
184: */
185: private String focusLostBehaviorModeName(int focusLostBehaviorMode) {
186: switch (focusLostBehaviorMode) {
187: case JFormattedTextField.COMMIT:
188: return "Commit";
189: case JFormattedTextField.COMMIT_OR_REVERT:
190: return "Commit or Revert";
191: case JFormattedTextField.REVERT:
192: return "Revert";
193: case JFormattedTextField.PERSIST:
194: return "Persist";
195: case COMMIT_OR_LOCK:
196: return "Focus Locked";
197: default:
198: return "Unknow focus lost behavior";
199: }
200: }
201:
202: }
|