diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java new file mode 100644 index 00000000..35c7d8b5 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java @@ -0,0 +1,90 @@ +/* + * Copyright 2019 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 + * + * http://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.ui; + +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import javax.swing.JComponent; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicPasswordFieldUI; +import javax.swing.text.JTextComponent; + +/** + * Provides the Flat LaF UI delegate for {@link javax.swing.JPasswordField}. + * + * @author Karl Tauber + */ +public class FlatPasswordFieldUI + extends BasicPasswordFieldUI +{ + private final Handler handler = new Handler(); + + public static ComponentUI createUI( JComponent c ) { + return new FlatPasswordFieldUI(); + } + + @Override + protected void installListeners() { + super.installListeners(); + + getComponent().addFocusListener( handler ); + } + + @Override + protected void uninstallListeners() { + super.uninstallListeners(); + + getComponent().removeFocusListener( handler ); + } + + @Override + protected void paintBackground( Graphics g ) { + JTextComponent c = getComponent(); + + FlatUIUtils.paintParentBackground( g, c ); + + Graphics2D g2 = (Graphics2D) g.create(); + try { + FlatUIUtils.setRenderingHints( g2 ); + + float focusWidth = FlatUIUtils.getFocusWidth(); + + g2.setColor( c.getBackground() ); + FlatUIUtils.fillRoundRectangle( g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, 0 ); + } finally { + g2.dispose(); + } + } + + //---- class Handler ------------------------------------------------------ + + private class Handler + implements FocusListener + { + @Override + public void focusGained( FocusEvent e ) { + getComponent().repaint(); + } + + @Override + public void focusLost( FocusEvent e ) { + getComponent().repaint(); + } + } +} diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties index 525e6404..03358f65 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -20,6 +20,7 @@ ButtonUI=com.formdev.flatlaf.ui.FlatButtonUI CheckBoxUI=com.formdev.flatlaf.ui.FlatCheckBoxUI FormattedTextFieldUI=com.formdev.flatlaf.ui.FlatFormattedTextFieldUI LabelUI=com.formdev.flatlaf.ui.FlatLabelUI +PasswordFieldUI=com.formdev.flatlaf.ui.FlatPasswordFieldUI RadioButtonUI=com.formdev.flatlaf.ui.FlatRadioButtonUI TextFieldUI=com.formdev.flatlaf.ui.FlatTextFieldUI @@ -49,6 +50,13 @@ FormattedTextField.background=@textComponentBackground FormattedTextField.margin=2,6,2,6 +#---- PasswordField ---- + +PasswordField.border=com.formdev.flatlaf.ui.FlatBorder +PasswordField.background=@textComponentBackground +PasswordField.margin=2,6,2,6 + + #---- RadioButton ---- RadioButton.border=com.formdev.flatlaf.ui.FlatMarginBorder diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java index 04584b29..3ffbd26d 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java @@ -76,6 +76,11 @@ public class FlatComponentsTest JFormattedTextField formattedTextField2 = new JFormattedTextField(); JFormattedTextField formattedTextField3 = new JFormattedTextField(); JFormattedTextField formattedTextField4 = new JFormattedTextField(); + JLabel passwordFieldLabel = new JLabel(); + JPasswordField passwordField1 = new JPasswordField(); + JPasswordField passwordField2 = new JPasswordField(); + JPasswordField passwordField3 = new JPasswordField(); + JPasswordField passwordField4 = new JPasswordField(); //======== this ======== setLayout(new MigLayout( @@ -237,6 +242,30 @@ public class FlatComponentsTest formattedTextField4.setEnabled(false); formattedTextField4.setEditable(false); add(formattedTextField4, "cell 4 5,growx"); + + //---- passwordFieldLabel ---- + passwordFieldLabel.setText("JPasswordField:"); + add(passwordFieldLabel, "cell 0 6"); + + //---- passwordField1 ---- + passwordField1.setText("editable"); + add(passwordField1, "cell 1 6,growx"); + + //---- passwordField2 ---- + passwordField2.setText("disabled"); + passwordField2.setEnabled(false); + add(passwordField2, "cell 2 6,growx"); + + //---- passwordField3 ---- + passwordField3.setText("not editable"); + passwordField3.setEditable(false); + add(passwordField3, "cell 3 6,growx"); + + //---- passwordField4 ---- + passwordField4.setText("not editable disabled"); + passwordField4.setEnabled(false); + passwordField4.setEditable(false); + add(passwordField4, "cell 4 6,growx"); // JFormDesigner - End of component initialization //GEN-END:initComponents } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd index edc3e584..b3ebd119 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd @@ -212,6 +212,40 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 4 5,growx" } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "passwordFieldLabel" + "text": "JPasswordField:" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 6" + } ) + add( new FormComponent( "javax.swing.JPasswordField" ) { + name: "passwordField1" + "text": "editable" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 6,growx" + } ) + add( new FormComponent( "javax.swing.JPasswordField" ) { + name: "passwordField2" + "text": "disabled" + "enabled": false + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 6,growx" + } ) + add( new FormComponent( "javax.swing.JPasswordField" ) { + name: "passwordField3" + "text": "not editable" + "editable": false + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 6,growx" + } ) + add( new FormComponent( "javax.swing.JPasswordField" ) { + name: "passwordField4" + "text": "not editable disabled" + "enabled": false + "editable": false + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 6,growx" + } ) }, new FormLayoutConstraints( null ) { "location": new java.awt.Point( 0, 0 ) "size": new java.awt.Dimension( 580, 300 )