/* TextFieldDemo.java -- An example showing various textfields in Swing. Copyright (C) 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath examples. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath 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 General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package gnu.classpath.examples.swing; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Point; import java.awt.Rectangle; import java.awt.Shape; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import javax.swing.border.TitledBorder; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultCaret; import javax.swing.text.Highlighter; import javax.swing.text.JTextComponent; import javax.swing.text.View; import javax.swing.text.LayeredHighlighter.LayerPainter; /** * A simple textfield demo showing various textfields in different states. */ public class TextFieldDemo extends JPanel implements ActionListener { /** * A custom caret for demonstration purposes. This class is inspired by the * CornerCaret from the OReilly Swing book. * * @author Roman Kennke (kennke@aicas.com) */ static class CornerCaret extends DefaultCaret { public CornerCaret() { super(); setBlinkRate(500); } protected synchronized void damage(Rectangle r) { if (r == null) return; x = r.x; y = r.y + (r.height * 4 / 5 - 3); width = 5; height = 5; repaint(); } public void paint(Graphics g) { JTextComponent comp = getComponent(); if (comp == null) return; int dot = getDot(); Rectangle r = null; try { r = comp.modelToView(dot); } catch (BadLocationException e) { return; } if (r == null) return; int dist = r.height * 4 / 5 - 3; if ((x != r.x) || (y != r.y + dist)) { repaint(); x = r.x; y = r.y + dist; width = 5; height = 5; } if (isVisible()) { g.drawLine(r.x, r.y + dist, r.x, r.y + dist + 4); g.drawLine(r.x, r.y + dist + 4, r.x + 4, r.y + dist + 4); } } } static class DemoHighlightPainter extends LayerPainter { static DemoHighlightPainter INSTANCE = new DemoHighlightPainter(); static Color[] colors = { Color.BLUE, Color.CYAN, Color.GRAY, Color.GREEN, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.ORANGE, Color.RED, Color.BLUE, Color.YELLOW }; public DemoHighlightPainter() { super(); } private void paintHighlight(Graphics g, Rectangle rect) { g.fillRect(rect.x, rect.y, rect.width, rect.height); } public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent t) { try { for (int i = p0; i < p1; i++) { Rectangle r = t.modelToView(i); Point l1 = t.modelToView(i + 1).getLocation(); g.setColor(colors[(int) (Math.random() * colors.length)]); g.fillOval(r.x, r.y, l1.x - r.x, r.height); } } catch (BadLocationException ble) { } } public Shape paintLayer(Graphics g, int p0, int p1, Shape bounds, JTextComponent c, View view) { paint(g, p0, p1, bounds, c); return bounds; } } /** * The left aligned textfields and state buttons. */ Compound compound1; /** * The right aligned textfields and state buttons. */ Compound compound2; /** * The centered textfields and state buttons. */ Compound compound3; /** * The custom colored textfields and state buttons. */ Compound compound4; Compound compound5; /** * Some miscellaneous textfield demos. */ Compound compound6; /** * Some textfields with custom borders. */ Compound compound7; /** * Creates a new demo instance. */ public TextFieldDemo() { super(); createContent(); } /** * When the demo is run independently, the frame is displayed, so we should * initialise the content panel (including the demo content and a close * button). But when the demo is run as part of the Swing activity board, * only the demo content panel is used, the frame itself is never displayed, * so we can avoid this step. */ void initFrameContent() { JPanel closePanel = new JPanel(); JButton closeButton = new JButton("Close"); closeButton.setActionCommand("CLOSE"); closeButton.addActionListener(this); closePanel.add(closeButton); add(closePanel, BorderLayout.SOUTH); } /** * Returns a panel with the demo content. The panel * uses a BorderLayout(), and the BorderLayout.SOUTH area * is empty, to allow callers to add controls to the * bottom of the panel if they want to (a close button is * added if this demo is being run as a standalone demo). */ private void createContent() { setLayout(new BorderLayout()); JPanel panel = new JPanel(new GridLayout(7, 1)); panel.add(createLeftAlignedPanel()); panel.add(createRightAlignedPanel()); panel.add(createCenteredPanel()); panel.add(createCustomColorPanel1()); panel.add(createCustomColorPanel2()); panel.add(createCustomBordersPanel()); panel.add(createMiscPanel()); // Put everything in a scroll pane to make it neccessary // to reach the bottom inner panels if the screen is to small. add(new JScrollPane(panel)); } private JPanel createLeftAlignedPanel() { compound1 = createTextFieldCompound("Left aligned", 1); compound1.setupTextfields("Hello World!", JTextField.LEFT, new Font[] { new Font("Dialog", Font.PLAIN, 8), new Font("Dialog", Font.ITALIC, 12), new Font("Dialog", Font.BOLD, 14) }); return compound1.panel; } private Compound createTextFieldCompound(String title, int actionCommandNo) { Compound compound = new Compound(); compound.panel = new JPanel(new BorderLayout()); compound.panel.setBorder(BorderFactory.createTitledBorder(title)); compound.textFieldPanel = new JPanel(); compound.textFieldPanel.setLayout(new BoxLayout(compound.textFieldPanel, BoxLayout.X_AXIS)); compound.panel.add(compound.textFieldPanel); JPanel statePanel = new JPanel(); statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS)); statePanel.add(Box.createVerticalGlue()); compound.enabled = new JCheckBox("enabled"); compound.enabled.setSelected(true); compound.enabled.addActionListener(this); compound.enabled.setActionCommand("ENABLED" + actionCommandNo); statePanel.add(compound.enabled); compound.editable = new JCheckBox("editable"); compound.editable.setSelected(true); compound.editable.addActionListener(this); compound.editable.setActionCommand("EDITABLE" + actionCommandNo); statePanel.add(compound.editable); statePanel.add(Box.createVerticalGlue()); compound.panel.add(statePanel, BorderLayout.EAST); return compound; } private JPanel createRightAlignedPanel() { compound2 = createTextFieldCompound("Right aligned", 2); compound2.setupTextfields("Hello World!", JTextField.RIGHT, new Font[] { new Font("Dialog", Font.PLAIN, 8), new Font("Dialog", Font.ITALIC, 12), new Font("Dialog", Font.BOLD, 14) }); return compound2.panel; } private JPanel createCenteredPanel() { compound3 = createTextFieldCompound("Centered", 3); compound3.setupTextfields("Hello World!", JTextField.CENTER, new Font[] { new Font("Dialog", Font.PLAIN, 8), new Font("Dialog", Font.ITALIC, 12), new Font("Dialog", Font.BOLD, 14) }); return compound3.panel; } private JPanel createCustomColorPanel1() { compound4 = createTextFieldCompound("Custom colors I", 4); compound4.textfield1 = new JTextField("custom foreground"); compound4.textfield1.setForeground(Color.RED); compound4.textFieldPanel.add(compound4.textfield1); compound4.textfield2 = new JTextField("custom background"); compound4.textfield2.setBackground(Color.YELLOW); compound4.textFieldPanel.add(compound4.textfield2); compound4.textfield3 = new JTextField("custom foreground and background"); compound4.textfield3.setForeground(Color.RED); compound4.textfield3.setBackground(Color.YELLOW); compound4.textFieldPanel.add(compound4.textfield3); return compound4.panel; } private JPanel createCustomColorPanel2() { compound5 = createTextFieldCompound("Custom colors II", 5); compound5.textfield1 = new JTextField("custom disabled textcolor"); compound5.textfield1.setDisabledTextColor(Color.BLUE); compound5.textFieldPanel.add(compound5.textfield1); compound5.textfield2 = new JTextField("custom selected text color"); compound5.textfield2.setSelectedTextColor(Color.RED); compound5.textFieldPanel.add(compound5.textfield2); compound5.textfield3 = new JTextField("custom selection color"); compound5.textfield3.setSelectionColor(Color.BLACK); compound5.textFieldPanel.add(compound5.textfield3); return compound5.panel; } private JPanel createMiscPanel() { compound6 = createTextFieldCompound("Miscellaneous", 6); compound6.textfield1 = new JTextField("Custom Caret"); compound6.textfield1.setCaret(new CornerCaret()); compound6.textFieldPanel.add(compound6.textfield1); compound6.textfield2 = new JTextField("Custom Caret color"); compound6.textfield2.setForeground(Color.LIGHT_GRAY); compound6.textfield2.setBackground(Color.BLACK); compound6.textfield2.setSelectedTextColor(Color.BLACK); compound6.textfield2.setCaretColor(Color.WHITE); compound6.textfield2.setSelectionColor(Color.DARK_GRAY); compound6.textFieldPanel.add(compound6.textfield2); compound6.textfield3 = new JTextField("Custom highlighter"); compound6.textfield3.setCaret(new DefaultCaret() { public Highlighter.HighlightPainter getSelectionPainter() { return DemoHighlightPainter.INSTANCE; } }); compound6.textFieldPanel.add(compound6.textfield3); return compound6.panel; } private JPanel createCustomBordersPanel() { compound7 = createTextFieldCompound("Custom borders", 7); compound7.textfield1 = new JTextField("red 5 pixel lineborder"); compound7.textfield1.setBorder(new LineBorder(Color.RED, 5)); compound7.textFieldPanel.add(compound7.textfield1); compound7.textfield2 = new JTextField("complex irregular border"); CompoundBorder innerCompound = new CompoundBorder(new EmptyBorder(5, 40, 15, 10), new LineBorder(Color.BLACK)); CompoundBorder outerCompound = new CompoundBorder(new LineBorder(Color.BLACK), innerCompound); compound7.textfield2.setBorder(outerCompound); compound7.textFieldPanel.add(compound7.textfield2); compound7.textfield3 = new JTextField("a titled border", 10); compound7.textfield3.setBorder(new TitledBorder(null, "Freak Out Border", TitledBorder.CENTER, TitledBorder.LEFT)); compound7.textFieldPanel.add(compound7.textfield3); return compound7.panel; } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("CLOSE")) { System.exit(0); } else if (e.getActionCommand().equals("ENABLED1")) { boolean enabled = compound1.enabled.isSelected(); compound1.textfield1.setEnabled(enabled); compound1.textfield2.setEnabled(enabled); compound1.textfield3.setEnabled(enabled); } else if (e.getActionCommand().equals("EDITABLE1")) { boolean editable = compound1.editable.isSelected(); compound1.textfield1.setEditable(editable); compound1.textfield2.setEditable(editable); compound1.textfield3.setEditable(editable); } else if (e.getActionCommand().equals("ENABLED2")) { boolean enabled = compound2.enabled.isSelected(); compound2.textfield1.setEnabled(enabled); compound2.textfield2.setEnabled(enabled); compound2.textfield3.setEnabled(enabled); } else if (e.getActionCommand().equals("EDITABLE2")) { boolean editable = compound2.editable.isSelected(); compound2.textfield1.setEditable(editable); compound2.textfield2.setEditable(editable); compound2.textfield3.setEditable(editable); } else if (e.getActionCommand().equals("ENABLED3")) { boolean enabled = compound3.enabled.isSelected(); compound3.textfield1.setEnabled(enabled); compound3.textfield2.setEnabled(enabled); compound3.textfield3.setEnabled(enabled); } else if (e.getActionCommand().equals("EDITABLE3")) { boolean editable = compound3.editable.isSelected(); compound3.textfield1.setEditable(editable); compound3.textfield2.setEditable(editable); compound3.textfield3.setEditable(editable); } else if (e.getActionCommand().equals("ENABLED4")) { boolean enabled = compound4.enabled.isSelected(); compound4.textfield1.setEnabled(enabled); compound4.textfield2.setEnabled(enabled); compound4.textfield3.setEnabled(enabled); } else if (e.getActionCommand().equals("EDITABLE4")) { boolean editable = compound4.editable.isSelected(); compound4.textfield1.setEditable(editable); compound4.textfield2.setEditable(editable); compound4.textfield3.setEditable(editable); } else if (e.getActionCommand().equals("ENABLED5")) { boolean enabled = compound5.enabled.isSelected(); compound5.textfield1.setEnabled(enabled); compound5.textfield2.setEnabled(enabled); compound5.textfield3.setEnabled(enabled); } else if (e.getActionCommand().equals("EDITABLE5")) { boolean editable = compound5.editable.isSelected(); compound5.textfield1.setEditable(editable); compound5.textfield2.setEditable(editable); compound5.textfield3.setEditable(editable); } else if (e.getActionCommand().equals("ENABLED6")) { boolean enabled = compound6.enabled.isSelected(); compound6.textfield1.setEnabled(enabled); compound6.textfield2.setEnabled(enabled); compound6.textfield3.setEnabled(enabled); } else if (e.getActionCommand().equals("EDITABLE6")) { boolean editable = compound6.editable.isSelected(); compound6.textfield1.setEditable(editable); compound6.textfield2.setEditable(editable); compound6.textfield3.setEditable(editable); } else if (e.getActionCommand().equals("ENABLED7")) { boolean enabled = compound7.enabled.isSelected(); compound7.textfield1.setEnabled(enabled); compound7.textfield2.setEnabled(enabled); compound7.textfield3.setEnabled(enabled); } else if (e.getActionCommand().equals("EDITABLE7")) { boolean editable = compound7.editable.isSelected(); compound7.textfield1.setEditable(editable); compound7.textfield2.setEditable(editable); compound7.textfield3.setEditable(editable); } } public static void main(String[] args) { SwingUtilities.invokeLater (new Runnable() { public void run() { TextFieldDemo app = new TextFieldDemo(); app.initFrameContent(); JFrame frame = new JFrame("TextField demo"); frame.getContentPane().add(app); frame.pack(); frame.setVisible(true); } }); } /** * Returns a DemoFactory that creates a TextFieldDemo. * * @return a DemoFactory that creates a TextFieldDemo */ public static DemoFactory createDemoFactory() { return new DemoFactory() { public JComponent createDemo() { return new TextFieldDemo(); } }; } static class Compound { JTextField textfield1; JTextField textfield2; JTextField textfield3; JCheckBox enabled; JCheckBox editable; JPanel textFieldPanel; JPanel panel; /** Creates and initializes the textfields with the same text and * alignment but with a different font. * * @param title The text for the textfields. * @param align The alignment for the textfields. * @param fonts The fonts to be used for the textfields. */ void setupTextfields(String title, int align, Font[] fonts) { textfield1 = new JTextField(title); textfield1.setHorizontalAlignment(align); textfield1.setFont(fonts[0]); textFieldPanel.add(textfield1); textfield2 = new JTextField(title); textfield2.setHorizontalAlignment(align); textfield2.setFont(fonts[1]); textFieldPanel.add(textfield2); textfield3 = new JTextField(title); textfield3.setHorizontalAlignment(align); textfield3.setFont(fonts[2]); textFieldPanel.add(textfield3); } } }