Java/Swing JFC/TextField
Содержание
- 1 Add key listener event handler to JTextField
- 2 A hack to make a JTextField really 2 columns wide
- 3 Aligning the Text in a JTextField Component
- 4 A simple label for field form panel
- 5 Associate JLabel component with a JTextField
- 6 Auto complete TextField
- 7 Based on JTextField content, enable or disable a JButton
- 8 Bounded TextField
- 9 Create the textfield
- 10 Cut, paste, and copy in a JTextField under program control.
- 11 EditabilityExample
- 12 extends JTextField to create integer JTextField
- 13 FieldEdit - an Applet to validate data as it"s being entered
- 14 Firing Item Events
- 15 JTextField Alignment Sample
- 16 JTextField Max Length
- 17 JTextField Sample 2
- 18 JTextField Verifier Sample
- 19 Limit JTextField input to a maximum length
- 20 Make a Text Field two columns wide
- 21 Make sure that my JTextField has the focus when a JFrame is created
- 22 Make sure that my Text field has the focus when a JFrame is created
- 23 Make the ENTER key act like the TAB key
- 24 Modify horizontal alignment of text field at runtime
- 25 Non Wrapping(Wrap) TextPane
- 26 Numeric TextField
- 27 Overwritable TextField
- 28 Passive TextField 1
- 29 Passive TextField 2
- 30 Passive TextField 3
- 31 Right justified JTextfield content
- 32 Right justified JTextField contents
- 33 Set the focus on a particular JTextField
- 34 Setting up a textfield and modifying its horizontal alignment at runtime
- 35 Text Accelerator Example
- 36 TextField Elements
- 37 TextField Look Ahead Example
- 38 Textfield only accepts numbers
- 39 Text fields and Java events
- 40 TextFieldViews 2
- 41 TextField with Constaints
- 42 Validate a value on the lostFocus event
- 43 Water mark text field
Add key listener event handler to JTextField
<source lang="java">
import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.HeadlessException; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; public class Main extends JFrame {
public Main() throws HeadlessException { setSize(200, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new FlowLayout(FlowLayout.LEFT)); JLabel usernameLabel = new JLabel("Username: "); JTextField usernameTextField = new JTextField(); usernameTextField.setPreferredSize(new Dimension(100, 20)); add(usernameLabel); add(usernameTextField); usernameTextField.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { JTextField textField = (JTextField) e.getSource(); String text = textField.getText(); textField.setText(text.toUpperCase()); } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { } }); } public static void main(String[] args) { new Main().setVisible(true); }
}
</source>
A hack to make a JTextField really 2 columns wide
<source lang="java">
import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class WidthHack {
public static void main(String[] args) { JTextField tf = new JTextField("mm"); tf.setPreferredSize(tf.getPreferredSize()); tf.setText(""); JPanel pHacked = new JPanel(); pHacked.setBorder(new javax.swing.border.TitledBorder("hacked 2 columns")); pHacked.add(tf); JPanel pStock = new JPanel(); pStock.setBorder(new javax.swing.border.TitledBorder("stock 2 columns")); pStock.add(new JTextField(2)); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(new java.awt.GridLayout(0, 1)); frame.getContentPane().add(pHacked); frame.getContentPane().add(pStock); frame.setSize(150, 150); frame.setVisible(true); tf.requestFocus(); }
}
</source>
Aligning the Text in a JTextField Component
<source lang="java">
import javax.swing.JTextField; public class Main {
public static void main(String[] argv) { JTextField textfield = new JTextField("Initial Text"); // Left-justify the text textfield.setHorizontalAlignment(JTextField.LEFT); // Center the text textfield.setHorizontalAlignment(JTextField.CENTER); // Right-justify the text textfield.setHorizontalAlignment(JTextField.RIGHT); }
}
</source>
A simple label for field form panel
<source lang="java">
import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class TextForm extends JPanel {
private JTextField[] fields; // Create a form with the specified labels, tooltips, and sizes. public TextForm(String[] labels, char[] mnemonics, int[] widths, String[] tips) { super(new BorderLayout()); JPanel labelPanel = new JPanel(new GridLayout(labels.length, 1)); JPanel fieldPanel = new JPanel(new GridLayout(labels.length, 1)); add(labelPanel, BorderLayout.WEST); add(fieldPanel, BorderLayout.CENTER); fields = new JTextField[labels.length]; for (int i = 0; i < labels.length; i += 1) { fields[i] = new JTextField(); if (i < tips.length) fields[i].setToolTipText(tips[i]); if (i < widths.length) fields[i].setColumns(widths[i]); JLabel lab = new JLabel(labels[i], JLabel.RIGHT); lab.setLabelFor(fields[i]); if (i < mnemonics.length) lab.setDisplayedMnemonic(mnemonics[i]); labelPanel.add(lab); JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT)); p.add(fields[i]); fieldPanel.add(p); } } public String getText(int i) { return (fields[i].getText()); } public static void main(String[] args) { String[] labels = { "First Name", "Middle Initial", "Last Name", "Age" }; char[] mnemonics = { "F", "M", "L", "A" }; int[] widths = { 15, 1, 15, 3 }; String[] descs = { "First Name", "Middle Initial", "Last Name", "Age" }; final TextForm form = new TextForm(labels, mnemonics, widths, descs); JButton submit = new JButton("Submit Form"); submit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println(form.getText(0) + " " + form.getText(1) + ". " + form.getText(2) + ", age " + form.getText(3)); } }); JFrame f = new JFrame("Text Form Example"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(form, BorderLayout.NORTH); JPanel p = new JPanel(); p.add(submit); f.getContentPane().add(p, BorderLayout.SOUTH); f.pack(); f.setVisible(true); }
}
</source>
Associate JLabel component with a JTextField
<source lang="java">
import java.awt.FlowLayout; import java.awt.HeadlessException; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class Main extends JFrame {
public Main() throws HeadlessException { setSize(400, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new FlowLayout(FlowLayout.LEFT)); JLabel usernameLabel = new JLabel("Username: "); JLabel passwordLabel = new JLabel("Password: "); JTextField usernameField = new JTextField(20); JPasswordField passwordField = new JPasswordField(20); usernameLabel.setDisplayedMnemonic(KeyEvent.VK_U); usernameLabel.setLabelFor(usernameField); passwordLabel.setDisplayedMnemonic(KeyEvent.VK_P); passwordLabel.setLabelFor(passwordField); getContentPane().add(usernameLabel); getContentPane().add(usernameField); getContentPane().add(passwordLabel); getContentPane().add(passwordField); } public static void main(String[] args) { new Main().setVisible(true); }
}
</source>
Auto complete TextField
<source lang="java">
/* From http://java.sun.ru/docs/books/tutorial/index.html */ /*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
import java.util.List; import javax.swing.JTextField; import javax.swing.text.*; public class jexpAutoTextField extends JTextField {
class AutoDocument extends PlainDocument { public void replace(int i, int j, String s, AttributeSet attributeset) throws BadLocationException { super.remove(i, j); insertString(i, s, attributeset); } public void insertString(int i, String s, AttributeSet attributeset) throws BadLocationException { if (s == null || "".equals(s)) return; String s1 = getText(0, i); String s2 = getMatch(s1 + s); int j = (i + s.length()) - 1; if (isStrict && s2 == null) { s2 = getMatch(s1); j--; } else if (!isStrict && s2 == null) { super.insertString(i, s, attributeset); return; } if (autoComboBox != null && s2 != null) autoComboBox.setSelectedValue(s2); super.remove(0, getLength()); super.insertString(0, s2, attributeset); setSelectionStart(j + 1); setSelectionEnd(getLength()); } public void remove(int i, int j) throws BadLocationException { int k = getSelectionStart(); if (k > 0) k--; String s = getMatch(getText(0, k)); if (!isStrict && s == null) { super.remove(i, j); } else { super.remove(0, getLength()); super.insertString(0, s, null); } if (autoComboBox != null && s != null) autoComboBox.setSelectedValue(s); try { setSelectionStart(k); setSelectionEnd(getLength()); } catch (Exception exception) { } } } public jexpAutoTextField(List list) { isCaseSensitive = false; isStrict = true; autoComboBox = null; if (list == null) { throw new IllegalArgumentException("values can not be null"); } else { dataList = list; init(); return; } } jexpAutoTextField(List list, jexpAutoComboBox b) { isCaseSensitive = false; isStrict = true; autoComboBox = null; if (list == null) { throw new IllegalArgumentException("values can not be null"); } else { dataList = list; autoComboBox = b; init(); return; } } private void init() { setDocument(new AutoDocument()); if (isStrict && dataList.size() > 0) setText(dataList.get(0).toString()); } private String getMatch(String s) { for (int i = 0; i < dataList.size(); i++) { String s1 = dataList.get(i).toString(); if (s1 != null) { if (!isCaseSensitive && s1.toLowerCase().startsWith(s.toLowerCase())) return s1; if (isCaseSensitive && s1.startsWith(s)) return s1; } } return null; } public void replaceSelection(String s) { AutoDocument _lb = (AutoDocument) getDocument(); if (_lb != null) try { int i = Math.min(getCaret().getDot(), getCaret().getMark()); int j = Math.max(getCaret().getDot(), getCaret().getMark()); _lb.replace(i, j - i, s, null); } catch (Exception exception) { } } public boolean isCaseSensitive() { return isCaseSensitive; } public void setCaseSensitive(boolean flag) { isCaseSensitive = flag; } public boolean isStrict() { return isStrict; } public void setStrict(boolean flag) { isStrict = flag; } public List getDataList() { return dataList; } public void setDataList(List list) { if (list == null) { throw new IllegalArgumentException("values can not be null"); } else { dataList = list; return; } } private List dataList; private boolean isCaseSensitive; private boolean isStrict; private jexpAutoComboBox autoComboBox;
} import java.awt.event.ItemEvent; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.plaf.basic.BasicComboBoxEditor; public class jexpAutoComboBox extends JComboBox {
private class AutoTextFieldEditor extends BasicComboBoxEditor { private jexpAutoTextField getAutoTextFieldEditor() { return (jexpAutoTextField) editor; } AutoTextFieldEditor(java.util.List list) { editor = new jexpAutoTextField(list, jexpAutoComboBox.this); } } public jexpAutoComboBox(java.util.List list) { isFired = false; autoTextFieldEditor = new AutoTextFieldEditor(list); setEditable(true); setModel(new DefaultComboBoxModel(list.toArray()) { protected void fireContentsChanged(Object obj, int i, int j) { if (!isFired) super.fireContentsChanged(obj, i, j); } }); setEditor(autoTextFieldEditor); } public boolean isCaseSensitive() { return autoTextFieldEditor.getAutoTextFieldEditor().isCaseSensitive(); } public void setCaseSensitive(boolean flag) { autoTextFieldEditor.getAutoTextFieldEditor().setCaseSensitive(flag); } public boolean isStrict() { return autoTextFieldEditor.getAutoTextFieldEditor().isStrict(); } public void setStrict(boolean flag) { autoTextFieldEditor.getAutoTextFieldEditor().setStrict(flag); } public java.util.List getDataList() { return autoTextFieldEditor.getAutoTextFieldEditor().getDataList(); } public void setDataList(java.util.List list) { autoTextFieldEditor.getAutoTextFieldEditor().setDataList(list); setModel(new DefaultComboBoxModel(list.toArray())); } void setSelectedValue(Object obj) { if (isFired) { return; } else { isFired = true; setSelectedItem(obj); fireItemStateChanged(new ItemEvent(this, 701, selectedItemReminder, 1)); isFired = false; return; } } protected void fireActionEvent() { if (!isFired) super.fireActionEvent(); } private AutoTextFieldEditor autoTextFieldEditor; private boolean isFired;
}
</source>
Based on JTextField content, enable or disable a JButton
<source lang="java">
import javax.swing.JButton; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; public class Main {
JButton button = new JButton("foo"); JTextField textfield = new JTextField(10); Document document; public Main() { document = textfield.getDocument(); document.addDocumentListener(new JButtonStateController()); } class JButtonStateController implements DocumentListener { JButtonStateController() { } public void changedUpdate(DocumentEvent e) { disableIfEmpty(e); } public void insertUpdate(DocumentEvent e) { disableIfEmpty(e); } public void removeUpdate(DocumentEvent e) { disableIfEmpty(e); } public void disableIfEmpty(DocumentEvent e) { button.setEnabled(e.getDocument().getLength() > 0); } }
}
</source>
Bounded TextField
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.Toolkit; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; public class BoundedTextField extends JTextField implements
BoundedPlainDocument.InsertErrorListener { public BoundedTextField() { this(null, 0, 0); } public BoundedTextField(String text, int columns, int maxLength) { super(null, text, columns); if (text != null && maxLength == 0) { maxLength = text.length(); } BoundedPlainDocument plainDoc = (BoundedPlainDocument) getDocument(); plainDoc.setMaxLength(maxLength); plainDoc.addInsertErrorListener(this); } public BoundedTextField(int columns, int maxLength) { this(null, columns, maxLength); } public BoundedTextField(String text, int maxLength) { this(text, 0, maxLength); } public void setMaxLength(int maxLength) { ((BoundedPlainDocument) getDocument()).setMaxLength(maxLength); } public int getMaxLength() { return ((BoundedPlainDocument) getDocument()).getMaxLength(); } // Override to handle insertion error public void insertFailed(BoundedPlainDocument doc, int offset, String str, AttributeSet a) { // By default, just beep Toolkit.getDefaultToolkit().beep(); } // Method to create default model protected Document createDefaultModel() { return new BoundedPlainDocument(); } // Test code public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} JFrame f = new JFrame("Bounded Text Field Example"); BoundedTextField tf = new BoundedTextField(10, 32); JLabel l = new JLabel("Type up to 32 characters: "); f.getContentPane().add(tf, "East"); f.getContentPane().add(l, "West"); f.pack(); f.setVisible(true); }
} class BoundedPlainDocument extends PlainDocument {
public BoundedPlainDocument() { // Default constructor - must use setMaxLength later this.maxLength = 0; } public BoundedPlainDocument(int maxLength) { this.maxLength = maxLength; } public BoundedPlainDocument(AbstractDocument.Content content, int maxLength) { super(content); if (content.length() > maxLength) { throw new IllegalArgumentException( "Initial content larger than maximum size"); } this.maxLength = maxLength; } public void setMaxLength(int maxLength) { if (getLength() > maxLength) { throw new IllegalArgumentException( "Current content larger than new maximum size"); } this.maxLength = maxLength; } public int getMaxLength() { return maxLength; } public void insertString(int offset, String str, AttributeSet a) throws BadLocationException { if (str == null) { return; } // Note: be careful here - the content always has a // trailing newline, which should not be counted! int capacity = maxLength + 1 - getContent().length(); if (capacity >= str.length()) { // It all fits super.insertString(offset, str, a); } else { // It doesn"t all fit. Add as much as we can. if (capacity > 0) { super.insertString(offset, str.substring(0, capacity), a); } // Finally, signal an error. if (errorListener != null) { errorListener.insertFailed(this, offset, str, a); } } } public void addInsertErrorListener(InsertErrorListener l) { if (errorListener == null) { errorListener = l; return; } throw new IllegalArgumentException( "InsertErrorListener already registered"); } public void removeInsertErrorListener(InsertErrorListener l) { if (errorListener == l) { errorListener = null; } } public interface InsertErrorListener { public abstract void insertFailed(BoundedPlainDocument doc, int offset, String str, AttributeSet a); } protected InsertErrorListener errorListener; // Unicast listener protected int maxLength;
}
</source>
Create the textfield
<source lang="java">
import javax.swing.*; import java.awt.*; public class JTextFieldTest extends JFrame {
public JTextFieldTest() { super("JTextField Test"); getContentPane().setLayout(new FlowLayout()); JTextField textField1 = new JTextField("1", 1); JTextField textField2 = new JTextField("22", 2); JTextField textField3 = new JTextField("333", 3); getContentPane().add(textField1); getContentPane().add(textField2); getContentPane().add(textField3); setSize(300, 170); setVisible(true); } public static void main(String argv[]) { new JTextFieldTest(); }
}
</source>
Cut, paste, and copy in a JTextField under program control.
<source lang="java">
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; public class Main {
JTextField jtf = new JTextField(15); JButton jbtnCut = new JButton("Cut"); JButton jbtnPaste = new JButton("Paste"); JButton jbtnCopy = new JButton("Copy"); public Main() { JFrame jfrm = new JFrame("Cut, Copy, and Paste"); jfrm.setLayout(new FlowLayout()); jfrm.setSize(230, 150); jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jbtnCut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent le) { jtf.cut(); update(); } }); jbtnPaste.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent le) { jtf.paste(); update(); } }); jbtnCopy.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent le) { jtf.copy(); update(); } }); jtf.addCaretListener(new CaretListener() { public void caretUpdate(CaretEvent ce) { update(); } }); jfrm.add(jtf); jfrm.add(jbtnCut); jfrm.add(jbtnPaste); jfrm.add(jbtnCopy); jfrm.setVisible(true); } private void update() { System.out.println("All text: " + jtf.getText()); if (jtf.getSelectedText() != null) System.out.println("Selected text: " + jtf.getSelectedText()); else System.out.println("Selected text: "); } public static void main(String args[]) { new Main(); }
}
</source>
EditabilityExample
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.Timer; import javax.swing.UIManager; public class EditabilityExample {
public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} JFrame f = new JFrame("Editability Example"); f.getContentPane().setLayout( new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS)); f.getContentPane().add(firstField); JTextField tf = new JTextField("A read-only text field", 20); tf.setEditable(false); f.getContentPane().add(tf); JTextArea ta = new JTextArea("An editable\ntext area", 2, 20); ta.setBorder(BorderFactory.createLoweredBevelBorder()); f.getContentPane().add(ta); ta = new JTextArea("A read-only\ntext area", 2, 20); ta.setBorder(BorderFactory.createLoweredBevelBorder()); ta.setEditable(false); f.getContentPane().add(ta); f.pack(); f.show(); if (args.length == 1 && args[0].equals("disable")) { // Toggle the enabled state of the first // text field every 10 seconds Timer t = new Timer(10000, new ActionListener() { public void actionPerformed(ActionEvent evt) { firstField.setEnabled(!firstField.isEnabled()); firstField.setText(firstFieldText + (firstField.isEnabled() ? "" : " (disabled)")); } }); t.start(); } } final static String firstFieldText = "An editable text field"; final static JTextField firstField = new JTextField(firstFieldText, 20);
}
</source>
extends JTextField to create integer JTextField
<source lang="java">
/*
* Copyright (C) 2001-2003 Colin Bell * colbell@users.sourceforge.net * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
import java.awt.Toolkit; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; /**
* This class is a TextField
that only allows integer
* values to be entered into it.
*
* @author
*/
public class IntegerField extends JTextField {
/** * Default ctor. */ public IntegerField() { super(); } /** * Ctor specifying the field width. * * @param cols Number of columns. */ public IntegerField(int cols) { super(cols); } /** * Retrieve the contents of this field as an int. * * @return the contents of this field as an int. */ public int getInt() { final String text = getText(); if (text == null || text.length() == 0) { return 0; } return Integer.parseInt(text); } /** * Set the contents of this field to the passed int. * * @param value The new value for this field. */ public void setInt(int value) { setText(String.valueOf(value)); } /** * Create a new document model for this control that only accepts * integral values. * * @return The new document model. */ protected Document createDefaultModel() { return new IntegerDocument(); } /** * This document only allows integral values to be added to it. */ static class IntegerDocument extends PlainDocument { public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if (str != null) { try { Integer.decode(str); super.insertString(offs, str, a); } catch (NumberFormatException ex) { Toolkit.getDefaultToolkit().beep(); } } } }
}
</source>
FieldEdit - an Applet to validate data as it"s being entered
<source lang="java">
/*
* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002. * All rights reserved. Software written by Ian F. Darwin and others. * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS"" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee * cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s, * pioneering role in inventing and promulgating (and standardizing) the Java * language and environment is gratefully acknowledged. * * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for * inventing predecessor languages C and C++ is also gratefully acknowledged. */
import java.applet.Applet; import java.awt.Label; import java.awt.TextField; import java.awt.Toolkit; import java.awt.event.TextEvent; import java.awt.event.TextListener; /**
* FieldEdit - an Applet to validate data as it"s being entered. * * Not very general: a 52 minute hack to show the mechanics of editing. * * Does try to leave the cursor in exactly the right position. * * @author Ian Darwin, http://www.darwinsys.ru/ * @author Bjorn Gudehus, gothic@celestica.ru */
public class FieldEdit extends Applet {
/** The label to display the type of thing we"re editing */ private Label myLabel; /** The textfield to enter */ private TextField textField; /** Init() is an Applet method used to set up the GUI and listeners */ public void init() { add(myLabel = new Label("Hex:")); add(textField = new TextField(10)); textField.addTextListener(new TextListener() { public void textValueChanged(TextEvent ev) { int caret = -1; TextField tf = FieldEdit.this.textField; String s = tf.getText(); StringBuffer sb = new StringBuffer(); System.out.println("Text->" + s); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (Character.digit(c, 16) >= 0) sb.append(c); else caret = tf.getCaretPosition() - 1; } if (caret >= 0) { tf.setText(sb.toString()); tf.setCaretPosition(caret); Toolkit.getDefaultToolkit().beep(); } } }); }
}
</source>
Firing Item Events
<source lang="java">
import java.awt.ItemSelectable; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.event.EventListenerList; public class Main {
public static void main(String[] argv) throws Exception { MyComponent component = new MyComponent(); JFrame f = new JFrame(); f.add(component); f.setSize(300, 300); f.setVisible(true); }
} class MyComponent extends JTextField implements ItemSelectable {
protected EventListenerList listenerList = new EventListenerList(); public Object[] getSelectedObjects() { return new String[] { "a", "b", "c" }; } public void addItemListener(ItemListener l) { listenerList.add(ItemListener.class, l); } public void removeItemListener(ItemListener l) { listenerList.remove(ItemListener.class, l); } void fireItemEvent(Object item, boolean sel) { ItemEvent evt = new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, item, sel ? ItemEvent.SELECTED : ItemEvent.DESELECTED); Object[] listeners = listenerList.getListenerList(); for (int i = 0; i < listeners.length - 2; i += 2) { if (listeners[i] == ItemListener.class) { ((ItemListener) listeners[i + 1]).itemStateChanged(evt); } } }
}
</source>
JTextField Alignment Sample
<source lang="java">
import java.awt.Container; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JTextField; public class AlignmentSample {
public static void main(String args[]) { JFrame frame = new JFrame("Alignment Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container content = frame.getContentPane(); content.setLayout(new GridLayout(0, 1)); JTextField textField = new JTextField("Left"); textField.setHorizontalAlignment(JTextField.LEFT); content.add(textField); textField = new JTextField("Center"); textField.setHorizontalAlignment(JTextField.CENTER); content.add(textField); textField = new JTextField("Right"); textField.setHorizontalAlignment(JTextField.RIGHT); content.add(textField); textField = new JTextField("Leading"); textField.setHorizontalAlignment(JTextField.LEADING); content.add(textField); textField = new JTextField("Trailing"); textField.setHorizontalAlignment(JTextField.TRAILING); content.add(textField); frame.pack(); frame.setSize(250, (int) frame.getSize().getHeight()); frame.setVisible(true); }
}
</source>
JTextField Max Length
<source lang="java">
import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; public class JTextFieldMaxLength extends JTextField{
public JTextFieldMaxLength(int length){ this(null,length); } public JTextFieldMaxLength(String text, int length){ super(new PlainDocumentMaxLength(length),text,length); }
} class PlainDocumentMaxLength extends PlainDocument{
private int maxLength; public PlainDocumentMaxLength(int maxLength) { this.maxLength = maxLength; } public void insertString (int offset, String str, AttributeSet a) throws BadLocationException { if (getLength() + str.length() > maxLength) { // Toolkit.getDefaultToolkit().beep(); }else{ super.insertString(offset,str,a); } }
}
</source>
JTextField Sample 2
<source lang="java">
/* Definitive Guide to Swing for Java 2, Second Edition By John Zukowski ISBN: 1-893115-78-X Publisher: APress
- /
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.InputVerifier; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.JTextComponent; public class JTextFieldSample {
public static void main(String args[]) { String title = (args.length == 0 ? "TextField Listener Example" : args[0]); JFrame frame = new JFrame(title); Container content = frame.getContentPane(); JPanel namePanel = new JPanel(new BorderLayout()); JLabel nameLabel = new JLabel("Name: "); nameLabel.setDisplayedMnemonic(KeyEvent.VK_N); JTextField nameTextField = new JTextField(); nameLabel.setLabelFor(nameTextField); namePanel.add(nameLabel, BorderLayout.WEST); namePanel.add(nameTextField, BorderLayout.CENTER); content.add(namePanel, BorderLayout.NORTH); JPanel cityPanel = new JPanel(new BorderLayout()); JLabel cityLabel = new JLabel("City: "); cityLabel.setDisplayedMnemonic(KeyEvent.VK_C); JTextField cityTextField = new JTextField(); cityLabel.setLabelFor(cityTextField); cityPanel.add(cityLabel, BorderLayout.WEST); cityPanel.add(cityTextField, BorderLayout.CENTER); content.add(cityPanel, BorderLayout.SOUTH); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { System.out .println("Command: " + actionEvent.getActionCommand()); } }; nameTextField.setActionCommand("Yo"); nameTextField.addActionListener(actionListener); cityTextField.addActionListener(actionListener); KeyListener keyListener = new KeyListener() { public void keyPressed(KeyEvent keyEvent) { printIt("Pressed", keyEvent); } public void keyReleased(KeyEvent keyEvent) { printIt("Released", keyEvent); } public void keyTyped(KeyEvent keyEvent) { printIt("Typed", keyEvent); } private void printIt(String title, KeyEvent keyEvent) { int keyCode = keyEvent.getKeyCode(); String keyText = KeyEvent.getKeyText(keyCode); System.out.println(title + " : " + keyText + " / " + keyEvent.getKeyChar()); } }; nameTextField.addKeyListener(keyListener); cityTextField.addKeyListener(keyListener); InputVerifier verifier = new InputVerifier() { public boolean verify(JComponent input) { final JTextComponent source = (JTextComponent) input; String text = source.getText(); if ((text.length() != 0) && !(text.equals("Exit"))) { Runnable runnable = new Runnable() { public void run() { JOptionPane.showMessageDialog(source, "Can"t leave.", "Error Dialog", JOptionPane.ERROR_MESSAGE); } }; SwingUtilities.invokeLater(runnable); return false; } else { return true; } } }; nameTextField.setInputVerifier(verifier); cityTextField.setInputVerifier(verifier); DocumentListener documentListener = new DocumentListener() { public void changedUpdate(DocumentEvent documentEvent) { printIt(documentEvent); } public void insertUpdate(DocumentEvent documentEvent) { printIt(documentEvent); } public void removeUpdate(DocumentEvent documentEvent) { printIt(documentEvent); } private void printIt(DocumentEvent documentEvent) { DocumentEvent.EventType type = documentEvent.getType(); String typeString = null; if (type.equals(DocumentEvent.EventType.CHANGE)) { typeString = "Change"; } else if (type.equals(DocumentEvent.EventType.INSERT)) { typeString = "Insert"; } else if (type.equals(DocumentEvent.EventType.REMOVE)) { typeString = "Remove"; } System.out.print("Type : " + typeString + " / "); Document source = documentEvent.getDocument(); int length = source.getLength(); try { System.out .println("Contents: " + source.getText(0, length)); } catch (BadLocationException badLocationException) { System.out.println("Contents: Unknown"); } } }; nameTextField.getDocument().addDocumentListener(documentListener); cityTextField.getDocument().addDocumentListener(documentListener); frame.setSize(250, 150); frame.setVisible(true); }
}
</source>
JTextField Verifier Sample
<source lang="java">
import java.awt.BorderLayout; import java.awt.Container; import javax.swing.InputVerifier; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JTextField; public class VerifierSample {
public static void main(String args[]) { JFrame frame = new JFrame("Verifier Sample"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField textField1 = new JTextField(); JTextField textField2 = new JTextField(); JTextField textField3 = new JTextField(); InputVerifier verifier = new InputVerifier() { public boolean verify(JComponent comp) { boolean returnValue; JTextField textField = (JTextField) comp; try { Integer.parseInt(textField.getText()); returnValue = true; } catch (NumberFormatException e) { returnValue = false; } return returnValue; } }; textField1.setInputVerifier(verifier); textField3.setInputVerifier(verifier); Container contentPane = frame.getContentPane(); contentPane.add(textField1, BorderLayout.NORTH); contentPane.add(textField2, BorderLayout.CENTER); contentPane.add(textField3, BorderLayout.SOUTH); frame.setSize(300, 100); frame.setVisible(true); }
}
</source>
Limit JTextField input to a maximum length
<source lang="java">
import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; class JTextFieldLimit extends PlainDocument {
private int limit; JTextFieldLimit(int limit) { super(); this.limit = limit; } JTextFieldLimit(int limit, boolean upper) { super(); this.limit = limit; } public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException { if (str == null) return; if ((getLength() + str.length()) <= limit) { super.insertString(offset, str, attr); } }
} public class Main extends JFrame {
JTextField textfield1; JLabel label1; public void init() { setLayout(new FlowLayout()); label1 = new JLabel("max 10 chars"); textfield1 = new JTextField(15); add(label1); add(textfield1); textfield1.setDocument(new JTextFieldLimit(10)); setSize(300,300); setVisible(true); }
}
</source>
Make a Text Field two columns wide
<source lang="java">
import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class Main {
public static void main(String[] args) { JTextField tf = new JTextField("mm"); tf.setPreferredSize(tf.getPreferredSize()); tf.setText(""); JPanel pHacked = new JPanel(); pHacked.add(tf); JPanel pStock = new JPanel(); pStock.add(new JTextField(2)); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new java.awt.GridLayout(0, 1)); frame.add(pHacked); frame.add(pStock); frame.setSize(150, 150); frame.setVisible(true); tf.requestFocus(); }
}
</source>
Make sure that my JTextField has the focus when a JFrame is created
<source lang="java">
import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; class Main extends JFrame {
JTextField field1 = new JTextField(10);; JTextField field2 = new JTextField(10);; JPanel panel = new JPanel(); public Main() { panel.add(new JLabel("Field 1:")); panel.add(field1); panel.add(new JLabel("Field 2:")); panel.add(field2); getContentPane().add("Center", panel); addWindowListener(new WindowAdapter() { public void windowOpened(WindowEvent e) { field1.requestFocus(); } }); pack(); setVisible(true); } public static void main(String[] argv) { new Main(); }
}
</source>
Make sure that my Text field has the focus when a JFrame is created
<source lang="java">
import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JTextField; class MyFrame extends JFrame {
JTextField field1; public MyFrame() { field1 = new JTextField(10); getContentPane().add("Center", field1); addWindowListener(new WindowAdapter() { public void windowOpened(WindowEvent e) { field1.requestFocus(); } }); pack(); setVisible(true); }
} public class Main {
public static void main(String[] argv) { MyFrame myFrame = new MyFrame(); }
}
</source>
Make the ENTER key act like the TAB key
<source lang="java">
import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JTextField; class MyTextField extends JTextField {
MyTextField(int len) { super(len); addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent evt) { int key = evt.getKeyCode(); if (key == KeyEvent.VK_ENTER) transferFocus(); } }); }
}
</source>
Modify horizontal alignment of text field at runtime
<source lang="java">
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JTextField; public class Main {
public static void main(String[] args) { final JTextField tf = new JTextField("press <enter>", 20); tf.setHorizontalAlignment(JTextField.RIGHT); tf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int old = tf.getHorizontalAlignment(); if (old == JTextField.LEFT) tf.setHorizontalAlignment(JTextField.RIGHT); if (old == JTextField.RIGHT) tf.setHorizontalAlignment(JTextField.CENTER); if (old == JTextField.CENTER) tf.setHorizontalAlignment(JTextField.LEFT); } }); JFrame frame = new JFrame("JTextFieldExample"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(new java.awt.FlowLayout()); frame.getContentPane().add(tf); frame.setSize(275, 75); frame.setVisible(true); tf.requestFocus(); }
}
</source>
Non Wrapping(Wrap) TextPane
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.ruponent; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.UIManager; import javax.swing.plaf.ruponentUI; import javax.swing.text.StyledDocument; public class NonWrappingTextPane extends JTextPane {
public NonWrappingTextPane() { super(); } public NonWrappingTextPane(StyledDocument doc) { super(doc); } // Override getScrollableTracksViewportWidth // to preserve the full width of the text public boolean getScrollableTracksViewportWidth() { Component parent = getParent(); ComponentUI ui = getUI(); return parent != null ? (ui.getPreferredSize(this).width <= parent .getSize().width) : true; } // Test method public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} String content = "The plaque on the Apollo 11 Lunar Module\n" + "\"Eagle\" reads:\n\n" + "\"Here men from the planet Earth first\n" + "set foot upon the Moon, July, 1969 AD\n" + "We came in peace for all mankind.\"\n\n" + "It is signed by the astronauts and the\n" + "President of the United States."; JFrame f = new JFrame("Non-wrapping Text Pane Example"); JTextPane tp = new JTextPane(); tp.setText(content); NonWrappingTextPane nwtp = new NonWrappingTextPane(); nwtp.setText(content); f.getContentPane().setLayout(new GridLayout(2, 1)); f.getContentPane().add(new JScrollPane(tp)); f.getContentPane().add(new JScrollPane(nwtp)); f.setSize(300, 200); f.setVisible(true); }
}
</source>
Numeric TextField
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.DecimalFormat; import java.text.ParseException; import java.text.ParsePosition; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; import javax.swing.text.AbstractDocument.Content; public class NumericTextField extends JTextField implements
NumericPlainDocument.InsertErrorListener { public NumericTextField() { this(null, 0, null); } public NumericTextField(String text, int columns, DecimalFormat format) { super(null, text, columns); NumericPlainDocument numericDoc = (NumericPlainDocument) getDocument(); if (format != null) { numericDoc.setFormat(format); } numericDoc.addInsertErrorListener(this); } public NumericTextField(int columns, DecimalFormat format) { this(null, columns, format); } public NumericTextField(String text) { this(text, 0, null); } public NumericTextField(String text, int columns) { this(text, columns, null); } public void setFormat(DecimalFormat format) { ((NumericPlainDocument) getDocument()).setFormat(format); } public DecimalFormat getFormat() { return ((NumericPlainDocument) getDocument()).getFormat(); } public void formatChanged() { // Notify change of format attributes. setFormat(getFormat()); } // Methods to get the field value public Long getLongValue() throws ParseException { return ((NumericPlainDocument) getDocument()).getLongValue(); } public Double getDoubleValue() throws ParseException { return ((NumericPlainDocument) getDocument()).getDoubleValue(); } public Number getNumberValue() throws ParseException { return ((NumericPlainDocument) getDocument()).getNumberValue(); } // Methods to install numeric values public void setValue(Number number) { setText(getFormat().format(number)); } public void setValue(long l) { setText(getFormat().format(l)); ; } public void setValue(double d) { setText(getFormat().format(d)); } public void normalize() throws ParseException { // format the value according to the format string setText(getFormat().format(getNumberValue())); } // Override to handle insertion error public void insertFailed(NumericPlainDocument doc, int offset, String str, AttributeSet a) { // By default, just beep Toolkit.getDefaultToolkit().beep(); } // Method to create default model protected Document createDefaultModel() { return new NumericPlainDocument(); } // Test code public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} DecimalFormat format = new DecimalFormat("#,###.###"); format.setGroupingUsed(true); format.setGroupingSize(3); format.setParseIntegerOnly(false); JFrame f = new JFrame("Numeric Text Field Example"); final NumericTextField tf = new NumericTextField(10, format); tf.setValue((double) 123456.789); JLabel lbl = new JLabel("Type a number: "); f.getContentPane().add(tf, "East"); f.getContentPane().add(lbl, "West"); tf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try { tf.normalize(); Long l = tf.getLongValue(); System.out.println("Value is (Long)" + l); } catch (ParseException e1) { try { Double d = tf.getDoubleValue(); System.out.println("Value is (Double)" + d); } catch (ParseException e2) { System.out.println(e2); } } } }); f.pack(); f.setVisible(true); }
} class NumericPlainDocument extends PlainDocument {
public NumericPlainDocument() { setFormat(null); } public NumericPlainDocument(DecimalFormat format) { setFormat(format); } public NumericPlainDocument(AbstractDocument.Content content, DecimalFormat format) { super(content); setFormat(format); try { format .parseObject(content.getString(0, content.length()), parsePos); } catch (Exception e) { throw new IllegalArgumentException( "Initial content not a valid number"); } if (parsePos.getIndex() != content.length() - 1) { throw new IllegalArgumentException( "Initial content not a valid number"); } } public void setFormat(DecimalFormat fmt) { this.format = fmt != null ? fmt : (DecimalFormat) defaultFormat.clone(); decimalSeparator = format.getDecimalFormatSymbols() .getDecimalSeparator(); groupingSeparator = format.getDecimalFormatSymbols() .getGroupingSeparator(); positivePrefix = format.getPositivePrefix(); positivePrefixLen = positivePrefix.length(); negativePrefix = format.getNegativePrefix(); negativePrefixLen = negativePrefix.length(); positiveSuffix = format.getPositiveSuffix(); positiveSuffixLen = positiveSuffix.length(); negativeSuffix = format.getNegativeSuffix(); negativeSuffixLen = negativeSuffix.length(); } public DecimalFormat getFormat() { return format; } public Number getNumberValue() throws ParseException { try { String content = getText(0, getLength()); parsePos.setIndex(0); Number result = format.parse(content, parsePos); if (parsePos.getIndex() != getLength()) { throw new ParseException("Not a valid number: " + content, 0); } return result; } catch (BadLocationException e) { throw new ParseException("Not a valid number", 0); } } public Long getLongValue() throws ParseException { Number result = getNumberValue(); if ((result instanceof Long) == false) { throw new ParseException("Not a valid long", 0); } return (Long) result; } public Double getDoubleValue() throws ParseException { Number result = getNumberValue(); if ((result instanceof Long) == false && (result instanceof Double) == false) { throw new ParseException("Not a valid double", 0); } if (result instanceof Long) { result = new Double(result.doubleValue()); } return (Double) result; } public void insertString(int offset, String str, AttributeSet a) throws BadLocationException { if (str == null || str.length() == 0) { return; } Content content = getContent(); int length = content.length(); int originalLength = length; parsePos.setIndex(0); // Create the result of inserting the new data, // but ignore the trailing newline String targetString = content.getString(0, offset) + str + content.getString(offset, length - offset - 1); // Parse the input string and check for errors do { boolean gotPositive = targetString.startsWith(positivePrefix); boolean gotNegative = targetString.startsWith(negativePrefix); length = targetString.length(); // If we have a valid prefix, the parse fails if the // suffix is not present and the error is reported // at index 0. So, we need to add the appropriate // suffix if it is not present at this point. if (gotPositive == true || gotNegative == true) { String suffix; int suffixLength; int prefixLength; if (gotPositive == true && gotNegative == true) { // This happens if one is the leading part of // the other - e.g. if one is "(" and the other "((" if (positivePrefixLen > negativePrefixLen) { gotNegative = false; } else { gotPositive = false; } } if (gotPositive == true) { suffix = positiveSuffix; suffixLength = positiveSuffixLen; prefixLength = positivePrefixLen; } else { // Must have the negative prefix suffix = negativeSuffix; suffixLength = negativeSuffixLen; prefixLength = negativePrefixLen; } // If the string consists of the prefix alone, // do nothing, or the result won"t parse. if (length == prefixLength) { break; } // We can"t just add the suffix, because part of it // may already be there. For example, suppose the // negative prefix is "(" and the negative suffix is // "$)". If the user has typed "(345$", then it is not // correct to add "$)". Instead, only the missing part // should be added, in this case ")". if (targetString.endsWith(suffix) == false) { int i; for (i = suffixLength - 1; i > 0; i--) { if (targetString .regionMatches(length - i, suffix, 0, i)) { targetString += suffix.substring(i); break; } } if (i == 0) { // None of the suffix was present targetString += suffix; } length = targetString.length(); } } format.parse(targetString, parsePos); int endIndex = parsePos.getIndex(); if (endIndex == length) { break; // Number is acceptable } // Parse ended early // Since incomplete numbers don"t always parse, try // to work out what went wrong. // First check for an incomplete positive prefix if (positivePrefixLen > 0 && endIndex < positivePrefixLen && length <= positivePrefixLen && targetString.regionMatches(0, positivePrefix, 0, length)) { break; // Accept for now } // Next check for an incomplete negative prefix if (negativePrefixLen > 0 && endIndex < negativePrefixLen && length <= negativePrefixLen && targetString.regionMatches(0, negativePrefix, 0, length)) { break; // Accept for now } // Allow a number that ends with the group // or decimal separator, if these are in use char lastChar = targetString.charAt(originalLength - 1); int decimalIndex = targetString.indexOf(decimalSeparator); if (format.isGroupingUsed() && lastChar == groupingSeparator && decimalIndex == -1) { // Allow a "," but only in integer part break; } if (format.isParseIntegerOnly() == false && lastChar == decimalSeparator && decimalIndex == originalLength - 1) { // Allow a ".", but only one break; } // No more corrections to make: must be an error if (errorListener != null) { errorListener.insertFailed(this, offset, str, a); } return; } while (true == false); // Finally, add to the model super.insertString(offset, str, a); } public void addInsertErrorListener(InsertErrorListener l) { if (errorListener == null) { errorListener = l; return; } throw new IllegalArgumentException( "InsertErrorListener already registered"); } public void removeInsertErrorListener(InsertErrorListener l) { if (errorListener == l) { errorListener = null; } } public interface InsertErrorListener { public abstract void insertFailed(NumericPlainDocument doc, int offset, String str, AttributeSet a); } protected InsertErrorListener errorListener; protected DecimalFormat format; protected char decimalSeparator; protected char groupingSeparator; protected String positivePrefix; protected String negativePrefix; protected int positivePrefixLen; protected int negativePrefixLen; protected String positiveSuffix; protected String negativeSuffix; protected int positiveSuffixLen; protected int negativeSuffixLen; protected ParsePosition parsePos = new ParsePosition(0); protected static DecimalFormat defaultFormat = new DecimalFormat();
}
</source>
Overwritable TextField
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; import javax.swing.Action; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.plaf.TextUI; import javax.swing.text.BadLocationException; import javax.swing.text.Caret; import javax.swing.text.DefaultCaret; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import javax.swing.text.Keymap; import javax.swing.text.TextAction; public class OverwritableTextField extends JTextField {
public OverwritableTextField() { this(null, null, 0); } public OverwritableTextField(String text) { this(null, text, 0); } public OverwritableTextField(int columns) { this(null, null, columns); } public OverwritableTextField(String text, int columns) { this(null, text, columns); } public OverwritableTextField(Document doc, String text, int columns) { super(doc, text, columns); overwriteCaret = new OverwriteCaret(); super.setCaret(overwriting ? overwriteCaret : insertCaret); } public void setKeymap(Keymap map) { if (map == null) { super.setKeymap(null); sharedKeymap = null; return; } if (getKeymap() == null) { if (sharedKeymap == null) { // Switch keymaps. Add extra bindings. removeKeymap(keymapName); sharedKeymap = addKeymap(keymapName, map); loadKeymap(sharedKeymap, bindings, defaultActions); } map = sharedKeymap; } super.setKeymap(map); } public void replaceSelection(String content) { Document doc = getDocument(); if (doc != null) { // If we are not overwriting, just do the // usual insert. Also, if there is a selection, // just overwrite that (and that only). if (overwriting == true && getSelectionStart() == getSelectionEnd()) { // Overwrite and no selection. Remove // the stretch that we will overwrite, // then use the usual code to insert the // new text. int insertPosition = getCaretPosition(); int overwriteLength = doc.getLength() - insertPosition; int length = content.length(); if (overwriteLength > length) { overwriteLength = length; } // Remove the range being overwritten try { doc.remove(insertPosition, overwriteLength); } catch (BadLocationException e) { // Won"t happen } } } super.replaceSelection(content); } // Change the global overwriting mode public static void setOverwriting(boolean overwriting) { OverwritableTextField.overwriting = overwriting; } public static boolean isOverwriting() { return overwriting; } // Configuration of the insert caret public void setCaret(Caret caret) { insertCaret = caret; } // Allow configuration of a new // overwrite caret. public void setOverwriteCaret(Caret caret) { overwriteCaret = caret; } public Caret getOverwriteCaret() { return overwriteCaret; } // Caret switching public void processFocusEvent(FocusEvent evt) { if (evt.getID() == FocusEvent.FOCUS_GAINED) { selectCaret(); } super.processFocusEvent(evt); } protected void selectCaret() { // Select the appropriate caret for the // current overwrite mode. Caret newCaret = overwriting ? overwriteCaret : insertCaret; if (newCaret != getCaret()) { Caret caret = getCaret(); int mark = caret.getMark(); int dot = caret.getDot(); caret.setVisible(false); super.setCaret(newCaret); newCaret.setDot(mark); newCaret.moveDot(dot); newCaret.setVisible(true); } } protected Caret overwriteCaret; protected Caret insertCaret; protected static boolean overwriting = true; public static final String toggleOverwriteAction = "toggle-overwrite"; protected static Keymap sharedKeymap; protected static final String keymapName = "OverwriteMap"; protected static final Action[] defaultActions = { new ToggleOverwriteAction() }; protected static JTextComponent.KeyBinding[] bindings = { new JTextComponent.KeyBinding( KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0), toggleOverwriteAction) }; // Insert/overwrite toggling action public static class ToggleOverwriteAction extends TextAction { ToggleOverwriteAction() { super(toggleOverwriteAction); } public void actionPerformed(ActionEvent evt) { OverwritableTextField.setOverwriting(!OverwritableTextField .isOverwriting()); JTextComponent target = getFocusedComponent(); if (target instanceof OverwritableTextField) { OverwritableTextField field = (OverwritableTextField) target; field.selectCaret(); } } } public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} JFrame f = new JFrame("Overwrite test"); OverwritableTextField tf = new OverwritableTextField(20); f.getContentPane().add(tf, "North"); tf = new OverwritableTextField(20); f.getContentPane().add(tf, "South"); f.pack(); f.setVisible(true); }
} class OverwriteCaret extends DefaultCaret {
protected synchronized void damage(Rectangle r) { if (r != null) { try { JTextComponent comp = getComponent(); TextUI mapper = comp.getUI(); Rectangle r2 = mapper.modelToView(comp, getDot() + 1); int width = r2.x - r.x; if (width == 0) { width = MIN_WIDTH; } comp.repaint(r.x, r.y, width, r.height); // Swing 1.1 beta 2 compat this.x = r.x; this.y = r.y; this.width = width; this.height = r.height; } catch (BadLocationException e) { } } } public void paint(Graphics g) { if (isVisible()) { try { JTextComponent comp = getComponent(); TextUI mapper = comp.getUI(); Rectangle r1 = mapper.modelToView(comp, getDot()); Rectangle r2 = mapper.modelToView(comp, getDot() + 1); g = g.create(); g.setColor(comp.getForeground()); g.setXORMode(comp.getBackground()); int width = r2.x - r1.x; if (width == 0) { width = MIN_WIDTH; } g.fillRect(r1.x, r1.y, width, r1.height); g.dispose(); } catch (BadLocationException e) { } } } protected static final int MIN_WIDTH = 8;
}
</source>
Passive TextField 1
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.text.Keymap; public class PassiveTextField1 extends JTextField {
public static void main(String[] args) { JFrame f = new JFrame("Passive Text Field"); f.getContentPane().setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS)); final JTextField ptf = new JTextField(32); JTextField tf = new JTextField(32); JPanel p = new JPanel(); JButton b = new JButton("OK"); p.add(b); f.getContentPane().add(ptf); f.getContentPane().add(tf); f.getContentPane().add(p); Keymap map = ptf.getKeymap(); // Gets the shared map KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); map.removeKeyStrokeBinding(key); ActionListener l = new ActionListener() { public void actionPerformed(ActionEvent evt) { System.out.println("Action event from a text field"); } }; ptf.addActionListener(l); tf.addActionListener(l); // Make the button the default button f.getRootPane().setDefaultButton(b); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { System.out.println("Content of text field: <" + ptf.getText() + ">"); } }); f.pack(); f.setVisible(true); }
}
</source>
Passive TextField 2
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Action; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.text.Document; import javax.swing.text.Keymap; public class PassiveTextField2 extends JTextField {
public PassiveTextField2() { this(null, null, 0); } public PassiveTextField2(String text) { this(null, text, 0); } public PassiveTextField2(int columns) { this(null, null, columns); } public PassiveTextField2(String text, int columns) { this(null, text, columns); } public PassiveTextField2(Document doc, String text, int columns) { super(doc, text, columns); } public void setKeymap(Keymap map) { if (map == null) { // Uninstalling keymap. super.setKeymap(null); sharedKeymap = null; return; } if (getKeymap() == null) { if (sharedKeymap == null) { // Initial keymap, or first // keymap after L&F switch. // Generate a new keymap sharedKeymap = addKeymap(null, map.getResolveParent()); KeyStroke[] strokes = map.getBoundKeyStrokes(); for (int i = 0; i < strokes.length; i++) { Action a = map.getAction(strokes[i]); if (a.getValue(Action.NAME) == JTextField.notifyAction) { continue; } sharedKeymap.addActionForKeyStroke(strokes[i], a); } } map = sharedKeymap; } super.setKeymap(map); } protected static Keymap sharedKeymap; // Test method public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} JFrame f = new JFrame("Passive Text Field"); f.getContentPane().setLayout( new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS)); final PassiveTextField2 ptf = new PassiveTextField2(32); JTextField tf = new JTextField(32); JPanel p = new JPanel(); JButton b = new JButton("OK"); p.add(b); f.getContentPane().add(ptf); f.getContentPane().add(tf); f.getContentPane().add(p); SwingUtilities.updateComponentTreeUI(f); ActionListener l = new ActionListener() { public void actionPerformed(ActionEvent evt) { System.out.println("Action event from a text field"); } }; ptf.addActionListener(l); tf.addActionListener(l); // Make the button the default button f.getRootPane().setDefaultButton(b); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { System.out.println("Content of text field: <" + ptf.getText() + ">"); } }); f.pack(); f.setVisible(true); }
}
</source>
Passive TextField 3
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.text.Document; public class PassiveTextField extends JTextField {
public PassiveTextField() { this(null, null, 0); } public PassiveTextField(String text) { this(null, text, 0); } public PassiveTextField(int columns) { this(null, null, columns); } public PassiveTextField(String text, int columns) { this(null, text, columns); } public PassiveTextField(Document doc, String text, int columns) { super(doc, text, columns); } public void processComponentKeyEvent(KeyEvent evt) { switch (evt.getID()) { case KeyEvent.KEY_PRESSED: case KeyEvent.KEY_RELEASED: if (evt.getKeyCode() == KeyEvent.VK_ENTER) { return; } break; case KeyEvent.KEY_TYPED: if (evt.getKeyChar() == "\r") { return; } break; } super.processComponentKeyEvent(evt); } // Test method public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} JFrame f = new JFrame("Passive Text Field"); f.getContentPane().setLayout( new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS)); final PassiveTextField ptf = new PassiveTextField(32); JTextField tf = new JTextField(32); JPanel p = new JPanel(); JButton b = new JButton("OK"); p.add(b); f.getContentPane().add(ptf); f.getContentPane().add(tf); f.getContentPane().add(p); ActionListener l = new ActionListener() { public void actionPerformed(ActionEvent evt) { System.out.println("Action event from a text field"); } }; ptf.addActionListener(l); tf.addActionListener(l); // Make the button the default button f.getRootPane().setDefaultButton(b); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { System.out.println("Content of text field: <" + ptf.getText() + ">"); } }); f.pack(); f.setVisible(true); }
}
</source>
Right justified JTextfield content
<source lang="java">
import javax.swing.JTextField; public class Main{
public static void main(String[] argv) { JTextField textfield = new JTextField(10); textfield.setHorizontalAlignment(JTextField.RIGHT); }
}
</source>
Right justified JTextField contents
<source lang="java">
import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JTextField; public class Main extends JFrame {
public Main() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(200, 200); Container container = getContentPane(); container.setLayout(new FlowLayout(FlowLayout.LEFT)); JTextField textField = new JTextField(15); textField.setPreferredSize(new Dimension(100, 20)); // Right justify the JTextField contents textField.setHorizontalAlignment(JTextField.RIGHT); container.add(textField); } public static void main(String[] args) { new Main().setVisible(true); }
}
</source>
Set the focus on a particular JTextField
<source lang="java">
import javax.swing.JTextField; import javax.swing.SwingUtilities; public class Main {
public static void main(String[] argv) throws Exception { final JTextField textfield = new JTextField(10); SwingUtilities.invokeLater(new Runnable() { public void run() { textfield.requestFocus(); } }); }
}
</source>
Setting up a textfield and modifying its horizontal alignment at runtime
<source lang="java">
/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O"Reilly
- /
// JTextFieldExample.java //An example of setting up a textfield and modifying its horizontal alignment //at runtime. // import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JTextField; public class JTextFieldExample {
public static void main(String[] args) { final JTextField tf = new JTextField("press <enter>", 20); tf.setHorizontalAlignment(JTextField.RIGHT); tf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int old = tf.getHorizontalAlignment(); if (old == JTextField.LEFT) tf.setHorizontalAlignment(JTextField.RIGHT); if (old == JTextField.RIGHT) tf.setHorizontalAlignment(JTextField.CENTER); if (old == JTextField.CENTER) tf.setHorizontalAlignment(JTextField.LEFT); } }); JFrame frame = new JFrame("JTextFieldExample"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(new java.awt.FlowLayout()); frame.getContentPane().add(tf); frame.setSize(275, 75); frame.setVisible(true); tf.requestFocus(); }
}
</source>
Text Accelerator Example
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.UIManager; public class TextAcceleratorExample {
public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} JLabel l; JTextField t; JButton b; JFrame f = new JFrame("Text Accelerator Example"); Container cp = f.getContentPane(); cp.setLayout(new GridBagLayout()); cp.setBackground(UIManager.getColor("control")); GridBagConstraints c = new GridBagConstraints(); c.gridx = 0; c.gridy = GridBagConstraints.RELATIVE; c.gridwidth = 1; c.gridheight = 1; c.insets = new Insets(2, 2, 2, 2); c.anchor = GridBagConstraints.EAST; cp.add(l = new JLabel("Name:", SwingConstants.RIGHT), c); l.setDisplayedMnemonic("n"); cp.add(l = new JLabel("House/Street:", SwingConstants.RIGHT), c); l.setDisplayedMnemonic("h"); cp.add(l = new JLabel("City:", SwingConstants.RIGHT), c); l.setDisplayedMnemonic("c"); cp.add(l = new JLabel("State/County:", SwingConstants.RIGHT), c); l.setDisplayedMnemonic("s"); cp.add(l = new JLabel("Zip/Post code:", SwingConstants.RIGHT), c); l.setDisplayedMnemonic("z"); cp.add(l = new JLabel("Telephone:", SwingConstants.RIGHT), c); l.setDisplayedMnemonic("t"); cp.add(b = new JButton("Clear"), c); b.setMnemonic("l"); c.gridx = 1; c.gridy = 0; c.weightx = 1.0; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.CENTER; cp.add(t = new JTextField(35), c); t.setFocusAccelerator("n"); c.gridx = 1; c.gridy = GridBagConstraints.RELATIVE; cp.add(t = new JTextField(35), c); t.setFocusAccelerator("h"); cp.add(t = new JTextField(35), c); t.setFocusAccelerator("c"); cp.add(t = new JTextField(35), c); t.setFocusAccelerator("s"); cp.add(t = new JTextField(35), c); t.setFocusAccelerator("z"); cp.add(t = new JTextField(35), c); t.setFocusAccelerator("t"); c.weightx = 0.0; c.fill = GridBagConstraints.NONE; cp.add(b = new JButton("OK"), c); b.setMnemonic("o"); f.pack(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); f.setVisible(true); }
}
</source>
TextField Elements
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import javax.swing.*; import javax.swing.text.*; public class TextFieldElements {
public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} JFrame f = new JFrame("Text Field Elements"); JTextField tf = new JTextField(32); tf.setText("That"s one small step for man..."); f.getContentPane().add(tf); f.pack(); f.setVisible(true); ((AbstractDocument)tf.getDocument()).dump(System.out); }
}
</source>
TextField Look Ahead Example
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.text.BadLocationException; import javax.swing.text.Document; public class LookAheadExample {
public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} JFrame f = new JFrame("Text Lookahead"); StringArrayLookAhead lookAhead = new StringArrayLookAhead(values); LookAheadTextField tf = new LookAheadTextField(20, lookAhead); f.getContentPane().add(tf, "Center"); f.pack(); f.setVisible(true); } // The possible look-ahead values public static String[] values = new String[] { "aback", "abacus", "abandon", "abashed", "abate", "abdomen", "abide", "ability", "baby", "back", "backache", "backgammon" };
} class LookAheadTextField extends JTextField {
public LookAheadTextField() { this(0, null); } public LookAheadTextField(int columns) { this(columns, null); } public LookAheadTextField(int columns, TextLookAhead lookAhead) { super(columns); setLookAhead(lookAhead); addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { // Remove any existing selection setCaretPosition(getDocument().getLength()); } }); addFocusListener(new FocusListener() { public void focusGained(FocusEvent evt) { } public void focusLost(FocusEvent evt) { if (evt.isTemporary() == false) { // Remove any existing selection setCaretPosition(getDocument().getLength()); } } }); } public void setLookAhead(TextLookAhead lookAhead) { this.lookAhead = lookAhead; } public TextLookAhead getLookAhead() { return lookAhead; } public void replaceSelection(String content) { super.replaceSelection(content); if (isEditable() == false || isEnabled() == false) { return; } Document doc = getDocument(); if (doc != null && lookAhead != null) { try { String oldContent = doc.getText(0, doc.getLength()); String newContent = lookAhead.doLookAhead(oldContent); if (newContent != null) { // Substitute the new content setText(newContent); // Highlight the added text setCaretPosition(newContent.length()); moveCaretPosition(oldContent.length()); } } catch (BadLocationException e) { // Won"t happen } } } protected TextLookAhead lookAhead; // The TextLookAhead interface public interface TextLookAhead { public String doLookAhead(String key); }
} class StringArrayLookAhead implements LookAheadTextField.TextLookAhead {
public StringArrayLookAhead() { values = new String[0]; } public StringArrayLookAhead(String[] values) { this.values = values; } public void setValues(String[] values) { this.values = values; } public String[] getValues() { return values; } public String doLookAhead(String key) { int length = values.length; // Look for a string that starts with the key for (int i = 0; i < length; i++) { if (values[i].startsWith(key) == true) { return values[i]; } } // No match found - return null return null; } protected String[] values;
}
</source>
Textfield only accepts numbers
<source lang="java">
import java.awt.Container; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; public class ValidationTestFrame extends JFrame implements DocumentListener {
JLabel label = new JLabel("I only accept numbers"); private IntTextField intFiled; public ValidationTestFrame() { setTitle("ValidationTest"); setSize(300, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); Container contentPane = getContentPane(); JPanel p = new JPanel(); intFiled = new IntTextField(12, 3); p.add(intFiled); intFiled.getDocument().addDocumentListener(this); contentPane.add(p, "South"); contentPane.add(label, "Center"); } public void insertUpdate(DocumentEvent e) { setLabel(); } public void removeUpdate(DocumentEvent e) { setLabel(); } public void changedUpdate(DocumentEvent e) { } public void setLabel() { if (intFiled.isValid() ) { int value = intFiled.getValue(); label.setText(Integer.toString(value)); } } public static void main(String[] args) { JFrame frame = new ValidationTestFrame(); frame.show(); }
} class IntTextField extends JTextField {
public IntTextField(int defval, int size) { super("" + defval, size); } protected Document createDefaultModel() { return new IntTextDocument(); } public boolean isValid() { try { Integer.parseInt(getText()); return true; } catch (NumberFormatException e) { return false; } } public int getValue() { try { return Integer.parseInt(getText()); } catch (NumberFormatException e) { return 0; } } class IntTextDocument extends PlainDocument { public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if (str == null) return; String oldString = getText(0, getLength()); String newString = oldString.substring(0, offs) + str + oldString.substring(offs); try { Integer.parseInt(newString + "0"); super.insertString(offs, str, a); } catch (NumberFormatException e) { } } }
}
</source>
Text fields and Java events
<source lang="java">
// : c14:TextFields.java // Text fields and Java events. // <applet code=TextFields width=375 height=125></applet> // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt. import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; public class TextFields extends JApplet {
private JButton b1 = new JButton("Get Text"), b2 = new JButton("Set Text"); private JTextField t1 = new JTextField(30), t2 = new JTextField(30), t3 = new JTextField(30); private String s = new String(); private UpperCaseDocument ucd = new UpperCaseDocument(); public void init() { t1.setDocument(ucd); ucd.addDocumentListener(new T1()); b1.addActionListener(new B1()); b2.addActionListener(new B2()); DocumentListener dl = new T1(); t1.addActionListener(new T1A()); Container cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.add(b1); cp.add(b2); cp.add(t1); cp.add(t2); cp.add(t3); } class T1 implements DocumentListener { public void changedUpdate(DocumentEvent e) { } public void insertUpdate(DocumentEvent e) { t2.setText(t1.getText()); t3.setText("Text: " + t1.getText()); } public void removeUpdate(DocumentEvent e) { t2.setText(t1.getText()); } } class T1A implements ActionListener { private int count = 0; public void actionPerformed(ActionEvent e) { t3.setText("t1 Action Event " + count++); } } class B1 implements ActionListener { public void actionPerformed(ActionEvent e) { if (t1.getSelectedText() == null) s = t1.getText(); else s = t1.getSelectedText(); t1.setEditable(true); } } class B2 implements ActionListener { public void actionPerformed(ActionEvent e) { ucd.setUpperCase(false); t1.setText("Inserted by Button 2: " + s); ucd.setUpperCase(true); t1.setEditable(false); } } public static void main(String[] args) { run(new TextFields(), 375, 125); } public static void run(JApplet applet, int width, int height) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(applet); frame.setSize(width, height); applet.init(); applet.start(); frame.setVisible(true); }
} class UpperCaseDocument extends PlainDocument {
private boolean upperCase = true; public void setUpperCase(boolean flag) { upperCase = flag; } public void insertString(int offset, String str, AttributeSet attSet) throws BadLocationException { if (upperCase) str = str.toUpperCase(); super.insertString(offset, str, attSet); }
} ///:~
</source>
TextFieldViews 2
<source lang="java">
/* Core SWING Advanced Programming By Kim Topley ISBN: 0 13 083292 8 Publisher: Prentice Hall
- /
import java.io.PrintStream; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import javax.swing.text.View; public class TextFieldViews {
public static void main(String[] args) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} JFrame f = new JFrame("Text Field View"); JTextField tf = new JTextField(32); tf.setText("That"s one small step for man..."); f.getContentPane().add(tf); f.pack(); f.setVisible(true); ViewDisplayer.displayViews(tf, System.out); }
} class ViewDisplayer {
public static void displayViews(JTextComponent comp, PrintStream out) { View rootView = comp.getUI().getRootView(comp); displayView(rootView, 0, comp.getDocument(), out); } public static void displayView(View view, int indent, Document doc, PrintStream out) { String name = view.getClass().getName(); for (int i = 0; i < indent; i++) { out.print("\t"); } int start = view.getStartOffset(); int end = view.getEndOffset(); out.println(name + "; offsets [" + start + ", " + end + "]"); int viewCount = view.getViewCount(); if (viewCount == 0) { int length = Math.min(32, end - start); try { String txt = doc.getText(start, length); for (int i = 0; i < indent + 1; i++) { out.print("\t"); } out.println("[" + txt + "]"); } catch (BadLocationException e) { } } else { for (int i = 0; i < viewCount; i++) { displayView(view.getView(i), indent + 1, doc, out); } } }
}
</source>
TextField with Constaints
<source lang="java">
/* Definitive Guide to Swing for Java 2, Second Edition By John Zukowski ISBN: 1-893115-78-X Publisher: APress
- /
import java.awt.Container; import java.awt.GridLayout; import java.awt.Toolkit; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; public class RangeSample {
public static void main(String args[]) { JFrame frame = new JFrame("Range Example"); Container content = frame.getContentPane(); content.setLayout(new GridLayout(3, 2)); content.add(new JLabel("Range: 0-255")); Document rangeOne = new IntegerRangeDocument(0, 255); JTextField textFieldOne = new JTextField(); textFieldOne.setDocument(rangeOne); content.add(textFieldOne); content.add(new JLabel("Range: -100-100")); Document rangeTwo = new IntegerRangeDocument(-100, 100); JTextField textFieldTwo = new JTextField(); textFieldTwo.setDocument(rangeTwo); content.add(textFieldTwo); content.add(new JLabel("Range: 1000-2000")); Document rangeThree = new IntegerRangeDocument(1000, 2000); JTextField textFieldThree = new JTextField(); textFieldThree.setDocument(rangeThree); content.add(textFieldThree); frame.setSize(250, 150); frame.setVisible(true); }
} class IntegerRangeDocument extends PlainDocument {
int minimum, maximum; int currentValue = 0; public IntegerRangeDocument(int minimum, int maximum) { this.minimum = minimum; this.maximum = maximum; } public int getValue() { return currentValue; } public void insertString(int offset, String string, AttributeSet attributes) throws BadLocationException { if (string == null) { return; } else { String newValue; int length = getLength(); if (length == 0) { newValue = string; } else { String currentContent = getText(0, length); StringBuffer currentBuffer = new StringBuffer(currentContent); currentBuffer.insert(offset, string); newValue = currentBuffer.toString(); } try { currentValue = checkInput(newValue); super.insertString(offset, string, attributes); } catch (Exception exception) { Toolkit.getDefaultToolkit().beep(); } } } public void remove(int offset, int length) throws BadLocationException { int currentLength = getLength(); String currentContent = getText(0, currentLength); String before = currentContent.substring(0, offset); String after = currentContent.substring(length + offset, currentLength); String newValue = before + after; try { currentValue = checkInput(newValue); super.remove(offset, length); } catch (Exception exception) { Toolkit.getDefaultToolkit().beep(); } } public int checkInput(String proposedValue) throws NumberFormatException { int newValue = 0; if (proposedValue.length() > 0) { newValue = Integer.parseInt(proposedValue); } if ((minimum <= newValue) && (newValue <= maximum)) { return newValue; } else { throw new NumberFormatException(); } }
}
</source>
Validate a value on the lostFocus event
<source lang="java">
import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JComponent; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class Main {
JTextField tf1; public void init() { tf1 = new JTextField(5); tf1.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { }; public void focusLost(FocusEvent e) { if (!e.isTemporary()) { String content = tf1.getText(); if (!content.equals("a") ) { System.out.println("illegal value! " + content); SwingUtilities.invokeLater(new FocusGrabber(tf1)); } } } }); }
} class FocusGrabber implements Runnable {
private JComponent component; public FocusGrabber(JComponent component) { this.ruponent = component; } public void run() { component.grabFocus(); }
}
</source>
Water mark text field
<source lang="java">
import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.TexturePaint; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JTextField; public class WatermarkTextField extends JTextField {
BufferedImage img; TexturePaint texture; public WatermarkTextField(File file) { super(); try { img = ImageIO.read(file); } catch (IOException e) { e.printStackTrace(); } Rectangle rect = new Rectangle(0, 0, img.getWidth(null), img.getHeight(null)); texture = new TexturePaint(img, rect); setOpaque(false); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setPaint(texture); g.fillRect(0, 0, getWidth(), getHeight()); super.paintComponent(g); } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField textfield = new WatermarkTextField(new File("waterMarkImage.png")); textfield.setText("www.jexp.ru"); frame.getContentPane().add(textfield); frame.pack(); frame.setVisible(true); }
}
</source>