/* * Copyright (c) 2005-2008 Substance Kirill Grouchnikov. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o 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. * * o Neither the name of Substance Kirill Grouchnikov nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. */ package test.check; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Insets; import java.awt.Rectangle; import java.text.DecimalFormat; import javax.swing.JEditorPane; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.SwingUtilities; import org.pushingpixels.lafwidget.LafWidget; import org.pushingpixels.lafwidget.text.PasswordStrengthChecker; import org.pushingpixels.lafwidget.utils.LafConstants.PasswordStrength; import org.pushingpixels.substance.api.SubstanceLookAndFeel; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.FormLayout; /** * Test application panel for testing {@link JTextArea}, {@link JTextField}, * {@link JTextPane}, {@link JPasswordField}, {@link JEditorPane} and * {@link JFormattedTextField} components. * * @author Kirill Grouchnikov */ public class TextFieldsPanel extends JPanel implements Deferrable { private boolean isInitialized; @Override public boolean isInitialized() { return this.isInitialized; } /** * Returns the panel contents. * * @return The panel contents. */ private JPanel getContents() { FormLayout lm = new FormLayout( "right:pref, 4dlu, fill:default:grow(1), 4dlu," + "fill:default:grow(1), 4dlu, fill:default:grow(1)", ""); // lm.setColumnGroups(new int[][] { { 3, 5, 7 } }); DefaultFormBuilder builder = new DefaultFormBuilder(lm, new ScrollablePanel()); builder.setDefaultDialogBorder(); JLabel textLabel = new JLabel("Text fields"); JLabel formattedTextLabel = new JLabel("Formatted text fields"); JLabel passwordLabel = new JLabel("Password fields"); // textLabel.setFont(textLabel.getFont().deriveFont(Font.BOLD)); // formattedTextLabel.setFont(formattedTextLabel.getFont().deriveFont( // Font.BOLD)); // passwordLabel.setFont(passwordLabel.getFont().deriveFont(Font.BOLD)); builder.append("", textLabel); builder.append(formattedTextLabel, passwordLabel); JTextField jtf1 = new JTextField("sample text"); builder.append("Enabled", jtf1); JFormattedTextField jftf1 = new JFormattedTextField(new DecimalFormat( "#,##0.0000")); jftf1.setText("2,430.0000"); JPasswordField jpf1 = new JPasswordField("password", 10); builder.append(jftf1, jpf1); JTextField jtfNotEditable = new JTextField("sample text"); jtfNotEditable.setEditable(false); builder.append("Not editable", jtfNotEditable); JFormattedTextField jftfNotEditable = new JFormattedTextField( new DecimalFormat("#,##0.0000")); jftfNotEditable.setText("2,430.0000"); jftfNotEditable.setEditable(false); JPasswordField jpfNotEditable = new JPasswordField("password", 10); jpfNotEditable.setEditable(false); builder.append(jftfNotEditable, jpfNotEditable); JTextField jtfNotEditableWithLock = new JTextField("sample text"); jtfNotEditableWithLock.setEditable(false); jtfNotEditableWithLock.putClientProperty(LafWidget.HAS_LOCK_ICON, Boolean.TRUE); builder.append("Not editable with lock", jtfNotEditableWithLock); JFormattedTextField jftfNotEditableWithLock = new JFormattedTextField( new DecimalFormat("#,##0.0000")); jftfNotEditableWithLock.setText("2,430.0000"); jftfNotEditableWithLock.setEditable(false); jftfNotEditableWithLock.putClientProperty(LafWidget.HAS_LOCK_ICON, Boolean.TRUE); JPasswordField jpfNotEditableWithLock = new JPasswordField("password", 10); jpfNotEditableWithLock.setEditable(false); jpfNotEditableWithLock.putClientProperty(LafWidget.HAS_LOCK_ICON, Boolean.TRUE); builder.append(jftfNotEditableWithLock, jpfNotEditableWithLock); JTextField jtfDisabled = new JTextField("sample text"); jtfDisabled.setEnabled(false); builder.append("Disabled", jtfDisabled); JFormattedTextField jftfDisabled = new JFormattedTextField( new DecimalFormat("#,##0.0000")); jftfDisabled.setText("2,430.0000"); jftfDisabled.setEnabled(false); JPasswordField jpfDisabled = new JPasswordField("password", 10); jpfDisabled.setEnabled(false); builder.append(jftfDisabled, jpfDisabled); JTextField jtfNonOpaque = new JTextField("sample text"); jtfNonOpaque.setOpaque(false); builder.append("Non opaque", jtfNonOpaque); JFormattedTextField jftfNonOpaque = new JFormattedTextField( new DecimalFormat("#,##0.0000")); jftfNonOpaque.setText("2,430.0000"); jftfNonOpaque.setOpaque(false); JPasswordField jpfNonOpaque = new JPasswordField("password", 10); jpfNonOpaque.setOpaque(false); builder.append(jftfNonOpaque, jpfNonOpaque); JTextField jtfWatermarkBleed = new JTextField("sample text"); jtfWatermarkBleed.putClientProperty( SubstanceLookAndFeel.WATERMARK_VISIBLE, Boolean.TRUE); builder.append("Watermark bleed", jtfWatermarkBleed); JFormattedTextField jftfWatermarkBleed = new JFormattedTextField( new DecimalFormat("#,##0.0000")); jftfWatermarkBleed.setText("2,430.0000"); jftfWatermarkBleed.putClientProperty( SubstanceLookAndFeel.WATERMARK_VISIBLE, Boolean.TRUE); JPasswordField jpfWatermarkBleed = new JPasswordField("password", 10); jpfWatermarkBleed.putClientProperty( SubstanceLookAndFeel.WATERMARK_VISIBLE, Boolean.TRUE); builder.append(jftfWatermarkBleed, jpfWatermarkBleed); JTextField jtf4 = new JTextField("sample text"); jtf4.putClientProperty(LafWidget.TEXT_SELECT_ON_FOCUS, Boolean.TRUE); builder.append("Select all on focus", jtf4); JFormattedTextField jftf4 = new JFormattedTextField(new DecimalFormat( "#,##0.0000")); jftf4.setText("2,430.0000"); jftf4.putClientProperty(LafWidget.TEXT_SELECT_ON_FOCUS, Boolean.TRUE); builder.append(jftf4); builder.nextLine(); JTextField jtf4_1 = new JTextField("sample text"); jtf4_1.putClientProperty(LafWidget.TEXT_FLIP_SELECT_ON_ESCAPE, Boolean.TRUE); builder.append("Flip selection on ESC", jtf4_1); JFormattedTextField jftf4_1 = new JFormattedTextField( new DecimalFormat("#,##0.0000")); jftf4_1.setText("2,430.0000"); jftf4_1.putClientProperty(LafWidget.TEXT_FLIP_SELECT_ON_ESCAPE, Boolean.TRUE); builder.append(jftf4_1); builder.nextLine(); JTextField jtf5 = new JTextField("sample text"); jtf5.putClientProperty(LafWidget.TEXT_EDIT_CONTEXT_MENU, Boolean.TRUE); builder.append("With context menu", jtf5); JFormattedTextField jftf5 = new JFormattedTextField(new DecimalFormat( "#,##0.0000")); jftf5.setText("2,430.0000"); jftf5.putClientProperty(LafWidget.TEXT_EDIT_CONTEXT_MENU, Boolean.TRUE); builder.append(jftf5); builder.nextLine(); JTextField jtf6 = new JTextField("sample text"); jtf6.setMargin(new Insets(2, 2, 2, 2)); builder.append("With margin a2", jtf6); JFormattedTextField jftf6 = new JFormattedTextField(new DecimalFormat( "#,##0.0000")); jftf6.setText("2,430.0000"); jftf6.setMargin(new Insets(2, 2, 2, 2)); JPasswordField jpf6 = new JPasswordField("password", 10); jpf6.setMargin(new Insets(2, 2, 2, 2)); builder.append(jftf6, jpf6); JTextField jtf60 = new JTextField("sample text"); jtf60.setMargin(new Insets(0, 10, 0, 0)); builder.append("With margin l10", jtf60); JFormattedTextField jftf60 = new JFormattedTextField(new DecimalFormat( "#,##0.0000")); jftf60.setText("2,430.0000"); jftf60.setMargin(new Insets(0, 10, 0, 0)); JPasswordField jpf60 = new JPasswordField("password", 10); jpf60.setMargin(new Insets(0, 10, 0, 0)); builder.append(jftf60, jpf60); JPasswordField jpfEmptyEchoChar = new JPasswordField("password", 10); jpfEmptyEchoChar.setEchoChar((char) 0); builder.append("Empty echo char", new JLabel()); builder.append(new JLabel(), jpfEmptyEchoChar); JPasswordField jpfStrengthChecker = new JPasswordField("password", 10); try { jpfStrengthChecker.putClientProperty( LafWidget.PASSWORD_STRENGTH_CHECKER, new PasswordStrengthChecker() { public PasswordStrength getStrength(char[] password) { if (password == null) return PasswordStrength.WEAK; int length = password.length; if (length < 3) return PasswordStrength.WEAK; if (length < 6) return PasswordStrength.MEDIUM; return PasswordStrength.STRONG; } public String getDescription(PasswordStrength strength) { if (strength == PasswordStrength.WEAK) return "<html>This password is <b>way</b> too weak</html>"; if (strength == PasswordStrength.MEDIUM) return "<html>Come on, you can do<br> a little better than that</html>"; if (strength == PasswordStrength.STRONG) return "OK"; return null; } }); builder.append("Strength checker", new JLabel()); builder.append(new JLabel(), jpfStrengthChecker); } catch (Throwable t) { } JPasswordField jpfTwoEchoChar = new JPasswordField("password", 10); jpfTwoEchoChar.putClientProperty( SubstanceLookAndFeel.PASSWORD_ECHO_PER_CHAR, new Integer(2)); builder.append("Two echo chars", new JLabel()); builder.append(new JLabel(), jpfTwoEchoChar); JLabel editorPaneLabel = new JLabel("Editor panes"); JLabel textAreaLabel = new JLabel("Text areas"); JLabel textPaneLabel = new JLabel("Text panes"); // editorPaneLabel // .setFont(editorPaneLabel.getFont().deriveFont(Font.BOLD)); // textAreaLabel.setFont(textAreaLabel.getFont().deriveFont(Font.BOLD)); // textPaneLabel.setFont(textPaneLabel.getFont().deriveFont(Font.BOLD)); builder.append("", editorPaneLabel); builder.append(textAreaLabel, textPaneLabel); JEditorPane jep1 = new JEditorPane("text/html;", "Sample <b>content</b><br> <u>text</u>"); builder.append("Enabled", jep1); JTextArea jta1 = new JTextArea("Sample content text", 3, 20); JTextPane jtp1 = new JTextPane(); jtp1.replaceSelection("Sample content text"); jtp1.setPreferredSize(new Dimension(100, 40)); builder.append(jta1, jtp1); JEditorPane jepNotEditable = new JEditorPane("text/html;", "Sample <b>content</b><br> <u>text</u>"); jepNotEditable.setEditable(false); builder.append("Not editable", jepNotEditable); JTextArea jtaNotEditable = new JTextArea("Sample content text", 3, 20); jtaNotEditable.setEditable(false); JTextPane jtpNotEditable = new JTextPane(); jtpNotEditable.replaceSelection("Sample content text"); jtpNotEditable.setPreferredSize(new Dimension(100, 40)); jtpNotEditable.setEditable(false); builder.append(jtaNotEditable, jtpNotEditable); JEditorPane jepNotEditableWithLock = new JEditorPane("text/html;", "Sample <b>content</b><br> <u>text</u>"); jepNotEditableWithLock.setEditable(false); jepNotEditableWithLock.putClientProperty(LafWidget.HAS_LOCK_ICON, Boolean.TRUE); builder.append("Not editable with lock", jepNotEditableWithLock); JTextArea jtaNotEditableWithLock = new JTextArea("Sample content text", 3, 20); jtaNotEditableWithLock.setEditable(false); jtaNotEditableWithLock.putClientProperty(LafWidget.HAS_LOCK_ICON, Boolean.TRUE); JTextPane jtpNotEditableWithLock = new JTextPane(); jtpNotEditableWithLock.replaceSelection("Sample content text"); jtpNotEditableWithLock.setPreferredSize(new Dimension(100, 40)); jtpNotEditableWithLock.setEditable(false); jtpNotEditableWithLock.putClientProperty(LafWidget.HAS_LOCK_ICON, Boolean.TRUE); builder.append(jtaNotEditableWithLock, jtpNotEditableWithLock); JEditorPane jep3 = new JEditorPane("text/html;", "Sample <b>content</b><br> <u>text</u>"); jep3.setEnabled(false); builder.append("Disabled", jep3); JTextArea jta3 = new JTextArea("Sample content text", 3, 20); jta3.setEnabled(false); JTextPane jtp3 = new JTextPane(); jtp3.replaceSelection("Sample content text"); jtp3.setPreferredSize(new Dimension(100, 40)); jtp3.setEnabled(false); builder.append(jta3, jtp3); JEditorPane jepNonOpaque = new JEditorPane("text/html;", "Sample <b>content</b><br> <u>text</u>"); jepNonOpaque.setOpaque(false); builder.append("Non opaque", jepNonOpaque); JTextArea jtaNonOpaque = new JTextArea("Sample content text", 3, 20); jtaNonOpaque.setOpaque(false); JTextPane jtpNonOpaque = new JTextPane(); jtpNonOpaque.replaceSelection("Sample content text"); jtpNonOpaque.setPreferredSize(new Dimension(100, 40)); jtpNonOpaque.setOpaque(false); builder.append(jtaNonOpaque, jtpNonOpaque); JEditorPane jepWatermarkBleed = new JEditorPane("text/html;", "Sample <b>content</b><br> <u>text</u>"); jepWatermarkBleed.putClientProperty( SubstanceLookAndFeel.WATERMARK_VISIBLE, Boolean.TRUE); builder.append("Watermark bleed", jepWatermarkBleed); JTextArea jtaWatermarkBleed = new JTextArea("Sample content text", 3, 20); jtaWatermarkBleed.putClientProperty( SubstanceLookAndFeel.WATERMARK_VISIBLE, Boolean.TRUE); JTextPane jtpWatermarkBleed = new JTextPane(); jtpWatermarkBleed.replaceSelection("Sample content text"); jtpWatermarkBleed.setPreferredSize(new Dimension(100, 40)); jtpWatermarkBleed.putClientProperty( SubstanceLookAndFeel.WATERMARK_VISIBLE, Boolean.TRUE); builder.append(jtaWatermarkBleed, jtpWatermarkBleed); JEditorPane jep4 = new JEditorPane("text/html;", "Sample <b>content</b><br> <u>text</u>"); jep4.setMargin(new Insets(2, 2, 2, 2)); builder.append("With margin", jep4); JTextArea jta4 = new JTextArea("Sample content text", 3, 20); jta4.setMargin(new Insets(2, 2, 2, 2)); JTextPane jtp4 = new JTextPane(); jtp4.replaceSelection("Sample content text"); jtp4.setPreferredSize(new Dimension(100, 40)); jtp4.setMargin(new Insets(2, 2, 2, 2)); builder.append(jta4, jtp4); JTextArea jtaLineWrap = new JTextArea( "The contents of this text area wrap, but not necessarily between words", 3, 15); jtaLineWrap.setLineWrap(true); builder.append("Line wrap", new JLabel("")); builder.append(jtaLineWrap, new JLabel("")); JTextArea jtaLineWrapWords = new JTextArea( "The contents of this text area wrap, necessarily between words", 3, 15); jtaLineWrapWords.setLineWrap(true); jtaLineWrapWords.setWrapStyleWord(true); builder.append("Line wrap words", new JLabel("")); builder.append(jtaLineWrapWords, new JLabel("")); JTextArea textAreaScroll = new JTextArea(5, 15); for (int i = 0; i < 20; i++) { textAreaScroll.append("Some long long long line with number " + i + "\n"); } textAreaScroll.setEditable(false); builder.append("Scrollable", new JScrollPane(textAreaScroll)); builder.nextLine(); JTextArea textAreaScrollWithLock = new JTextArea(5, 15); for (int i = 0; i < 20; i++) { textAreaScrollWithLock .append("Some long long long line with number " + i + "\n"); } textAreaScrollWithLock.putClientProperty(LafWidget.HAS_LOCK_ICON, Boolean.TRUE); textAreaScrollWithLock.setEditable(false); builder.append("Scrollable with lock", new JScrollPane( textAreaScrollWithLock)); JPanel result = builder.getPanel(); result.setName("Text fields panel"); // result.setBackground(Color.red); return result; } /** * Creates a test panel with text components. */ public TextFieldsPanel() { setLayout(new BorderLayout()); } @Override public synchronized void initialize() { final JPanel contents = getContents(); JScrollPane scroller = new JScrollPane(contents); this.add(scroller, BorderLayout.CENTER); this.isInitialized = true; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { contents.scrollRectToVisible(new Rectangle(0, 0, 10, 10)); } }); } }