From d8e59f2cf3a0a68ef4a66917f0fc4a617b4e012b Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 16 Mar 2025 11:10:02 +0100 Subject: [PATCH] TextComponents: `selectAllOnFocusPolicy` related changes: - No longer select all text if selection (or caret position) was changed by application and `selectAllOnFocusPolicy` is `once` (the default). (issue #983) - FormattedTextField and Spinner: `selectAllOnFocusPolicy = once` behaves now as `always` (was `never` before), which means that all text is selected when component gains focus. This is because of special behavior of `JFormattedTextField` that did not allow implementation of `once`. - Client property `JTextField.selectAllOnFocusPolicy` now also works on (editable) `JComboBox` and on `JSpinner`. - Added client property `JTextField.selectAllOnMouseClick` to override UI property `TextComponent.selectAllOnMouseClick`. (issue #961) - For `selectAllOnMouseClick = true`, clicking with the mouse into the text field, to focus it, now always selects all text, even if `selectAllOnFocusPolicy` is `once`. --- CHANGELOG.md | 15 + .../formdev/flatlaf/FlatClientProperties.java | 26 +- .../com/formdev/flatlaf/ui/FlatCaret.java | 106 ++++- .../testing/FlatSingleComponentTest.java | 22 +- .../testing/FlatTextComponentsTest.java | 110 +++-- .../testing/FlatTextComponentsTest.jfd | 24 +- .../testing/FlatTextSelectAllOnFocusTest.java | 423 ++++++++++++++++++ .../testing/FlatTextSelectAllOnFocusTest.jfd | 327 ++++++++++++++ 8 files changed, 976 insertions(+), 77 deletions(-) create mode 100644 flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextSelectAllOnFocusTest.java create mode 100644 flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextSelectAllOnFocusTest.jfd diff --git a/CHANGELOG.md b/CHANGELOG.md index 3501db20..cbb35fbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,21 @@ FlatLaf Change Log application where multiple class loaders are involved. E.g. in Eclipse plugin or in LibreOffice extension. (issues #955 and #851) - HTML: Fixed rendering of `
` in dark themes. (issue #932) +- TextComponents: `selectAllOnFocusPolicy` related changes: + - No longer select all text if selection (or caret position) was changed by + application and `selectAllOnFocusPolicy` is `once` (the default). (issue + #983) + - FormattedTextField and Spinner: `selectAllOnFocusPolicy = once` behaves now + as `always` (was `never` before), which means that all text is selected when + component gains focus. This is because of special behavior of + `JFormattedTextField` that did not allow implementation of `once`. + - Client property `JTextField.selectAllOnFocusPolicy` now also works on + (editable) `JComboBox` and on `JSpinner`. + - Added client property `JTextField.selectAllOnMouseClick` to override UI + property `TextComponent.selectAllOnMouseClick`. (issue #961) + - For `selectAllOnMouseClick = true`, clicking with the mouse into the text + field, to focus it, now always selects all text, even if + `selectAllOnFocusPolicy` is `once`. #### Incompatibilities diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index 2625294f..e26b7ec3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -21,6 +21,8 @@ import java.awt.IllegalComponentStateException; import java.awt.Window; import java.util.Objects; import javax.swing.JComponent; +import javax.swing.JFormattedTextField; +import javax.swing.JSpinner; import javax.swing.SwingConstants; /** @@ -1209,12 +1211,15 @@ public interface FlatClientProperties /** * Specifies whether all text is selected when the text component gains focus. *

- * Component {@link javax.swing.JTextField} (and subclasses)
+ * Components {@link javax.swing.text.JTextComponent} (and subclasses), + * {@link javax.swing.JComboBox} (since 3.6) and {@link javax.swing.JSpinner} (since 3.6)
* Value type {@link java.lang.String}
* Allowed Values * {@link #SELECT_ALL_ON_FOCUS_POLICY_NEVER}, * {@link #SELECT_ALL_ON_FOCUS_POLICY_ONCE} (default) or * {@link #SELECT_ALL_ON_FOCUS_POLICY_ALWAYS} + * + * @see #SELECT_ALL_ON_MOUSE_CLICK */ String SELECT_ALL_ON_FOCUS_POLICY = "JTextField.selectAllOnFocusPolicy"; @@ -1229,6 +1234,12 @@ public interface FlatClientProperties * Select all text when the text component gains focus for the first time * and selection was not modified (is at end of text). * This is the default. + *

+ * Limitations: + * For {@link JFormattedTextField} and {@link JSpinner} this behaves + * as {@link #SELECT_ALL_ON_FOCUS_POLICY_ALWAYS}. + * This is because of special behavior of {@link JFormattedTextField} + * that did not allow implementation of {@code "once"}. * * @see #SELECT_ALL_ON_FOCUS_POLICY */ @@ -1241,6 +1252,19 @@ public interface FlatClientProperties */ String SELECT_ALL_ON_FOCUS_POLICY_ALWAYS = "always"; + /** + * Specifies whether all text is selected when when clicking with the mouse + * into the text field (and if "select all on focus" policy is enabled). + *

+ * Components {@link javax.swing.text.JTextComponent} (and subclasses), + * {@link javax.swing.JComboBox} and {@link javax.swing.JSpinner}
+ * Value type {@link java.lang.Boolean} + * + * @see #SELECT_ALL_ON_FOCUS_POLICY + * @since 3.6 + */ + String SELECT_ALL_ON_MOUSE_CLICK = "JTextField.selectAllOnMouseClick"; + /** * Placeholder text that is only painted if the text field is empty. *

diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java index e301961e..0edf010b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCaret.java @@ -17,6 +17,7 @@ package com.formdev.flatlaf.ui; import static com.formdev.flatlaf.FlatClientProperties.*; +import java.awt.Container; import java.awt.EventQueue; import java.awt.Rectangle; import java.awt.event.ActionEvent; @@ -24,7 +25,9 @@ import java.awt.event.FocusEvent; import java.awt.event.MouseEvent; import javax.swing.Action; import javax.swing.ActionMap; +import javax.swing.JComboBox; import javax.swing.JFormattedTextField; +import javax.swing.JSpinner; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.UIResource; @@ -33,6 +36,7 @@ import javax.swing.text.DefaultCaret; import javax.swing.text.DefaultEditorKit; import javax.swing.text.Document; import javax.swing.text.JTextComponent; +import javax.swing.text.Position; import javax.swing.text.Utilities; /** @@ -48,12 +52,15 @@ public class FlatCaret { private static final String KEY_CARET_INFO = "FlatLaf.internal.caretInfo"; + // selectAllOnFocusPolicy + private static final int NEVER = 0, ONCE = 1, ALWAYS = 2; + private final String selectAllOnFocusPolicy; private final boolean selectAllOnMouseClick; private boolean inInstall; private boolean wasFocused; - private boolean wasTemporaryLost; + private boolean wasFocusTemporaryLost; private boolean isMousePressed; private boolean isWordSelection; private boolean isLineSelection; @@ -94,6 +101,9 @@ public class FlatCaret // restore selection select( (int) ci[1], (int) ci[0] ); + if( ci[4] != 0 ) + wasFocused = true; + // if text component is focused, then caret and selection are visible, // but when switching theme, the component does not yet have // a highlighter and the selection is not painted @@ -121,6 +131,7 @@ public class FlatCaret getMark(), getBlinkRate(), System.currentTimeMillis(), + wasFocused ? 1 : 0, } ); super.deinstall( c ); @@ -140,11 +151,36 @@ public class FlatCaret super.adjustVisibility( nloc ); } + @Override + public void setDot( int dot ) { + super.setDot( dot ); + + // mark as focused if invoked from JTextComponent.setCaretPosition() + // to disable SELECT_ALL_ON_FOCUS_POLICY_ONCE if application explicitly changes selection + if( !wasFocused && + getSelectAllOnFocusPolicy() == ONCE && + StackUtils.wasInvokedFrom( JTextComponent.class.getName(), "setCaretPosition", 6 ) ) + wasFocused = true; + } + + @Override + public void moveDot( int dot ) { + super.moveDot( dot ); + + // mark as focused if invoked from JTextComponent.moveCaretPosition() + // to disable SELECT_ALL_ON_FOCUS_POLICY_ONCE if application explicitly changes selection + if( !wasFocused && + getSelectAllOnFocusPolicy() == ONCE && + StackUtils.wasInvokedFrom( JTextComponent.class.getName(), "moveCaretPosition", 6 ) ) + wasFocused = true; + } + @Override public void focusGained( FocusEvent e ) { - if( !inInstall && !wasTemporaryLost && (!isMousePressed || selectAllOnMouseClick) ) + if( !inInstall && !wasFocusTemporaryLost && (!isMousePressed || isSelectAllOnMouseClick()) ) selectAllOnFocusGained(); - wasTemporaryLost = false; + + wasFocusTemporaryLost = false; wasFocused = true; super.focusGained( e ); @@ -152,7 +188,7 @@ public class FlatCaret @Override public void focusLost( FocusEvent e ) { - wasTemporaryLost = e.isTemporary(); + wasFocusTemporaryLost = e.isTemporary(); super.focusLost( e ); } @@ -232,24 +268,13 @@ public class FlatCaret if( doc == null || !c.isEnabled() || !c.isEditable() || FlatUIUtils.isCellEditor( c ) ) return; - Object selectAllOnFocusPolicy = c.getClientProperty( SELECT_ALL_ON_FOCUS_POLICY ); - if( selectAllOnFocusPolicy == null ) - selectAllOnFocusPolicy = this.selectAllOnFocusPolicy; - - if( selectAllOnFocusPolicy == null || SELECT_ALL_ON_FOCUS_POLICY_NEVER.equals( selectAllOnFocusPolicy ) ) + int selectAllOnFocusPolicy = getSelectAllOnFocusPolicy(); + if( selectAllOnFocusPolicy == NEVER ) return; - if( !SELECT_ALL_ON_FOCUS_POLICY_ALWAYS.equals( selectAllOnFocusPolicy ) ) { - // policy is "once" (or null or unknown) - + if( selectAllOnFocusPolicy == ONCE && !isMousePressed ) { // was already focused? - if( wasFocused ) - return; - - // check whether selection was modified before gaining focus - int dot = getDot(); - int mark = getMark(); - if( dot != mark || dot != doc.getLength() ) + if( wasFocused && !(c instanceof JFormattedTextField) ) return; } @@ -265,16 +290,51 @@ public class FlatCaret select( 0, c2.getDocument().getLength() ); } ); - } else { + } else select( 0, doc.getLength() ); - } } private void select( int mark, int dot ) { if( mark != getMark() ) - setDot( mark ); + setDot( mark, Position.Bias.Forward ); if( dot != getDot() ) - moveDot( dot ); + moveDot( dot, Position.Bias.Forward ); + } + + private int getSelectAllOnFocusPolicy() { + Object value = getClientProperty( SELECT_ALL_ON_FOCUS_POLICY ); + // Note: using String.valueOf() because selectAllOnFocusPolicy may be null + switch( String.valueOf( value instanceof String ? value : selectAllOnFocusPolicy ) ) { + default: + case SELECT_ALL_ON_FOCUS_POLICY_NEVER: return NEVER; + case SELECT_ALL_ON_FOCUS_POLICY_ONCE: return ONCE; + case SELECT_ALL_ON_FOCUS_POLICY_ALWAYS: return ALWAYS; + } + } + + private boolean isSelectAllOnMouseClick() { + Object value = getClientProperty( SELECT_ALL_ON_MOUSE_CLICK ); + return (value instanceof Boolean) ? (boolean) value : selectAllOnMouseClick; + } + + private Object getClientProperty( String key ) { + JTextComponent c = getComponent(); + if( c == null ) + return null; + + Object value = c.getClientProperty( key ); + if( value != null ) + return value; + + Container parent = c.getParent(); + if( parent instanceof JComboBox ) + return ((JComboBox)parent).getClientProperty( key ); + if( parent instanceof JSpinner.DefaultEditor ) { + parent = parent.getParent(); + if( parent instanceof JSpinner ) + return ((JSpinner)parent).getClientProperty( key ); + } + return null; } /** @since 1.4 */ diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatSingleComponentTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatSingleComponentTest.java index 6c40eb87..a2b51e5f 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatSingleComponentTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatSingleComponentTest.java @@ -24,13 +24,8 @@ import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JScrollPane; -import javax.swing.KeyStroke; -import javax.swing.UIManager; +import java.util.function.Supplier; +import javax.swing.*; import javax.swing.plaf.metal.MetalLookAndFeel; import javax.swing.plaf.nimbus.NimbusLookAndFeel; import com.formdev.flatlaf.FlatDarculaLaf; @@ -59,11 +54,18 @@ public class FlatSingleComponentTest private final JLabel infoLabel; - private JComponent createSingleComponent() { + protected JComponent createSingleComponent() { return new JButton( "hello" ); } public static void main( String[] args ) { + EventQueue.invokeLater( () -> { + launch( FlatSingleComponentTest::new, args ); + } ); + } + + @SuppressWarnings( "ReturnValueIgnored" ) // Error Prone + protected static void launch( Supplier factory, String[] args ) { DemoPrefs.init( PREFS_ROOT_PATH ); DemoPrefs.initSystemScale(); @@ -88,10 +90,10 @@ public class FlatSingleComponentTest DemoPrefs.setupLaf( args ); // create and show frame - new FlatSingleComponentTest(); + factory.get(); } - private FlatSingleComponentTest() { + protected FlatSingleComponentTest() { super( "FlatSingleComponentTest" ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.java index 8b74098e..da05be2c 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.java @@ -18,7 +18,9 @@ package com.formdev.flatlaf.testing; import java.awt.Color; import java.awt.Component; +import java.awt.Container; import java.awt.Dimension; +import java.awt.FocusTraversalPolicy; import java.awt.Graphics; import java.awt.Insets; import java.util.function.Supplier; @@ -47,6 +49,12 @@ public class FlatTextComponentsTest FlatTextComponentsTest() { initComponents(); updatePreferredSizes(); + + // exclude from tab focus traversal + controlPanel.setFocusTraversalPolicyProvider( true ); + controlPanel.setFocusTraversalPolicy( new NotFocusableTraversalPolicy() ); + placeholderPanel.setFocusTraversalPolicyProvider( true ); + placeholderPanel.setFocusTraversalPolicy( new NotFocusableTraversalPolicy() ); } @Override @@ -196,7 +204,7 @@ public class FlatTextComponentsTest JLabel formattedTextFieldLabel = new JLabel(); JFormattedTextField formattedTextField1 = new JFormattedTextField(); JFormattedTextField formattedTextField3 = new JFormattedTextField(); - JPanel panel1 = new JPanel(); + controlPanel = new JPanel(); editableCheckBox = new JCheckBox(); JButton button1 = new JButton(); JLabel leftPaddingLabel = new JLabel(); @@ -215,7 +223,7 @@ public class FlatTextComponentsTest trailingComponentVisibleCheckBox = new JCheckBox(); showClearButtonCheckBox = new JCheckBox(); showRevealButtonCheckBox = new JCheckBox(); - JPanel panel2 = new JPanel(); + placeholderPanel = new JPanel(); JLabel label7 = new JLabel(); FlatTextField flatTextField1 = new FlatTextField(); JLabel label8 = new JLabel(); @@ -351,11 +359,11 @@ public class FlatTextComponentsTest formattedTextField3.putClientProperty(FlatClientProperties.PLACEHOLDER_TEXT, "place"); add(formattedTextField3, "cell 2 1,growx"); - //======== panel1 ======== + //======== controlPanel ======== { - panel1.setBorder(new TitledBorder("Control")); - panel1.putClientProperty("FlatLaf.internal.testing.ignore", true); - panel1.setLayout(new MigLayout( + controlPanel.setBorder(new TitledBorder("Control")); + controlPanel.putClientProperty("FlatLaf.internal.testing.ignore", true); + controlPanel.setLayout(new MigLayout( "hidemode 3", // columns "[fill]" + @@ -379,94 +387,104 @@ public class FlatTextComponentsTest //---- editableCheckBox ---- editableCheckBox.setText("editable"); editableCheckBox.setSelected(true); + editableCheckBox.setFocusable(false); editableCheckBox.addActionListener(e -> editableChanged()); - panel1.add(editableCheckBox, "cell 0 0 2 1,alignx left,growx 0"); + controlPanel.add(editableCheckBox, "cell 0 0 2 1,alignx left,growx 0"); //---- button1 ---- button1.setText("change text"); + button1.setFocusable(false); button1.addActionListener(e -> changeText()); - panel1.add(button1, "cell 0 1 2 1,alignx left,growx 0"); + controlPanel.add(button1, "cell 0 1 2 1,alignx left,growx 0"); //---- leftPaddingLabel ---- leftPaddingLabel.setText("Left padding:"); - panel1.add(leftPaddingLabel, "cell 0 2"); + controlPanel.add(leftPaddingLabel, "cell 0 2"); //---- leftPaddingField ---- leftPaddingField.addChangeListener(e -> paddingChanged()); - panel1.add(leftPaddingField, "cell 1 2"); + controlPanel.add(leftPaddingField, "cell 1 2"); //---- rightPaddingLabel ---- rightPaddingLabel.setText("Right padding:"); - panel1.add(rightPaddingLabel, "cell 0 3"); + controlPanel.add(rightPaddingLabel, "cell 0 3"); //---- rightPaddingField ---- rightPaddingField.addChangeListener(e -> paddingChanged()); - panel1.add(rightPaddingField, "cell 1 3"); + controlPanel.add(rightPaddingField, "cell 1 3"); //---- topPaddingLabel ---- topPaddingLabel.setText("Top padding:"); - panel1.add(topPaddingLabel, "cell 0 4"); + controlPanel.add(topPaddingLabel, "cell 0 4"); //---- topPaddingField ---- topPaddingField.addChangeListener(e -> paddingChanged()); - panel1.add(topPaddingField, "cell 1 4"); + controlPanel.add(topPaddingField, "cell 1 4"); //---- bottomPaddingLabel ---- bottomPaddingLabel.setText("Bottom padding:"); - panel1.add(bottomPaddingLabel, "cell 0 5"); + controlPanel.add(bottomPaddingLabel, "cell 0 5"); //---- bottomPaddingField ---- bottomPaddingField.addChangeListener(e -> paddingChanged()); - panel1.add(bottomPaddingField, "cell 1 5"); + controlPanel.add(bottomPaddingField, "cell 1 5"); //---- leadingIconCheckBox ---- leadingIconCheckBox.setText("leading icon"); + leadingIconCheckBox.setFocusable(false); leadingIconCheckBox.addActionListener(e -> leadingIcon()); - panel1.add(leadingIconCheckBox, "cell 0 6 2 1,alignx left,growx 0"); + controlPanel.add(leadingIconCheckBox, "cell 0 6 2 1,alignx left,growx 0"); //---- trailingIconCheckBox ---- trailingIconCheckBox.setText("trailing icon"); + trailingIconCheckBox.setFocusable(false); trailingIconCheckBox.addActionListener(e -> trailingIcon()); - panel1.add(trailingIconCheckBox, "cell 0 7 2 1,alignx left,growx 0"); + controlPanel.add(trailingIconCheckBox, "cell 0 7 2 1,alignx left,growx 0"); //---- leadingComponentCheckBox ---- leadingComponentCheckBox.setText("leading component"); + leadingComponentCheckBox.setFocusable(false); leadingComponentCheckBox.addActionListener(e -> leadingComponent()); - panel1.add(leadingComponentCheckBox, "cell 0 8 2 1,alignx left,growx 0"); + controlPanel.add(leadingComponentCheckBox, "cell 0 8 2 1,alignx left,growx 0"); //---- trailingComponentCheckBox ---- trailingComponentCheckBox.setText("trailing component"); + trailingComponentCheckBox.setFocusable(false); trailingComponentCheckBox.addActionListener(e -> trailingComponent()); - panel1.add(trailingComponentCheckBox, "cell 0 9 2 1,alignx left,growx 0"); + controlPanel.add(trailingComponentCheckBox, "cell 0 9 2 1,alignx left,growx 0"); //---- leadingComponentVisibleCheckBox ---- leadingComponentVisibleCheckBox.setText("leading component visible"); leadingComponentVisibleCheckBox.setSelected(true); + leadingComponentVisibleCheckBox.setFocusable(false); leadingComponentVisibleCheckBox.addActionListener(e -> leadingComponentVisible()); - panel1.add(leadingComponentVisibleCheckBox, "cell 0 10 2 1,alignx left,growx 0"); + controlPanel.add(leadingComponentVisibleCheckBox, "cell 0 10 2 1,alignx left,growx 0"); //---- trailingComponentVisibleCheckBox ---- trailingComponentVisibleCheckBox.setText("trailing component visible"); trailingComponentVisibleCheckBox.setSelected(true); + trailingComponentVisibleCheckBox.setFocusable(false); trailingComponentVisibleCheckBox.addActionListener(e -> trailingComponentVisible()); - panel1.add(trailingComponentVisibleCheckBox, "cell 0 11 2 1,alignx left,growx 0"); + controlPanel.add(trailingComponentVisibleCheckBox, "cell 0 11 2 1,alignx left,growx 0"); //---- showClearButtonCheckBox ---- showClearButtonCheckBox.setText("clear button"); + showClearButtonCheckBox.setFocusable(false); showClearButtonCheckBox.addActionListener(e -> showClearButton()); - panel1.add(showClearButtonCheckBox, "cell 0 12 2 1,alignx left,growx 0"); + controlPanel.add(showClearButtonCheckBox, "cell 0 12 2 1,alignx left,growx 0"); //---- showRevealButtonCheckBox ---- showRevealButtonCheckBox.setText("password reveal button"); + showRevealButtonCheckBox.setFocusable(false); showRevealButtonCheckBox.addActionListener(e -> showRevealButton()); - panel1.add(showRevealButtonCheckBox, "cell 0 13 2 1,alignx left,growx 0"); + controlPanel.add(showRevealButtonCheckBox, "cell 0 13 2 1,alignx left,growx 0"); } - add(panel1, "cell 4 0 1 10,aligny top,growy 0"); + add(controlPanel, "cell 4 0 1 10,aligny top,growy 0"); - //======== panel2 ======== + //======== placeholderPanel ======== { - panel2.setBorder(new TitledBorder("Placeholder")); - panel2.setLayout(new MigLayout( + placeholderPanel.setBorder(new TitledBorder("Placeholder")); + placeholderPanel.setLayout(new MigLayout( "hidemode 3", // columns "[fill]" + @@ -480,55 +498,55 @@ public class FlatTextComponentsTest //---- label7 ---- label7.setText("leading"); - panel2.add(label7, "cell 0 0"); + placeholderPanel.add(label7, "cell 0 0"); //---- flatTextField1 ---- flatTextField1.setHorizontalAlignment(SwingConstants.LEADING); flatTextField1.setPlaceholderText("text"); flatTextField1.setColumns(10); - panel2.add(flatTextField1, "cell 1 0"); + placeholderPanel.add(flatTextField1, "cell 1 0"); //---- label8 ---- label8.setText("left"); - panel2.add(label8, "cell 0 1"); + placeholderPanel.add(label8, "cell 0 1"); //---- flatTextField2 ---- flatTextField2.setHorizontalAlignment(SwingConstants.LEFT); flatTextField2.setPlaceholderText("text"); flatTextField2.setColumns(10); - panel2.add(flatTextField2, "cell 1 1"); + placeholderPanel.add(flatTextField2, "cell 1 1"); //---- label9 ---- label9.setText("center"); - panel2.add(label9, "cell 0 2"); + placeholderPanel.add(label9, "cell 0 2"); //---- flatTextField3 ---- flatTextField3.setHorizontalAlignment(SwingConstants.CENTER); flatTextField3.setPlaceholderText("text"); flatTextField3.setColumns(10); - panel2.add(flatTextField3, "cell 1 2"); + placeholderPanel.add(flatTextField3, "cell 1 2"); //---- label10 ---- label10.setText("right"); - panel2.add(label10, "cell 0 3"); + placeholderPanel.add(label10, "cell 0 3"); //---- flatTextField4 ---- flatTextField4.setHorizontalAlignment(SwingConstants.RIGHT); flatTextField4.setPlaceholderText("text"); flatTextField4.setColumns(10); - panel2.add(flatTextField4, "cell 1 3"); + placeholderPanel.add(flatTextField4, "cell 1 3"); //---- label11 ---- label11.setText("trailing"); - panel2.add(label11, "cell 0 4"); + placeholderPanel.add(label11, "cell 0 4"); //---- flatTextField5 ---- flatTextField5.setHorizontalAlignment(SwingConstants.TRAILING); flatTextField5.setPlaceholderText("text"); flatTextField5.setColumns(10); - panel2.add(flatTextField5, "cell 1 4"); + placeholderPanel.add(flatTextField5, "cell 1 4"); } - add(panel2, "cell 5 0 1 9,aligny top,growy 0"); + add(placeholderPanel, "cell 5 0 1 10,aligny top,growy 0"); //---- passwordFieldLabel ---- passwordFieldLabel.setText("JPasswordField:"); @@ -783,6 +801,7 @@ public class FlatTextComponentsTest // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables private JTextField textField1; + private JPanel controlPanel; private JCheckBox editableCheckBox; private JSpinner leftPaddingField; private JSpinner rightPaddingField; @@ -796,6 +815,7 @@ public class FlatTextComponentsTest private JCheckBox trailingComponentVisibleCheckBox; private JCheckBox showClearButtonCheckBox; private JCheckBox showRevealButtonCheckBox; + private JPanel placeholderPanel; private JComboBox comboBox5; private JSpinner spinner4; private JComboBox comboBox6; @@ -807,6 +827,18 @@ public class FlatTextComponentsTest private JEditorPane editorPane; // JFormDesigner - End of variables declaration //GEN-END:variables + //---- NotFocusableTraversalPolicy ---------------------------------------- + + private static class NotFocusableTraversalPolicy + extends FocusTraversalPolicy + { + @Override public Component getComponentAfter( Container aContainer, Component aComponent ) { return null; } + @Override public Component getComponentBefore( Container aContainer, Component aComponent ) { return null; } + @Override public Component getFirstComponent( Container aContainer ) { return null; } + @Override public Component getLastComponent( Container aContainer ) { return null; } + @Override public Component getDefaultComponent( Container aContainer ) { return null; } + } + //---- TestIcon ----------------------------------------------------------- private static class TestIcon diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.jfd index 73b5c705..8484ae6f 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.jfd +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextComponentsTest.jfd @@ -1,4 +1,4 @@ -JFDML JFormDesigner: "8.1.0.0.283" Java: "19.0.2" encoding: "UTF-8" +JFDML JFormDesigner: "8.3" encoding: "UTF-8" new FormModel { contentType: "form/swing" @@ -78,13 +78,17 @@ new FormModel { "$columnConstraints": "[fill][fill]" "$rowConstraints": "[][][][][][][]0[][]0[][]0[][][]" } ) { - name: "panel1" + name: "controlPanel" "border": new javax.swing.border.TitledBorder( "Control" ) "$client.FlatLaf.internal.testing.ignore": true + auxiliary() { + "JavaCodeGenerator.variableLocal": false + } add( new FormComponent( "javax.swing.JCheckBox" ) { name: "editableCheckBox" "text": "editable" "selected": true + "focusable": false auxiliary() { "JavaCodeGenerator.variableLocal": false } @@ -95,6 +99,7 @@ new FormModel { add( new FormComponent( "javax.swing.JButton" ) { name: "button1" "text": "change text" + "focusable": false addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "changeText", false ) ) }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 0 1 2 1,alignx left,growx 0" @@ -162,6 +167,7 @@ new FormModel { add( new FormComponent( "javax.swing.JCheckBox" ) { name: "leadingIconCheckBox" "text": "leading icon" + "focusable": false auxiliary() { "JavaCodeGenerator.variableLocal": false } @@ -172,6 +178,7 @@ new FormModel { add( new FormComponent( "javax.swing.JCheckBox" ) { name: "trailingIconCheckBox" "text": "trailing icon" + "focusable": false auxiliary() { "JavaCodeGenerator.variableLocal": false } @@ -182,6 +189,7 @@ new FormModel { add( new FormComponent( "javax.swing.JCheckBox" ) { name: "leadingComponentCheckBox" "text": "leading component" + "focusable": false auxiliary() { "JavaCodeGenerator.variableLocal": false } @@ -192,6 +200,7 @@ new FormModel { add( new FormComponent( "javax.swing.JCheckBox" ) { name: "trailingComponentCheckBox" "text": "trailing component" + "focusable": false auxiliary() { "JavaCodeGenerator.variableLocal": false } @@ -203,6 +212,7 @@ new FormModel { name: "leadingComponentVisibleCheckBox" "text": "leading component visible" "selected": true + "focusable": false auxiliary() { "JavaCodeGenerator.variableLocal": false } @@ -214,6 +224,7 @@ new FormModel { name: "trailingComponentVisibleCheckBox" "text": "trailing component visible" "selected": true + "focusable": false auxiliary() { "JavaCodeGenerator.variableLocal": false } @@ -224,6 +235,7 @@ new FormModel { add( new FormComponent( "javax.swing.JCheckBox" ) { name: "showClearButtonCheckBox" "text": "clear button" + "focusable": false auxiliary() { "JavaCodeGenerator.variableLocal": false } @@ -234,6 +246,7 @@ new FormModel { add( new FormComponent( "javax.swing.JCheckBox" ) { name: "showRevealButtonCheckBox" "text": "password reveal button" + "focusable": false auxiliary() { "JavaCodeGenerator.variableLocal": false } @@ -249,8 +262,11 @@ new FormModel { "$columnConstraints": "[fill][fill]" "$rowConstraints": "[][][][][]" } ) { - name: "panel2" + name: "placeholderPanel" "border": new javax.swing.border.TitledBorder( "Placeholder" ) + auxiliary() { + "JavaCodeGenerator.variableLocal": false + } add( new FormComponent( "javax.swing.JLabel" ) { name: "label7" "text": "leading" @@ -325,7 +341,7 @@ new FormModel { "value": "cell 1 4" } ) }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { - "value": "cell 5 0 1 9,aligny top,growy 0" + "value": "cell 5 0 1 10,aligny top,growy 0" } ) add( new FormComponent( "javax.swing.JLabel" ) { name: "passwordFieldLabel" diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextSelectAllOnFocusTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextSelectAllOnFocusTest.java new file mode 100644 index 00000000..9a27b069 --- /dev/null +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextSelectAllOnFocusTest.java @@ -0,0 +1,423 @@ +/* + * Copyright 2025 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.testing; + +import static com.formdev.flatlaf.FlatClientProperties.*; +import java.awt.EventQueue; +import java.text.ParseException; +import javax.swing.*; +import javax.swing.text.DefaultFormatterFactory; +import javax.swing.text.MaskFormatter; +import net.miginfocom.swing.*; + +/** + * @author Karl Tauber + */ +public class FlatTextSelectAllOnFocusTest + extends FlatSingleComponentTest +{ + public static void main( String[] args ) { + EventQueue.invokeLater( () -> { + launch( FlatTextSelectAllOnFocusTest::new, args ); + } ); + } + + @Override + protected JComponent createSingleComponent() { + initComponents(); + + try { + MaskFormatter formatter = new MaskFormatter( "###-####-###" ); + formatter.setPlaceholderCharacter( '_' ); + DefaultFormatterFactory factory = new DefaultFormatterFactory( formatter ); + + formattedTextField1.setFormatterFactory( factory ); + formattedTextField2.setFormatterFactory( factory ); + formattedTextField3.setFormatterFactory( factory ); + formattedTextField4.setFormatterFactory( factory ); + formattedTextField5.setFormatterFactory( factory ); + formattedTextField6.setFormatterFactory( factory ); + + formattedTextField1.setValue( "123-4567-890" ); + formattedTextField2.setValue( "123-4567-890" ); + formattedTextField3.setValue( "123-4567-890" ); + formattedTextField4.setValue( "123-4567-890" ); + formattedTextField5.setValue( "123-4567-890" ); + formattedTextField6.setValue( "123-4567-890" ); + } catch( ParseException ex ) { + ex.printStackTrace(); + } + + textField2.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_NEVER ); + textField3.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); + textField4.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); + textField5.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); + textField5.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); + textField6.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); + textField6.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); + textField7.select( 5, 7 ); + + formattedTextField2.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_NEVER ); + formattedTextField3.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); + formattedTextField4.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); + formattedTextField5.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); + formattedTextField5.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); + formattedTextField6.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); + formattedTextField6.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); + + comboBox2.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_NEVER ); + comboBox3.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); + comboBox4.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); + comboBox5.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); + comboBox5.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); + comboBox6.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); + comboBox6.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); + ((JTextField)comboBox7.getEditor().getEditorComponent()).select( 5, 7 ); + + spinner2.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_NEVER ); + spinner3.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); + spinner4.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); + spinner5.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); + spinner5.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); + spinner6.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); + spinner6.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); + +// textArea1.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); +// textPane1.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); +// editorPane1.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ALWAYS ); +// +// textArea1.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); +// textPane1.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); +// editorPane1.putClientProperty( SELECT_ALL_ON_FOCUS_POLICY, SELECT_ALL_ON_FOCUS_POLICY_ONCE ); +// +// textArea1.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); +// textPane1.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); +// editorPane1.putClientProperty( SELECT_ALL_ON_MOUSE_CLICK, true ); +// +// textArea1.select( 5, 7 ); +// textPane1.select( 5, 7 ); +// editorPane1.select( 5, 7 ); + + return panel; + } + + private void initComponents() { + // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents + panel = new FlatTestPanel(); + label1 = new JLabel(); + label2 = new JLabel(); + label3 = new JLabel(); + label4 = new JLabel(); + label5 = new JLabel(); + label6 = new JLabel(); + label7 = new JLabel(); + textFieldLabel = new JLabel(); + textField1 = new JTextField(); + textField2 = new JTextField(); + textField3 = new JTextField(); + textField4 = new JTextField(); + textField5 = new JTextField(); + textField6 = new JTextField(); + textField7 = new JTextField(); + formattedTextFieldLabel = new JLabel(); + formattedTextField1 = new JFormattedTextField(); + formattedTextField2 = new JFormattedTextField(); + formattedTextField3 = new JFormattedTextField(); + formattedTextField4 = new JFormattedTextField(); + formattedTextField5 = new JFormattedTextField(); + formattedTextField6 = new JFormattedTextField(); + comboBoxLabel = new JLabel(); + comboBox1 = new JComboBox<>(); + comboBox2 = new JComboBox<>(); + comboBox3 = new JComboBox<>(); + comboBox4 = new JComboBox<>(); + comboBox5 = new JComboBox<>(); + comboBox6 = new JComboBox<>(); + comboBox7 = new JComboBox<>(); + spinnerLabel = new JLabel(); + spinner1 = new JSpinner(); + spinner2 = new JSpinner(); + spinner3 = new JSpinner(); + spinner4 = new JSpinner(); + spinner5 = new JSpinner(); + spinner6 = new JSpinner(); + scrollPane1 = new JScrollPane(); + textArea1 = new JTextArea(); + scrollPane2 = new JScrollPane(); + textPane1 = new JTextPane(); + scrollPane3 = new JScrollPane(); + editorPane1 = new JEditorPane(); + + //======== panel ======== + { + panel.setLayout(new MigLayout( + "ltr,insets dialog,hidemode 3", + // columns + "[]" + + "[100,sizegroup 1,fill]" + + "[sizegroup 1,fill]" + + "[sizegroup 1,fill]" + + "[sizegroup 1,fill]" + + "[sizegroup 1,fill]" + + "[fill]" + + "[fill]", + // rows + "[]" + + "[]" + + "[]" + + "[]" + + "[]" + + "[fill]" + + "[30]")); + + //---- label1 ---- + label1.setText("default"); + panel.add(label1, "cell 1 0"); + + //---- label2 ---- + label2.setText("never"); + panel.add(label2, "cell 2 0"); + + //---- label3 ---- + label3.setText("once"); + panel.add(label3, "cell 3 0"); + + //---- label4 ---- + label4.setText("always"); + panel.add(label4, "cell 4 0"); + + //---- label5 ---- + label5.setText("once on click"); + panel.add(label5, "cell 5 0"); + + //---- label6 ---- + label6.setText("always on click"); + panel.add(label6, "cell 6 0"); + + //---- label7 ---- + label7.setText("custom selection"); + panel.add(label7, "cell 7 0"); + + //---- textFieldLabel ---- + textFieldLabel.setText("JTextField:"); + textFieldLabel.setDisplayedMnemonic('T'); + textFieldLabel.setLabelFor(textField1); + panel.add(textFieldLabel, "cell 0 1"); + + //---- textField1 ---- + textField1.setText("1234567890"); + panel.add(textField1, "cell 1 1"); + + //---- textField2 ---- + textField2.setText("1234567890"); + panel.add(textField2, "cell 2 1"); + + //---- textField3 ---- + textField3.setText("1234567890"); + panel.add(textField3, "cell 3 1"); + + //---- textField4 ---- + textField4.setText("1234567890"); + panel.add(textField4, "cell 4 1"); + + //---- textField5 ---- + textField5.setText("1234567890"); + panel.add(textField5, "cell 5 1"); + + //---- textField6 ---- + textField6.setText("1234567890"); + panel.add(textField6, "cell 6 1"); + + //---- textField7 ---- + textField7.setText("1234567890"); + panel.add(textField7, "cell 7 1"); + + //---- formattedTextFieldLabel ---- + formattedTextFieldLabel.setText("JFormattedTextField:"); + formattedTextFieldLabel.setDisplayedMnemonic('F'); + formattedTextFieldLabel.setLabelFor(formattedTextField1); + panel.add(formattedTextFieldLabel, "cell 0 2"); + panel.add(formattedTextField1, "cell 1 2"); + panel.add(formattedTextField2, "cell 2 2"); + panel.add(formattedTextField3, "cell 3 2"); + panel.add(formattedTextField4, "cell 4 2"); + panel.add(formattedTextField5, "cell 5 2"); + panel.add(formattedTextField6, "cell 6 2"); + + //---- comboBoxLabel ---- + comboBoxLabel.setText("JComboBox:"); + comboBoxLabel.setDisplayedMnemonic('C'); + comboBoxLabel.setLabelFor(comboBox1); + panel.add(comboBoxLabel, "cell 0 3"); + + //---- comboBox1 ---- + comboBox1.setEditable(true); + comboBox1.setModel(new DefaultComboBoxModel<>(new String[] { + "1234567890" + })); + panel.add(comboBox1, "cell 1 3"); + + //---- comboBox2 ---- + comboBox2.setEditable(true); + comboBox2.setModel(new DefaultComboBoxModel<>(new String[] { + "1234567890" + })); + panel.add(comboBox2, "cell 2 3"); + + //---- comboBox3 ---- + comboBox3.setEditable(true); + comboBox3.setModel(new DefaultComboBoxModel<>(new String[] { + "1234567890" + })); + panel.add(comboBox3, "cell 3 3"); + + //---- comboBox4 ---- + comboBox4.setEditable(true); + comboBox4.setModel(new DefaultComboBoxModel<>(new String[] { + "1234567890" + })); + panel.add(comboBox4, "cell 4 3"); + + //---- comboBox5 ---- + comboBox5.setEditable(true); + comboBox5.setModel(new DefaultComboBoxModel<>(new String[] { + "1234567890" + })); + panel.add(comboBox5, "cell 5 3"); + + //---- comboBox6 ---- + comboBox6.setEditable(true); + comboBox6.setModel(new DefaultComboBoxModel<>(new String[] { + "1234567890" + })); + panel.add(comboBox6, "cell 6 3"); + + //---- comboBox7 ---- + comboBox7.setEditable(true); + comboBox7.setModel(new DefaultComboBoxModel<>(new String[] { + "1234567890" + })); + panel.add(comboBox7, "cell 7 3"); + + //---- spinnerLabel ---- + spinnerLabel.setText("JSpinner:"); + spinnerLabel.setDisplayedMnemonic('S'); + spinnerLabel.setLabelFor(spinner1); + panel.add(spinnerLabel, "cell 0 4"); + + //---- spinner1 ---- + spinner1.setModel(new SpinnerNumberModel(1234, null, null, 100)); + panel.add(spinner1, "cell 1 4"); + + //---- spinner2 ---- + spinner2.setModel(new SpinnerNumberModel(1234, null, null, 100)); + panel.add(spinner2, "cell 2 4"); + + //---- spinner3 ---- + spinner3.setModel(new SpinnerNumberModel(1234, null, null, 100)); + panel.add(spinner3, "cell 3 4"); + + //---- spinner4 ---- + spinner4.setModel(new SpinnerNumberModel(1234, null, null, 100)); + panel.add(spinner4, "cell 4 4"); + + //---- spinner5 ---- + spinner5.setModel(new SpinnerNumberModel(1234, null, null, 100)); + panel.add(spinner5, "cell 5 4"); + + //---- spinner6 ---- + spinner6.setModel(new SpinnerNumberModel(1234, null, null, 100)); + panel.add(spinner6, "cell 6 4"); + + //======== scrollPane1 ======== + { + + //---- textArea1 ---- + textArea1.setRows(3); + textArea1.setText("1234567890\nabc"); + scrollPane1.setViewportView(textArea1); + } + panel.add(scrollPane1, "cell 1 5"); + + //======== scrollPane2 ======== + { + + //---- textPane1 ---- + textPane1.setText("1234567890\nabc"); + scrollPane2.setViewportView(textPane1); + } + panel.add(scrollPane2, "cell 2 5"); + + //======== scrollPane3 ======== + { + + //---- editorPane1 ---- + editorPane1.setText("1234567890\nabc"); + scrollPane3.setViewportView(editorPane1); + } + panel.add(scrollPane3, "cell 3 5 2 1"); + } + // JFormDesigner - End of component initialization //GEN-END:initComponents + } + + // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables + private FlatTestPanel panel; + private JLabel label1; + private JLabel label2; + private JLabel label3; + private JLabel label4; + private JLabel label5; + private JLabel label6; + private JLabel label7; + private JLabel textFieldLabel; + private JTextField textField1; + private JTextField textField2; + private JTextField textField3; + private JTextField textField4; + private JTextField textField5; + private JTextField textField6; + private JTextField textField7; + private JLabel formattedTextFieldLabel; + private JFormattedTextField formattedTextField1; + private JFormattedTextField formattedTextField2; + private JFormattedTextField formattedTextField3; + private JFormattedTextField formattedTextField4; + private JFormattedTextField formattedTextField5; + private JFormattedTextField formattedTextField6; + private JLabel comboBoxLabel; + private JComboBox comboBox1; + private JComboBox comboBox2; + private JComboBox comboBox3; + private JComboBox comboBox4; + private JComboBox comboBox5; + private JComboBox comboBox6; + private JComboBox comboBox7; + private JLabel spinnerLabel; + private JSpinner spinner1; + private JSpinner spinner2; + private JSpinner spinner3; + private JSpinner spinner4; + private JSpinner spinner5; + private JSpinner spinner6; + private JScrollPane scrollPane1; + private JTextArea textArea1; + private JScrollPane scrollPane2; + private JTextPane textPane1; + private JScrollPane scrollPane3; + private JEditorPane editorPane1; + // JFormDesigner - End of variables declaration //GEN-END:variables +} diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextSelectAllOnFocusTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextSelectAllOnFocusTest.jfd new file mode 100644 index 00000000..d2a327e6 --- /dev/null +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTextSelectAllOnFocusTest.jfd @@ -0,0 +1,327 @@ +JFDML JFormDesigner: "8.3" encoding: "UTF-8" + +new FormModel { + contentType: "form/swing" + root: new FormRoot { + add( new FormContainer( "com.formdev.flatlaf.testing.FlatTestPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { + "$layoutConstraints": "ltr,insets dialog,hidemode 3" + "$columnConstraints": "[][100,sizegroup 1,fill][sizegroup 1,fill][sizegroup 1,fill][sizegroup 1,fill][sizegroup 1,fill][fill][fill]" + "$rowConstraints": "[][][][][][fill][30]" + } ) { + name: "panel" + add( new FormComponent( "javax.swing.JLabel" ) { + name: "label1" + "text": "default" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 0" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "label2" + "text": "never" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 0" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "label3" + "text": "once" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 0" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "label4" + "text": "always" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 0" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "label5" + "text": "once on click" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 5 0" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "label6" + "text": "always on click" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 6 0" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "label7" + "text": "custom selection" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 7 0" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "textFieldLabel" + "text": "JTextField:" + "displayedMnemonic": 84 + "labelFor": new FormReference( "textField1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 1" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField1" + "text": "1234567890" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 1" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField2" + "text": "1234567890" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 1" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField3" + "text": "1234567890" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 1" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField4" + "text": "1234567890" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 1" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField5" + "text": "1234567890" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 5 1" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField6" + "text": "1234567890" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 6 1" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField7" + "text": "1234567890" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 7 1" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "formattedTextFieldLabel" + "text": "JFormattedTextField:" + "displayedMnemonic": 70 + "labelFor": new FormReference( "formattedTextField1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 2" + } ) + add( new FormComponent( "javax.swing.JFormattedTextField" ) { + name: "formattedTextField1" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 2" + } ) + add( new FormComponent( "javax.swing.JFormattedTextField" ) { + name: "formattedTextField2" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 2" + } ) + add( new FormComponent( "javax.swing.JFormattedTextField" ) { + name: "formattedTextField3" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 2" + } ) + add( new FormComponent( "javax.swing.JFormattedTextField" ) { + name: "formattedTextField4" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 2" + } ) + add( new FormComponent( "javax.swing.JFormattedTextField" ) { + name: "formattedTextField5" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 5 2" + } ) + add( new FormComponent( "javax.swing.JFormattedTextField" ) { + name: "formattedTextField6" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 6 2" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "comboBoxLabel" + "text": "JComboBox:" + "displayedMnemonic": 67 + "labelFor": new FormReference( "comboBox1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 3" + } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox1" + "editable": true + "model": new javax.swing.DefaultComboBoxModel { + selectedItem: "1234567890" + addElement( "1234567890" ) + } + auxiliary() { + "JavaCodeGenerator.typeParameters": "String" + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 3" + } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox2" + "editable": true + "model": new javax.swing.DefaultComboBoxModel { + selectedItem: "1234567890" + addElement( "1234567890" ) + } + auxiliary() { + "JavaCodeGenerator.typeParameters": "String" + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 3" + } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox3" + "editable": true + "model": new javax.swing.DefaultComboBoxModel { + selectedItem: "1234567890" + addElement( "1234567890" ) + } + auxiliary() { + "JavaCodeGenerator.typeParameters": "String" + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 3" + } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox4" + "editable": true + "model": new javax.swing.DefaultComboBoxModel { + selectedItem: "1234567890" + addElement( "1234567890" ) + } + auxiliary() { + "JavaCodeGenerator.typeParameters": "String" + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 3" + } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox5" + "editable": true + "model": &DefaultComboBoxModel0 new javax.swing.DefaultComboBoxModel { + selectedItem: "1234567890" + addElement( "1234567890" ) + } + auxiliary() { + "JavaCodeGenerator.typeParameters": "String" + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 5 3" + } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox6" + "editable": true + "model": #DefaultComboBoxModel0 + auxiliary() { + "JavaCodeGenerator.typeParameters": "String" + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 6 3" + } ) + add( new FormComponent( "javax.swing.JComboBox" ) { + name: "comboBox7" + "editable": true + "model": #DefaultComboBoxModel0 + auxiliary() { + "JavaCodeGenerator.typeParameters": "String" + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 7 3" + } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "spinnerLabel" + "text": "JSpinner:" + "displayedMnemonic": 83 + "labelFor": new FormReference( "spinner1" ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 4" + } ) + add( new FormComponent( "javax.swing.JSpinner" ) { + name: "spinner1" + "model": new javax.swing.SpinnerNumberModel { + stepSize: 100 + value: 1234 + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 4" + } ) + add( new FormComponent( "javax.swing.JSpinner" ) { + name: "spinner2" + "model": new javax.swing.SpinnerNumberModel { + stepSize: 100 + value: 1234 + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 4" + } ) + add( new FormComponent( "javax.swing.JSpinner" ) { + name: "spinner3" + "model": new javax.swing.SpinnerNumberModel { + stepSize: 100 + value: 1234 + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 4" + } ) + add( new FormComponent( "javax.swing.JSpinner" ) { + name: "spinner4" + "model": new javax.swing.SpinnerNumberModel { + stepSize: 100 + value: 1234 + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 4" + } ) + add( new FormComponent( "javax.swing.JSpinner" ) { + name: "spinner5" + "model": &SpinnerNumberModel0 new javax.swing.SpinnerNumberModel { + stepSize: 100 + value: 1234 + } + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 5 4" + } ) + add( new FormComponent( "javax.swing.JSpinner" ) { + name: "spinner6" + "model": #SpinnerNumberModel0 + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 6 4" + } ) + add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { + name: "scrollPane1" + add( new FormComponent( "javax.swing.JTextArea" ) { + name: "textArea1" + "rows": 3 + "text": "1234567890\nabc" + } ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 5" + } ) + add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { + name: "scrollPane2" + add( new FormComponent( "javax.swing.JTextPane" ) { + name: "textPane1" + "text": "1234567890\nabc" + } ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 5" + } ) + add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) { + name: "scrollPane3" + add( new FormComponent( "javax.swing.JEditorPane" ) { + name: "editorPane1" + "text": "1234567890\nabc" + } ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 5 2 1" + } ) + }, new FormLayoutConstraints( null ) { + "location": new java.awt.Point( 0, 0 ) + "size": new java.awt.Dimension( 995, 285 ) + } ) + } +}