Merge remote-tracking branch 'origin/main' into styling

# Conflicts:
#	flatlaf-core/build.gradle.kts
#	flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java
#	flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java
This commit is contained in:
Karl Tauber
2021-07-05 21:38:07 +02:00
34 changed files with 1089 additions and 355 deletions

View File

@@ -1,7 +1,36 @@
FlatLaf Change Log FlatLaf Change Log
================== ==================
## 1.3-SNAPSHOT ## 1.4-SNAPSHOT
#### New features and improvements
- TextField, FormattedTextField and PasswordField: Support adding extra padding.
(set client property `JTextField.padding` to `Insets`).
- PasswordField: UI delegate `FlatPasswordFieldUI` now extends `FlatTextFieldUI`
(instead of `BasicPasswordFieldUI`) to avoid duplicate code and for easier
extensibility.
#### Fixed bugs
- ComboBox (editable) and Spinner: Increased size of internal text field to the
component border so that it behaves like plain text field (mouse click to left
of text now positions caret to first character instead of opening ComboBox
popup; mouse cursor is now of type "text" within the whole component, except
for arrow buttons). (issue #330)
- ComboBox (not editable): Increased size of internal renderer pane to the
component border so that it can paint within the whole component. Also
increase combo box size if a custom renderer uses a border with insets that
are larger than the default combo box padding (`2,6,2,6`).
- Fixed component heights at `1.25x`, `1.75x` and `2.25x` scaling factors (Java
8 only) so that Button, ComboBox, Spinner and TextField components (including
subclasses) have same heights. This increases heights of Button and TextField
components by:
- `2px` at `1.75x` in **Light** and **Dark** themes
- `2px` at `1.25x` and `2.25x` in **IntelliJ** and **Darcula** themes
## 1.3
#### New features and improvements #### New features and improvements
@@ -10,13 +39,15 @@ FlatLaf Change Log
`PasswordField.focusedBackground`, `FormattedTextField.focusedBackground`, `PasswordField.focusedBackground`, `FormattedTextField.focusedBackground`,
`TextArea.focusedBackground`, `TextPane.focusedBackground`, `TextArea.focusedBackground`, `TextPane.focusedBackground`,
`EditorPane.focusedBackground`, `ComboBox.focusedBackground`, `EditorPane.focusedBackground`, `ComboBox.focusedBackground`,
`ComboBox.buttonFocusedBackground`, `ComboBox.popupFocusedBackground` and `ComboBox.buttonFocusedBackground`, `ComboBox.popupBackground` and
`Spinner.focusedBackground`). (issue #335) `Spinner.focusedBackground`). (issue #335)
#### Fixed bugs #### Fixed bugs
- Fixed white lines at bottom and right side of window (in dark themes on HiDPI - Fixed white lines at bottom and right side of window (in dark themes on HiDPI
screens with scaling enabled). screens with scaling enabled).
- ScrollBar: Fixed left/top arrow icon location (if visible). (issue #329)
- Spinner: Fixed up/down arrow icon location.
- ToolTip: Fixed positioning of huge tooltips. (issue #333) - ToolTip: Fixed positioning of huge tooltips. (issue #333)

View File

@@ -14,8 +14,8 @@
* limitations under the License. * limitations under the License.
*/ */
val releaseVersion = "1.2" val releaseVersion = "1.3"
val developmentVersion = "1.3-SNAPSHOT" val developmentVersion = "1.4-SNAPSHOT"
version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion

View File

@@ -23,6 +23,7 @@ plugins {
dependencies { dependencies {
testImplementation( "org.junit.jupiter:junit-jupiter-api:5.7.2" ) testImplementation( "org.junit.jupiter:junit-jupiter-api:5.7.2" )
testImplementation( "org.junit.jupiter:junit-jupiter-params" )
testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" ) testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" )
} }

View File

@@ -743,6 +743,18 @@ public interface FlatClientProperties
*/ */
String PLACEHOLDER_TEXT = "JTextField.placeholderText"; String PLACEHOLDER_TEXT = "JTextField.placeholderText";
/**
* Specifies the padding of the text.
* This changes the location and size of the text view within the component bounds,
* but does not affect the size of the component.
* <p>
* <strong>Component</strong> {@link javax.swing.JTextField} (and subclasses)<br>
* <strong>Value type</strong> {@link java.awt.Insets}
*
* @since 1.4
*/
String TEXT_FIELD_PADDING = "JTextField.padding";
//---- JToggleButton ------------------------------------------------------ //---- JToggleButton ------------------------------------------------------
/** /**

View File

@@ -128,7 +128,7 @@ class LinuxFontPolicy
// find last word in family // find last word in family
int index = family.lastIndexOf( ' ' ); int index = family.lastIndexOf( ' ' );
if( index < 0 ) if( index < 0 )
return createFont( "Dialog", style, size, dsize );; return createFont( "Dialog", style, size, dsize );
// check whether last work contains some font weight (e.g. Ultra-Bold or Heavy) // check whether last work contains some font weight (e.g. Ultra-Bold or Heavy)
String lastWord = family.substring( index + 1 ).toLowerCase(); String lastWord = family.substring( index + 1 ).toLowerCase();

View File

@@ -48,8 +48,8 @@ public class FlatArrowButton
protected Color pressedBackground; protected Color pressedBackground;
private int arrowWidth = DEFAULT_ARROW_WIDTH; private int arrowWidth = DEFAULT_ARROW_WIDTH;
private int xOffset = 0; private float xOffset = 0;
private int yOffset = 0; private float yOffset = 0;
private boolean hover; private boolean hover;
private boolean pressed; private boolean pressed;
@@ -126,19 +126,19 @@ public class FlatArrowButton
return pressed; return pressed;
} }
public int getXOffset() { public float getXOffset() {
return xOffset; return xOffset;
} }
public void setXOffset( int xOffset ) { public void setXOffset( float xOffset ) {
this.xOffset = xOffset; this.xOffset = xOffset;
} }
public int getYOffset() { public float getYOffset() {
return yOffset; return yOffset;
} }
public void setYOffset( int yOffset ) { public void setYOffset( float yOffset ) {
this.yOffset = yOffset; this.yOffset = yOffset;
} }

View File

@@ -184,13 +184,14 @@ public class FlatBorder
@Override @Override
public Insets getBorderInsets( Component c, Insets insets ) { public Insets getBorderInsets( Component c, Insets insets ) {
float focusWidth = scale( (float) getFocusWidth( c ) ); float focusWidth = scale( (float) getFocusWidth( c ) );
float ow = focusWidth + scale( (float) getLineWidth( c ) ); int ow = Math.round( focusWidth + scale( (float) getLineWidth( c ) ) );
insets = super.getBorderInsets( c, insets ); insets = super.getBorderInsets( c, insets );
insets.top = Math.round( scale( (float) insets.top ) + ow );
insets.left = Math.round( scale( (float) insets.left ) + ow ); insets.top = scale( insets.top ) + ow;
insets.bottom = Math.round( scale( (float) insets.bottom ) + ow ); insets.left = scale( insets.left ) + ow;
insets.right = Math.round( scale( (float) insets.right ) + ow ); insets.bottom = scale( insets.bottom ) + ow;
insets.right = scale( insets.right ) + ow;
if( isCellEditor( c ) ) { if( isCellEditor( c ) ) {
// remove top and bottom insets if used as cell editor // remove top and bottom insets if used as cell editor

View File

@@ -569,9 +569,9 @@ public class FlatButtonUI
prefSize.width = Math.max( prefSize.width, prefSize.height ); prefSize.width = Math.max( prefSize.width, prefSize.height );
} else if( !isIconOnlyOrSingleCharacter && !isToolBarButton( c ) && c.getBorder() instanceof FlatButtonBorder ) { } else if( !isIconOnlyOrSingleCharacter && !isToolBarButton( c ) && c.getBorder() instanceof FlatButtonBorder ) {
// apply minimum width/height // apply minimum width/height
float focusWidth = FlatUIUtils.getBorderFocusWidth( c ); int fw = Math.round( FlatUIUtils.getBorderFocusWidth( c ) * 2 );
prefSize.width = Math.max( prefSize.width, scale( FlatUIUtils.minimumWidth( c, minimumWidth ) ) + Math.round( focusWidth * 2 ) ); prefSize.width = Math.max( prefSize.width, scale( FlatUIUtils.minimumWidth( c, minimumWidth ) ) + fw );
prefSize.height = Math.max( prefSize.height, scale( FlatUIUtils.minimumHeight( c, 0 ) ) + Math.round( focusWidth * 2 ) ); prefSize.height = Math.max( prefSize.height, scale( FlatUIUtils.minimumHeight( c, 0 ) ) + fw );
} }
return prefSize; return prefSize;

View File

@@ -18,6 +18,8 @@ package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.FlatClientProperties.*; import static com.formdev.flatlaf.FlatClientProperties.*;
import java.awt.EventQueue; import java.awt.EventQueue;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import javax.swing.JFormattedTextField; import javax.swing.JFormattedTextField;
@@ -61,6 +63,19 @@ public class FlatCaret
} }
} }
@Override
protected void adjustVisibility( Rectangle nloc ) {
JTextComponent c = getComponent();
if( c != null && c.getUI() instanceof FlatTextFieldUI ) {
Insets padding = ((FlatTextFieldUI)c.getUI()).getPadding();
if( padding != null ) {
nloc.x -= padding.left;
nloc.y -= padding.top;
}
}
super.adjustVisibility( nloc );
}
@Override @Override
public void focusGained( FocusEvent e ) { public void focusGained( FocusEvent e ) {
if( !wasTemporaryLost && (!isMousePressed || selectAllOnMouseClick) ) if( !wasTemporaryLost && (!isMousePressed || selectAllOnMouseClick) )

View File

@@ -17,6 +17,7 @@
package com.formdev.flatlaf.ui; package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale; import static com.formdev.flatlaf.util.UIScale.scale;
import static com.formdev.flatlaf.util.UIScale.unscale;
import java.awt.Color; import java.awt.Color;
import java.awt.Component; import java.awt.Component;
import java.awt.ComponentOrientation; import java.awt.ComponentOrientation;
@@ -39,7 +40,6 @@ import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.lang.ref.WeakReference;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.AbstractAction; import javax.swing.AbstractAction;
@@ -71,7 +71,6 @@ import javax.swing.text.JTextComponent;
import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable;
import com.formdev.flatlaf.util.SystemInfo; import com.formdev.flatlaf.util.SystemInfo;
import com.formdev.flatlaf.util.UIScale;
/** /**
* Provides the Flat LaF UI delegate for {@link javax.swing.JComboBox}. * Provides the Flat LaF UI delegate for {@link javax.swing.JComboBox}.
@@ -106,7 +105,7 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault ComboBox.buttonDisabledArrowColor Color * @uiDefault ComboBox.buttonDisabledArrowColor Color
* @uiDefault ComboBox.buttonHoverArrowColor Color * @uiDefault ComboBox.buttonHoverArrowColor Color
* @uiDefault ComboBox.buttonPressedArrowColor Color * @uiDefault ComboBox.buttonPressedArrowColor Color
* @uiDefault ComboBox.popupFocusedBackground Color optional * @uiDefault ComboBox.popupBackground Color optional
* *
* @author Karl Tauber * @author Karl Tauber
*/ */
@@ -134,13 +133,14 @@ public class FlatComboBoxUI
@Styleable protected Color buttonHoverArrowColor; @Styleable protected Color buttonHoverArrowColor;
@Styleable protected Color buttonPressedArrowColor; @Styleable protected Color buttonPressedArrowColor;
@Styleable protected Color popupFocusedBackground; @Styleable protected Color popupBackground;
private MouseListener hoverListener; private MouseListener hoverListener;
protected boolean hover; protected boolean hover;
protected boolean pressed; protected boolean pressed;
private WeakReference<Component> lastRendererComponent; private CellPaddingBorder paddingBorder;
private Map<String, Object> oldStyleValues; private Map<String, Object> oldStyleValues;
private AtomicBoolean borderShared; private AtomicBoolean borderShared;
@@ -227,15 +227,14 @@ public class FlatComboBoxUI
buttonHoverArrowColor = UIManager.getColor( "ComboBox.buttonHoverArrowColor" ); buttonHoverArrowColor = UIManager.getColor( "ComboBox.buttonHoverArrowColor" );
buttonPressedArrowColor = UIManager.getColor( "ComboBox.buttonPressedArrowColor" ); buttonPressedArrowColor = UIManager.getColor( "ComboBox.buttonPressedArrowColor" );
popupFocusedBackground = UIManager.getColor( "ComboBox.popupFocusedBackground" ); popupBackground = UIManager.getColor( "ComboBox.popupBackground" );
// set maximumRowCount // set maximumRowCount
int maximumRowCount = UIManager.getInt( "ComboBox.maximumRowCount" ); int maximumRowCount = UIManager.getInt( "ComboBox.maximumRowCount" );
if( maximumRowCount > 0 && maximumRowCount != 8 && comboBox.getMaximumRowCount() == 8 ) if( maximumRowCount > 0 && maximumRowCount != 8 && comboBox.getMaximumRowCount() == 8 )
comboBox.setMaximumRowCount( maximumRowCount ); comboBox.setMaximumRowCount( maximumRowCount );
// scale paddingBorder = new CellPaddingBorder( padding );
padding = UIScale.scale( padding );
MigLayoutVisualPadding.install( comboBox ); MigLayoutVisualPadding.install( comboBox );
} }
@@ -260,7 +259,9 @@ public class FlatComboBoxUI
buttonHoverArrowColor = null; buttonHoverArrowColor = null;
buttonPressedArrowColor = null; buttonPressedArrowColor = null;
popupFocusedBackground = null; popupBackground = null;
paddingBorder.uninstall();
oldStyleValues = null; oldStyleValues = null;
borderShared = null; borderShared = null;
@@ -291,11 +292,6 @@ public class FlatComboBoxUI
editor.setBounds( rectangleForCurrentValue() ); editor.setBounds( rectangleForCurrentValue() );
} }
} }
if( editor != null && padding != null ) {
// fix editor bounds by subtracting padding
editor.setBounds( FlatUIUtils.subtractInsets( editor.getBounds(), padding ) );
}
} }
}; };
} }
@@ -381,9 +377,13 @@ public class FlatComboBoxUI
protected void configureEditor() { protected void configureEditor() {
super.configureEditor(); super.configureEditor();
// remove default text field border from editor if( editor instanceof JTextField ) {
if( editor instanceof JTextField && ((JTextField)editor).getBorder() instanceof FlatTextBorder ) JTextField textField = (JTextField) editor;
((JTextField)editor).setBorder( BorderFactory.createEmptyBorder() );
// remove default text field border from editor
if( textField.getBorder() instanceof FlatTextBorder )
textField.setBorder( BorderFactory.createEmptyBorder() );
}
// explicitly make non-opaque // explicitly make non-opaque
if( editor instanceof JComponent ) if( editor instanceof JComponent )
@@ -391,6 +391,7 @@ public class FlatComboBoxUI
editor.applyComponentOrientation( comboBox.getComponentOrientation() ); editor.applyComponentOrientation( comboBox.getComponentOrientation() );
updateEditorPadding();
updateEditorColors(); updateEditorColors();
// macOS // macOS
@@ -407,6 +408,25 @@ public class FlatComboBoxUI
} }
} }
private void updateEditorPadding() {
if( !(editor instanceof JTextField) )
return;
JTextField textField = (JTextField) editor;
Insets insets = textField.getInsets();
Insets pad = padding;
if( insets.top != 0 || insets.left != 0 || insets.bottom != 0 || insets.right != 0 ) {
// if text field has custom border, subtract text field insets from padding
pad = new Insets(
unscale( Math.max( scale( padding.top ) - insets.top, 0 ) ),
unscale( Math.max( scale( padding.left ) - insets.left, 0 ) ),
unscale( Math.max( scale( padding.bottom ) - insets.bottom, 0 ) ),
unscale( Math.max( scale( padding.right ) - insets.right, 0 ) )
);
}
textField.putClientProperty( FlatClientProperties.TEXT_FIELD_PADDING, pad );
}
private void updateEditorColors() { private void updateEditorColors() {
// use non-UIResource colors because when SwingUtilities.updateComponentTreeUI() // use non-UIResource colors because when SwingUtilities.updateComponentTreeUI()
// is used, then the editor is updated after the combobox and the // is used, then the editor is updated after the combobox and the
@@ -516,30 +536,24 @@ public class FlatComboBoxUI
@Override @Override
@SuppressWarnings( "unchecked" ) @SuppressWarnings( "unchecked" )
public void paintCurrentValue( Graphics g, Rectangle bounds, boolean hasFocus ) { public void paintCurrentValue( Graphics g, Rectangle bounds, boolean hasFocus ) {
paddingBorder.uninstall();
ListCellRenderer<Object> renderer = comboBox.getRenderer(); ListCellRenderer<Object> renderer = comboBox.getRenderer();
uninstallCellPaddingBorder( renderer );
if( renderer == null ) if( renderer == null )
renderer = new DefaultListCellRenderer(); renderer = new DefaultListCellRenderer();
Component c = renderer.getListCellRendererComponent( listBox, comboBox.getSelectedItem(), -1, false, false ); Component c = renderer.getListCellRendererComponent( listBox, comboBox.getSelectedItem(), -1, false, false );
c.setFont( comboBox.getFont() ); c.setFont( comboBox.getFont() );
c.applyComponentOrientation( comboBox.getComponentOrientation() ); c.applyComponentOrientation( comboBox.getComponentOrientation() );
uninstallCellPaddingBorder( c );
boolean enabled = comboBox.isEnabled(); boolean enabled = comboBox.isEnabled();
c.setBackground( getBackground( enabled ) ); c.setBackground( getBackground( enabled ) );
c.setForeground( getForeground( enabled ) ); c.setForeground( getForeground( enabled ) );
boolean shouldValidate = (c instanceof JPanel); boolean shouldValidate = (c instanceof JPanel);
if( padding != null )
bounds = FlatUIUtils.subtractInsets( bounds, padding );
// increase the size of the rendering area to make sure that the text
// is vertically aligned with other component types (e.g. JTextField)
Insets rendererInsets = getRendererComponentInsets( c );
if( rendererInsets != null )
bounds = FlatUIUtils.addInsets( bounds, rendererInsets );
paddingBorder.install( c );
currentValuePane.paintComponent( g, c, comboBox, bounds.x, bounds.y, bounds.width, bounds.height, shouldValidate ); currentValuePane.paintComponent( g, c, comboBox, bounds.x, bounds.y, bounds.width, bounds.height, shouldValidate );
paddingBorder.uninstall();
} }
@Override @Override
@@ -571,77 +585,50 @@ public class FlatComboBoxUI
@Override @Override
public Dimension getMinimumSize( JComponent c ) { public Dimension getMinimumSize( JComponent c ) {
Dimension minimumSize = super.getMinimumSize( c ); Dimension minimumSize = super.getMinimumSize( c );
minimumSize.width = Math.max( minimumSize.width, scale( FlatUIUtils.minimumWidth( c, minimumWidth ) ) ); int fw = Math.round( FlatUIUtils.getBorderFocusWidth( c ) * 2 );
minimumSize.width = Math.max( minimumSize.width, scale( FlatUIUtils.minimumWidth( c, minimumWidth ) ) + fw );
return minimumSize; return minimumSize;
} }
@Override @Override
protected Dimension getDefaultSize() { protected Dimension getDefaultSize() {
@SuppressWarnings( "unchecked" ) paddingBorder.uninstall();
ListCellRenderer<Object> renderer = comboBox.getRenderer();
uninstallCellPaddingBorder( renderer );
Dimension size = super.getDefaultSize(); Dimension size = super.getDefaultSize();
paddingBorder.uninstall();
uninstallCellPaddingBorder( renderer );
return size; return size;
} }
@Override @Override
protected Dimension getDisplaySize() { protected Dimension getDisplaySize() {
@SuppressWarnings( "unchecked" )
ListCellRenderer<Object> renderer = comboBox.getRenderer();
uninstallCellPaddingBorder( renderer );
paddingBorder.uninstall();
Dimension displaySize = super.getDisplaySize(); Dimension displaySize = super.getDisplaySize();
paddingBorder.uninstall();
// remove padding added in super.getDisplaySize()
int displayWidth = displaySize.width - padding.left - padding.right;
int displayHeight = displaySize.height - padding.top - padding.bottom;
// recalculate width without hardcoded 100 under special conditions // recalculate width without hardcoded 100 under special conditions
if( displaySize.width == 100 + padding.left + padding.right && if( displayWidth == 100 &&
comboBox.isEditable() && comboBox.isEditable() &&
comboBox.getItemCount() == 0 && comboBox.getItemCount() == 0 &&
comboBox.getPrototypeDisplayValue() == null ) comboBox.getPrototypeDisplayValue() == null )
{ {
int width = getDefaultSize().width; displayWidth = Math.max( getDefaultSize().width, editor.getPreferredSize().width );
width = Math.max( width, editor.getPreferredSize().width );
width += padding.left + padding.right;
displaySize = new Dimension( width, displaySize.height );
} }
uninstallCellPaddingBorder( renderer ); return new Dimension( displayWidth, displayHeight );
return displaySize;
} }
@Override @Override
protected Dimension getSizeForComponent( Component comp ) { protected Dimension getSizeForComponent( Component comp ) {
paddingBorder.install( comp );
Dimension size = super.getSizeForComponent( comp ); Dimension size = super.getSizeForComponent( comp );
paddingBorder.uninstall();
// remove the renderer border top/bottom insets from the size to make sure that
// the combobox gets the same height as other component types (e.g. JTextField)
Insets rendererInsets = getRendererComponentInsets( comp );
if( rendererInsets != null )
size = new Dimension( size.width, size.height - rendererInsets.top - rendererInsets.bottom );
return size; return size;
} }
private Insets getRendererComponentInsets( Component rendererComponent ) {
if( rendererComponent instanceof JComponent ) {
Border rendererBorder = ((JComponent)rendererComponent).getBorder();
if( rendererBorder != null )
return rendererBorder.getBorderInsets( rendererComponent );
}
return null;
}
private void uninstallCellPaddingBorder( Object o ) {
CellPaddingBorder.uninstall( o );
if( lastRendererComponent != null ) {
CellPaddingBorder.uninstall( lastRendererComponent );
lastRendererComponent = null;
}
}
private boolean isCellRenderer() { private boolean isCellRenderer() {
return comboBox.getParent() instanceof CellRendererPane; return comboBox.getParent() instanceof CellRendererPane;
} }
@@ -652,6 +639,9 @@ public class FlatComboBoxUI
return parentParent != null && !comboBox.getBackground().equals( parentParent.getBackground() ); return parentParent != null && !comboBox.getBackground().equals( parentParent.getBackground() );
} }
/**
* @since 1.3
*/
public static boolean isPermanentFocusOwner( JComboBox<?> comboBox ) { public static boolean isPermanentFocusOwner( JComboBox<?> comboBox ) {
if( comboBox.isEditable() ) { if( comboBox.isEditable() ) {
Component editorComponent = comboBox.getEditor().getEditorComponent(); Component editorComponent = comboBox.getEditor().getEditorComponent();
@@ -707,13 +697,11 @@ public class FlatComboBoxUI
protected class FlatComboPopup protected class FlatComboPopup
extends BasicComboPopup extends BasicComboPopup
{ {
private CellPaddingBorder paddingBorder;
protected FlatComboPopup( JComboBox combo ) { protected FlatComboPopup( JComboBox combo ) {
super( combo ); super( combo );
// BasicComboPopup listens to JComboBox.componentOrientation and updates // BasicComboPopup listens to JComboBox.componentOrientation and updates
// the component orientation of the list, scroller and popup, but when // the component orientation of the list, scroll pane and popup, but when
// switching the LaF and a new combo popup is created, the component // switching the LaF and a new combo popup is created, the component
// orientation is not applied. // orientation is not applied.
ComponentOrientation o = comboBox.getComponentOrientation(); ComponentOrientation o = comboBox.getComponentOrientation();
@@ -781,8 +769,8 @@ public class FlatComboBoxUI
} }
void updateStyle() { void updateStyle() {
if( popupFocusedBackground != null ) if( popupBackground != null )
list.setBackground( popupFocusedBackground ); list.setBackground( popupBackground );
} }
@Override @Override
@@ -796,6 +784,19 @@ public class FlatComboBoxUI
}; };
} }
@Override
protected int getPopupHeightForRowCount( int maxRowCount ) {
int height = super.getPopupHeightForRowCount( maxRowCount );
paddingBorder.uninstall();
return height;
}
@Override
protected void paintChildren( Graphics g ) {
super.paintChildren( g );
paddingBorder.uninstall();
}
//---- class PopupListCellRenderer ----- //---- class PopupListCellRenderer -----
private class PopupListCellRenderer private class PopupListCellRenderer
@@ -805,22 +806,15 @@ public class FlatComboBoxUI
public Component getListCellRendererComponent( JList list, Object value, public Component getListCellRendererComponent( JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus ) int index, boolean isSelected, boolean cellHasFocus )
{ {
ListCellRenderer renderer = comboBox.getRenderer(); paddingBorder.uninstall();
CellPaddingBorder.uninstall( renderer );
CellPaddingBorder.uninstall( lastRendererComponent );
ListCellRenderer renderer = comboBox.getRenderer();
if( renderer == null ) if( renderer == null )
renderer = new DefaultListCellRenderer(); renderer = new DefaultListCellRenderer();
Component c = renderer.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus ); Component c = renderer.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
c.applyComponentOrientation( comboBox.getComponentOrientation() ); c.applyComponentOrientation( comboBox.getComponentOrientation() );
if( c instanceof JComponent ) { paddingBorder.install( c );
if( paddingBorder == null )
paddingBorder = new CellPaddingBorder( padding );
paddingBorder.install( (JComponent) c );
}
lastRendererComponent = (c != renderer) ? new WeakReference<>( c ) : null;
return c; return c;
} }
@@ -830,49 +824,63 @@ public class FlatComboBoxUI
//---- class CellPaddingBorder -------------------------------------------- //---- class CellPaddingBorder --------------------------------------------
/** /**
* Cell padding border used only in popup list. * Cell padding border used in popup list and for current value if not editable.
* * <p>
* The insets are the union of the cell padding and the renderer border insets, * The insets are the union of the cell padding and the renderer border insets,
* which vertically aligns text in popup list with text in combobox. * which vertically aligns text in popup list with text in combobox.
* * <p>
* The renderer border is painted on the outside of this border. * The renderer border is painted on the outer side of this border.
*/ */
private static class CellPaddingBorder private static class CellPaddingBorder
extends AbstractBorder extends AbstractBorder
{ {
private final Insets padding; private final Insets padding;
private JComponent rendererComponent;
private Border rendererBorder; private Border rendererBorder;
CellPaddingBorder( Insets padding ) { CellPaddingBorder( Insets padding ) {
this.padding = padding; this.padding = padding;
} }
void install( JComponent rendererComponent ) { void install( Component c ) {
Border oldBorder = rendererComponent.getBorder(); if( !(c instanceof JComponent) )
if( !(oldBorder instanceof CellPaddingBorder) ) {
rendererBorder = oldBorder;
rendererComponent.setBorder( this );
}
}
static void uninstall( Object o ) {
if( o instanceof WeakReference )
o = ((WeakReference<?>)o).get();
if( !(o instanceof JComponent) )
return; return;
JComponent rendererComponent = (JComponent) o; JComponent jc = (JComponent) c;
Border border = rendererComponent.getBorder(); Border oldBorder = jc.getBorder();
if( border instanceof CellPaddingBorder ) { if( oldBorder == this )
CellPaddingBorder paddingBorder = (CellPaddingBorder) border; return; // already installed
rendererComponent.setBorder( paddingBorder.rendererBorder );
paddingBorder.rendererBorder = null; // this border can be installed only at one component
} uninstall();
// remember component where this border was installed for uninstall
rendererComponent = jc;
// remember old border and replace it
rendererBorder = oldBorder;
rendererComponent.setBorder( this );
}
/**
* Uninstall border from previously installed component.
* Because this border is installed in PopupListCellRenderer.getListCellRendererComponent(),
* there is no single place to uninstall it.
* This is the reason why this method is called from various places.
*/
void uninstall() {
if( rendererComponent == null )
return;
if( rendererComponent.getBorder() == this )
rendererComponent.setBorder( rendererBorder );
rendererComponent = null;
rendererBorder = null;
} }
@Override @Override
public Insets getBorderInsets( Component c, Insets insets ) { public Insets getBorderInsets( Component c, Insets insets ) {
Insets padding = scale( this.padding );
if( rendererBorder != null ) { if( rendererBorder != null ) {
Insets insideInsets = rendererBorder.getBorderInsets( c ); Insets insideInsets = rendererBorder.getBorderInsets( c );
insets.top = Math.max( padding.top, insideInsets.top ); insets.top = Math.max( padding.top, insideInsets.top );

View File

@@ -39,8 +39,6 @@ import javax.swing.plaf.ComponentUI;
* *
* <!-- FlatTextFieldUI --> * <!-- FlatTextFieldUI -->
* *
* @uiDefault TextComponent.arc int
* @uiDefault Component.focusWidth int
* @uiDefault Component.minimumWidth int * @uiDefault Component.minimumWidth int
* @uiDefault Component.isIntelliJTheme boolean * @uiDefault Component.isIntelliJTheme boolean
* @uiDefault FormattedTextField.placeholderForeground Color * @uiDefault FormattedTextField.placeholderForeground Color

View File

@@ -16,34 +16,32 @@
package com.formdev.flatlaf.ui; package com.formdev.flatlaf.ui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Shape;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter; import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import java.awt.event.KeyListener;
import java.beans.PropertyChangeEvent; import javax.swing.Action;
import java.util.Map; import javax.swing.ActionMap;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.LookAndFeel; import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI; import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicPasswordFieldUI; import javax.swing.text.DefaultEditorKit;
import javax.swing.text.Caret; import javax.swing.text.Element;
import javax.swing.text.JTextComponent; import javax.swing.text.JTextComponent;
import javax.swing.text.PasswordView;
import javax.swing.text.View;
import com.formdev.flatlaf.icons.FlatCapsLockIcon; import com.formdev.flatlaf.icons.FlatCapsLockIcon;
import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable;
import com.formdev.flatlaf.util.HiDPIUtils;
/** /**
* Provides the Flat LaF UI delegate for {@link javax.swing.JPasswordField}. * Provides the Flat LaF UI delegate for {@link javax.swing.JPasswordField}.
* *
* <!-- BasicPasswordFieldUI --> * <!-- BasicTextFieldUI -->
* *
* @uiDefault PasswordField.font Font * @uiDefault PasswordField.font Font
* @uiDefault PasswordField.background Color * @uiDefault PasswordField.background Color
@@ -56,42 +54,32 @@ import com.formdev.flatlaf.util.HiDPIUtils;
* @uiDefault PasswordField.inactiveForeground Color used if not enabled (yes, this is confusing; this should be named disabledForeground) * @uiDefault PasswordField.inactiveForeground Color used if not enabled (yes, this is confusing; this should be named disabledForeground)
* @uiDefault PasswordField.border Border * @uiDefault PasswordField.border Border
* @uiDefault PasswordField.margin Insets * @uiDefault PasswordField.margin Insets
* @uiDefault PasswordField.echoChar character
* @uiDefault PasswordField.caretBlinkRate int default is 500 milliseconds * @uiDefault PasswordField.caretBlinkRate int default is 500 milliseconds
* *
* <!-- FlatPasswordFieldUI --> * <!-- FlatTextFieldUI -->
* *
* @uiDefault Component.minimumWidth int * @uiDefault Component.minimumWidth int
* @uiDefault Component.isIntelliJTheme boolean * @uiDefault Component.isIntelliJTheme boolean
* @uiDefault PasswordField.placeholderForeground Color * @uiDefault PasswordField.placeholderForeground Color
* @uiDefault PasswordField.focusedBackground Color optional * @uiDefault PasswordField.focusedBackground Color optional
* @uiDefault PasswordField.showCapsLock boolean
* @uiDefault PasswordField.capsLockIcon Icon
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always * @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
* @uiDefault TextComponent.selectAllOnMouseClick boolean * @uiDefault TextComponent.selectAllOnMouseClick boolean
* *
* <!-- FlatPasswordFieldUI -->
*
* @uiDefault PasswordField.echoChar character
* @uiDefault PasswordField.showCapsLock boolean
* @uiDefault PasswordField.capsLockIcon Icon
*
* @author Karl Tauber * @author Karl Tauber
*/ */
public class FlatPasswordFieldUI public class FlatPasswordFieldUI
extends BasicPasswordFieldUI extends FlatTextFieldUI
{ {
@Styleable protected int minimumWidth;
protected boolean isIntelliJTheme;
private Color background;
@Styleable protected Color disabledBackground;
@Styleable protected Color inactiveBackground;
@Styleable protected Color placeholderForeground;
@Styleable protected Color focusedBackground;
@Styleable protected boolean showCapsLock; @Styleable protected boolean showCapsLock;
protected Icon capsLockIcon; protected Icon capsLockIcon;
private Color oldDisabledBackground;
private Color oldInactiveBackground;
private FocusListener focusListener;
private KeyListener capsLockListener; private KeyListener capsLockListener;
private Map<String, Object> oldStyleValues;
private AtomicBoolean borderShared;
private boolean capsLockIconShared = true; private boolean capsLockIconShared = true;
public static ComponentUI createUI( JComponent c ) { public static ComponentUI createUI( JComponent c ) {
@@ -99,10 +87,8 @@ public class FlatPasswordFieldUI
} }
@Override @Override
public void installUI( JComponent c ) { protected String getPropertyPrefix() {
super.installUI( c ); return "PasswordField";
applyStyle( FlatStyleSupport.getStyle( c ) );
} }
@Override @Override
@@ -110,48 +96,25 @@ public class FlatPasswordFieldUI
super.installDefaults(); super.installDefaults();
String prefix = getPropertyPrefix(); String prefix = getPropertyPrefix();
minimumWidth = UIManager.getInt( "Component.minimumWidth" ); Character echoChar = (Character) UIManager.get( prefix + ".echoChar" );
isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" ); if( echoChar != null )
background = UIManager.getColor( prefix + ".background" ); LookAndFeel.installProperty( getComponent(), "echoChar", echoChar );
disabledBackground = UIManager.getColor( prefix + ".disabledBackground" );
inactiveBackground = UIManager.getColor( prefix + ".inactiveBackground" );
placeholderForeground = UIManager.getColor( prefix + ".placeholderForeground" );
focusedBackground = UIManager.getColor( prefix + ".focusedBackground" );
showCapsLock = UIManager.getBoolean( "PasswordField.showCapsLock" ); showCapsLock = UIManager.getBoolean( "PasswordField.showCapsLock" );
capsLockIcon = UIManager.getIcon( "PasswordField.capsLockIcon" ); capsLockIcon = UIManager.getIcon( "PasswordField.capsLockIcon" );
LookAndFeel.installProperty( getComponent(), "opaque", false );
MigLayoutVisualPadding.install( getComponent() );
} }
@Override @Override
protected void uninstallDefaults() { protected void uninstallDefaults() {
super.uninstallDefaults(); super.uninstallDefaults();
background = null;
disabledBackground = null;
inactiveBackground = null;
placeholderForeground = null;
focusedBackground = null;
capsLockIcon = null; capsLockIcon = null;
oldDisabledBackground = null;
oldInactiveBackground = null;
oldStyleValues = null;
borderShared = null;
MigLayoutVisualPadding.uninstall( getComponent() );
} }
@Override @Override
protected void installListeners() { protected void installListeners() {
super.installListeners(); super.installListeners();
// necessary to update focus border and background
focusListener = new FlatUIUtils.RepaintFocusListener( getComponent(), null );
// update caps lock indicator // update caps lock indicator
capsLockListener = new KeyAdapter() { capsLockListener = new KeyAdapter() {
@Override @Override
@@ -168,7 +131,6 @@ public class FlatPasswordFieldUI
} }
}; };
getComponent().addFocusListener( focusListener );
getComponent().addKeyListener( capsLockListener ); getComponent().addKeyListener( capsLockListener );
} }
@@ -176,43 +138,24 @@ public class FlatPasswordFieldUI
protected void uninstallListeners() { protected void uninstallListeners() {
super.uninstallListeners(); super.uninstallListeners();
getComponent().removeFocusListener( focusListener );
getComponent().removeKeyListener( capsLockListener ); getComponent().removeKeyListener( capsLockListener );
focusListener = null;
capsLockListener = null; capsLockListener = null;
} }
@Override @Override
protected Caret createCaret() { protected void installKeyboardActions() {
return new FlatCaret( UIManager.getString( "TextComponent.selectAllOnFocusPolicy" ), super.installKeyboardActions();
UIManager.getBoolean( "TextComponent.selectAllOnMouseClick" ) );
// map "select-word" action (double-click) to "select-line" action
ActionMap map = SwingUtilities.getUIActionMap( getComponent() );
if( map != null && map.get( DefaultEditorKit.selectWordAction ) != null ) {
Action selectLineAction = map.get( DefaultEditorKit.selectLineAction );
if( selectLineAction != null )
map.put( DefaultEditorKit.selectWordAction, selectLineAction );
}
} }
@Override @Override
protected void propertyChange( PropertyChangeEvent e ) {
String propertyName = e.getPropertyName();
if( "editable".equals( propertyName ) || "enabled".equals( propertyName ) )
updateBackground();
else
super.propertyChange( e );
FlatTextFieldUI.propertyChange( getComponent(), e, this::applyStyle );
}
/**
* @since TODO
*/
protected void applyStyle( Object style ) {
oldDisabledBackground = disabledBackground;
oldInactiveBackground = inactiveBackground;
oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty );
updateBackground();
}
/**
* @since TODO
*/
protected Object applyStyleProperty( String key, Object value ) { protected Object applyStyleProperty( String key, Object value ) {
if( key.equals( "capsLockIconColor" ) && capsLockIcon instanceof FlatCapsLockIcon ) { if( key.equals( "capsLockIconColor" ) && capsLockIcon instanceof FlatCapsLockIcon ) {
if( capsLockIconShared ) { if( capsLockIconShared ) {
@@ -222,24 +165,23 @@ public class FlatPasswordFieldUI
return ((FlatCapsLockIcon)capsLockIcon).applyStyleProperty( key, value ); return ((FlatCapsLockIcon)capsLockIcon).applyStyleProperty( key, value );
} }
if( borderShared == null ) return super.applyStyleProperty( key, value );
borderShared = new AtomicBoolean( true );
return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, getComponent(), borderShared );
} }
private void updateBackground() { @Override
FlatTextFieldUI.updateBackground( getComponent(), background, public View create( Element elem ) {
disabledBackground, inactiveBackground, return new PasswordView( elem );
oldDisabledBackground, oldInactiveBackground );
} }
@Override @Override
protected void paintSafely( Graphics g ) { protected void paintSafely( Graphics g ) {
FlatTextFieldUI.paintBackground( g, getComponent(), isIntelliJTheme, focusedBackground ); // safe and restore clipping area because super.paintSafely() modifies it
FlatTextFieldUI.paintPlaceholder( g, getComponent(), placeholderForeground ); // and the caps lock icon would be truncated
paintCapsLock( g ); Shape oldClip = g.getClip();
super.paintSafely( g );
g.setClip( oldClip );
super.paintSafely( HiDPIUtils.createGraphicsTextYCorrection( (Graphics2D) g ) ); paintCapsLock( g );
} }
protected void paintCapsLock( Graphics g ) { protected void paintCapsLock( Graphics g ) {
@@ -255,19 +197,4 @@ public class FlatPasswordFieldUI
int x = c.getWidth() - capsLockIcon.getIconWidth() - y; int x = c.getWidth() - capsLockIcon.getIconWidth() - y;
capsLockIcon.paintIcon( c, g, x, y ); capsLockIcon.paintIcon( c, g, x, y );
} }
@Override
protected void paintBackground( Graphics g ) {
// background is painted elsewhere
}
@Override
public Dimension getPreferredSize( JComponent c ) {
return FlatTextFieldUI.applyMinimumWidth( c, super.getPreferredSize( c ), minimumWidth );
}
@Override
public Dimension getMinimumSize( JComponent c ) {
return FlatTextFieldUI.applyMinimumWidth( c, super.getMinimumSize( c ), minimumWidth );
}
} }

View File

@@ -369,6 +369,9 @@ public class FlatScrollPaneUI
paint( g, c ); paint( g, c );
} }
/**
* @since 1.3
*/
public static boolean isPermanentFocusOwner( JScrollPane scrollPane ) { public static boolean isPermanentFocusOwner( JScrollPane scrollPane ) {
JViewport viewport = scrollPane.getViewport(); JViewport viewport = scrollPane.getViewport();
Component view = (viewport != null) ? viewport.getView() : null; Component view = (viewport != null) ? viewport.getView() : null;

View File

@@ -214,6 +214,7 @@ public class FlatSpinnerUI
if( textField != null ) if( textField != null )
textField.setOpaque( false ); textField.setOpaque( false );
updateEditorPadding();
updateEditorColors(); updateEditorColors();
return editor; return editor;
} }
@@ -224,6 +225,8 @@ public class FlatSpinnerUI
removeEditorFocusListener( oldEditor ); removeEditorFocusListener( oldEditor );
addEditorFocusListener( newEditor ); addEditorFocusListener( newEditor );
updateEditorPadding();
updateEditorColors(); updateEditorColors();
} }
@@ -239,6 +242,12 @@ public class FlatSpinnerUI
textField.removeFocusListener( getHandler() ); textField.removeFocusListener( getHandler() );
} }
private void updateEditorPadding() {
JTextField textField = getEditorTextField( spinner.getEditor() );
if( textField != null )
textField.putClientProperty( FlatClientProperties.TEXT_FIELD_PADDING, padding );
}
private void updateEditorColors() { private void updateEditorColors() {
JTextField textField = getEditorTextField( spinner.getEditor() ); JTextField textField = getEditorTextField( spinner.getEditor() );
if( textField != null ) { if( textField != null ) {
@@ -256,6 +265,9 @@ public class FlatSpinnerUI
: null; : null;
} }
/**
* @since 1.3
*/
public static boolean isPermanentFocusOwner( JSpinner spinner ) { public static boolean isPermanentFocusOwner( JSpinner spinner ) {
if( FlatUIUtils.isPermanentFocusOwner( spinner ) ) if( FlatUIUtils.isPermanentFocusOwner( spinner ) )
return true; return true;
@@ -306,7 +318,7 @@ public class FlatSpinnerUI
FlatArrowButton button = new FlatArrowButton( direction, arrowType, buttonArrowColor, FlatArrowButton button = new FlatArrowButton( direction, arrowType, buttonArrowColor,
buttonDisabledArrowColor, buttonHoverArrowColor, null, buttonPressedArrowColor, null ); buttonDisabledArrowColor, buttonHoverArrowColor, null, buttonPressedArrowColor, null );
button.setName( name ); button.setName( name );
button.setYOffset( (direction == SwingConstants.NORTH) ? 1 : -1 ); button.setYOffset( (direction == SwingConstants.NORTH) ? 1.25f : -1.25f );
if( direction == SwingConstants.NORTH ) if( direction == SwingConstants.NORTH )
installNextButtonListeners( button ); installNextButtonListeners( button );
else else
@@ -435,7 +447,7 @@ public class FlatSpinnerUI
if( nextButton == null && previousButton == null ) { if( nextButton == null && previousButton == null ) {
if( editor != null ) if( editor != null )
editor.setBounds( FlatUIUtils.subtractInsets( r, padding ) ); editor.setBounds( r );
return; return;
} }
@@ -455,7 +467,7 @@ public class FlatSpinnerUI
} }
if( editor != null ) if( editor != null )
editor.setBounds( FlatUIUtils.subtractInsets( editorRect, padding ) ); editor.setBounds( editorRect );
int nextHeight = (buttonsRect.height / 2) + (buttonsRect.height % 2); // round up int nextHeight = (buttonsRect.height / 2) + (buttonsRect.height % 2); // round up
if( nextButton != null ) if( nextButton != null )

View File

@@ -24,6 +24,7 @@ import java.awt.FontMetrics;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Insets; import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.FocusListener; import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.util.Map; import java.util.Map;
@@ -44,6 +45,7 @@ import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable;
import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.HiDPIUtils;
import com.formdev.flatlaf.util.JavaCompatibility; import com.formdev.flatlaf.util.JavaCompatibility;
import com.formdev.flatlaf.util.UIScale;
/** /**
* Provides the Flat LaF UI delegate for {@link javax.swing.JTextField}. * Provides the Flat LaF UI delegate for {@link javax.swing.JTextField}.
@@ -177,6 +179,7 @@ public class FlatTextFieldUI
switch( e.getPropertyName() ) { switch( e.getPropertyName() ) {
case FlatClientProperties.PLACEHOLDER_TEXT: case FlatClientProperties.PLACEHOLDER_TEXT:
case FlatClientProperties.COMPONENT_ROUND_RECT: case FlatClientProperties.COMPONENT_ROUND_RECT:
case FlatClientProperties.TEXT_FIELD_PADDING:
c.repaint(); c.repaint();
break; break;
@@ -294,14 +297,14 @@ public class FlatTextFieldUI
if( !(background instanceof UIResource) ) if( !(background instanceof UIResource) )
return background; return background;
// focused
if( focusedBackground != null && FlatUIUtils.isPermanentFocusOwner( c ) )
return focusedBackground;
// for compatibility with IntelliJ themes // for compatibility with IntelliJ themes
if( isIntelliJTheme && (!c.isEnabled() || !c.isEditable()) ) if( isIntelliJTheme && (!c.isEnabled() || !c.isEditable()) )
return FlatUIUtils.getParentBackground( c ); return FlatUIUtils.getParentBackground( c );
// focused and editable
if( focusedBackground != null && c.isEditable() && FlatUIUtils.isPermanentFocusOwner( c ) )
return focusedBackground;
return background; return background;
} }
@@ -359,4 +362,27 @@ public class FlatTextFieldUI
size.width = Math.max( size.width, scale( minimumWidth ) + Math.round( focusWidth * 2 ) ); size.width = Math.max( size.width, scale( minimumWidth ) + Math.round( focusWidth * 2 ) );
return size; return size;
} }
@Override
protected Rectangle getVisibleEditorRect() {
Rectangle r = super.getVisibleEditorRect();
if( r != null ) {
// remove padding
Insets padding = getPadding();
if( padding != null ) {
r = FlatUIUtils.subtractInsets( r, padding );
r.width = Math.max( r.width, 0 );
r.height = Math.max( r.height, 0 );
}
}
return r;
}
/**
* @since 1.4
*/
protected Insets getPadding() {
Object padding = getComponent().getClientProperty( FlatClientProperties.TEXT_FIELD_PADDING );
return (padding instanceof Insets) ? UIScale.scale( (Insets) padding ) : null;
}
} }

View File

@@ -660,7 +660,7 @@ public class FlatUIUtils
* @since 1.1 * @since 1.1
*/ */
public static void paintArrow( Graphics2D g, int x, int y, int width, int height, public static void paintArrow( Graphics2D g, int x, int y, int width, int height,
int direction, boolean chevron, int arrowSize, int xOffset, int yOffset ) int direction, boolean chevron, int arrowSize, float xOffset, float yOffset )
{ {
// compute arrow width/height // compute arrow width/height
int aw = UIScale.scale( arrowSize + (chevron ? 0 : 1) ); int aw = UIScale.scale( arrowSize + (chevron ? 0 : 1) );
@@ -679,8 +679,10 @@ public class FlatUIUtils
int extra = chevron ? 1 : 0; int extra = chevron ? 1 : 0;
// compute arrow location // compute arrow location
int ax = x + Math.round( ((width - (aw + extra)) / 2f) + UIScale.scale( (float) xOffset ) ); float ox = ((width - (aw + extra)) / 2f) + UIScale.scale( xOffset );
int ay = y + Math.round( ((height - (ah + extra)) / 2f) + UIScale.scale( (float) yOffset ) ); float oy = ((height - (ah + extra)) / 2f) + UIScale.scale( yOffset );
int ax = x + ((direction == SwingConstants.WEST) ? -Math.round( -ox ) : Math.round( ox ));
int ay = y + ((direction == SwingConstants.NORTH) ? -Math.round( -oy ) : Math.round( oy ));
// paint arrow // paint arrow
g.translate( ax, ay ); g.translate( ax, ay );

View File

@@ -164,7 +164,7 @@ public class FlatStylingTests
ui.applyStyle( "buttonHoverArrowColor: #fff" ); ui.applyStyle( "buttonHoverArrowColor: #fff" );
ui.applyStyle( "buttonPressedArrowColor: #fff" ); ui.applyStyle( "buttonPressedArrowColor: #fff" );
ui.applyStyle( "popupFocusedBackground: #fff" ); ui.applyStyle( "popupBackground: #fff" );
// border // border
flatRoundBorder( style -> ui.applyStyle( style ) ); flatRoundBorder( style -> ui.applyStyle( style ) );

View File

@@ -0,0 +1,203 @@
/*
* Copyright 2021 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.ui;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.plaf.basic.BasicComboBoxEditor;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import com.formdev.flatlaf.util.UIScale;
/**
* @author Karl Tauber
*/
public class TestFlatComponentSizes
{
@BeforeAll
static void setup() {
TestUtils.setup( false );
}
@AfterAll
static void cleanup() {
TestUtils.cleanup();
}
static float[] factors() {
return TestUtils.FACTORS;
}
@ParameterizedTest
@MethodSource( "factors" )
void sizes( float factor ) {
TestUtils.scaleFont( factor );
// should have same default size (minimumWidth is 64)
JTextField textField = new JTextField();
JFormattedTextField formattedTextField = new JFormattedTextField();
JPasswordField passwordField = new JPasswordField();
JSpinner spinner = new JSpinner();
Dimension textFieldSize = textField.getPreferredSize();
assertEquals( textFieldSize, formattedTextField.getPreferredSize() );
assertEquals( textFieldSize, passwordField.getPreferredSize() );
assertEquals( textFieldSize, spinner.getPreferredSize() );
// should have same default size (minimumWidth is 72)
JButton button = new JButton( "text" );
JComboBox<String> comboBox = new JComboBox<>();
JComboBox<String> comboBoxEditable = new JComboBox<>();
comboBoxEditable.setEditable( true );
Dimension buttonSize = button.getPreferredSize();
assertEquals( buttonSize, comboBox.getPreferredSize() );
assertEquals( buttonSize, comboBoxEditable.getPreferredSize() );
// should have same height
JToggleButton toggleButton = new JToggleButton( "text" );
assertEquals( textFieldSize.height, button.getPreferredSize().height );
assertEquals( textFieldSize.height, toggleButton.getPreferredSize().height );
// should have same size
JCheckBox checkBox = new JCheckBox( "text" );
JRadioButton radioButton = new JRadioButton( "text" );
assertEquals( checkBox.getPreferredSize(), radioButton.getPreferredSize() );
// should have same size
JMenu menu = new JMenu( "text" );
JMenuItem menuItem = new JMenuItem( "text" );
JCheckBoxMenuItem checkBoxMenuItem = new JCheckBoxMenuItem( "text" );
JRadioButtonMenuItem radioButtonMenuItem = new JRadioButtonMenuItem( "text" );
Dimension menuSize = menu.getPreferredSize();
assertEquals( menuSize, menuItem.getPreferredSize() );
assertEquals( menuSize, checkBoxMenuItem.getPreferredSize() );
assertEquals( menuSize, radioButtonMenuItem.getPreferredSize() );
TestUtils.resetFont();
}
@ParameterizedTest
@MethodSource( "factors" )
void comboBox( float factor ) {
TestUtils.scaleFont( factor );
String[] items = { "t" };
JComboBox<String> comboBox = new JComboBox<>( items );
JComboBox<String> comboBox2 = new JComboBox<>( items );
JComboBox<String> comboBox3 = new JComboBox<>( items );
JComboBox<String> comboBox4 = new JComboBox<>( items );
applyCustomComboBoxRendererBorder( comboBox2, new LineBorder( Color.orange, UIScale.scale( 6 ) ) );
applyCustomComboBoxRendererBorder( comboBox3, new BorderWithIcon() );
applyCustomComboBoxRendererBorder( comboBox4, null );
Dimension size = comboBox.getPreferredSize();
assertEquals( size.width, comboBox2.getPreferredSize().width );
assertEquals( size.height - (2 * UIScale.scale( 2 )) + (2 * UIScale.scale( 6 )), comboBox2.getPreferredSize().height );
assertEquals( size, comboBox3.getPreferredSize() );
assertEquals( size, comboBox4.getPreferredSize() );
TestUtils.resetFont();
}
@SuppressWarnings( "unchecked" )
private void applyCustomComboBoxRendererBorder( JComboBox<String> comboBox, Border border ) {
BasicComboBoxRenderer customRenderer = new BasicComboBoxRenderer();
customRenderer.setBorder( border );
comboBox.setRenderer( customRenderer );
}
@ParameterizedTest
@MethodSource( "factors" )
void comboBoxEditable( float factor ) {
TestUtils.scaleFont( factor );
String[] items = { "t" };
JComboBox<String> comboBox = new JComboBox<>( items );
JComboBox<String> comboBox2 = new JComboBox<>( items );
JComboBox<String> comboBox3 = new JComboBox<>( items );
JComboBox<String> comboBox4 = new JComboBox<>( items );
comboBox.setEditable( true );
comboBox2.setEditable( true );
comboBox3.setEditable( true );
comboBox4.setEditable( true );
applyCustomComboBoxEditorBorder( comboBox2, new LineBorder( Color.orange, UIScale.scale( 6 ) ) );
applyCustomComboBoxEditorBorder( comboBox3, new BorderWithIcon() );
applyCustomComboBoxEditorBorder( comboBox4, null );
Dimension size = comboBox.getPreferredSize();
assertEquals( size.width, comboBox2.getPreferredSize().width );
assertEquals( size.height - (2 * UIScale.scale( 2 )) + (2 * UIScale.scale( 6 )), comboBox2.getPreferredSize().height );
assertEquals( size, comboBox3.getPreferredSize() );
assertEquals( size, comboBox4.getPreferredSize() );
TestUtils.resetFont();
}
private void applyCustomComboBoxEditorBorder( JComboBox<String> comboBox, Border border ) {
JTextField customTextField = new JTextField();
if( border != null )
customTextField.setBorder( border );
comboBox.setEditor( new BasicComboBoxEditor() {
@Override
protected JTextField createEditorComponent() {
return customTextField;
}
} );
}
//---- class BorderWithIcon -----------------------------------------------
private static class BorderWithIcon
implements Border
{
@Override
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
}
@Override
public boolean isBorderOpaque() {
return false;
}
@Override
public Insets getBorderInsets( Component c ) {
return new Insets( 0, 0, 0, UIScale.scale( 16 ) + 4 );
}
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright 2021 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.ui;
import org.junit.jupiter.api.BeforeAll;
/**
* @author Karl Tauber
*/
public class TestFlatComponentSizesWithFocus
extends TestFlatComponentSizes
{
@BeforeAll
static void setup() {
TestUtils.setup( true );
}
}

View File

@@ -0,0 +1,53 @@
/*
* Copyright 2021 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.ui;
import java.awt.Font;
import javax.swing.UIManager;
import com.formdev.flatlaf.FlatIntelliJLaf;
import com.formdev.flatlaf.FlatLightLaf;
import com.formdev.flatlaf.FlatSystemProperties;
/**
* @author Karl Tauber
*/
public class TestUtils
{
public static final float[] FACTORS = new float[] { 1f, 1.25f, 1.5f, 1.75f, 2f, 2.25f, 2.5f, 2.75f, 3f, 3.25f, 3.5f, 3.75f, 4f, 5f, 6f };
public static void setup( boolean withFocus ) {
System.setProperty( FlatSystemProperties.UI_SCALE, "1x" );
if( withFocus )
FlatIntelliJLaf.setup();
else
FlatLightLaf.setup();
System.clearProperty( FlatSystemProperties.UI_SCALE );
}
public static void cleanup() {
UIManager.put( "defaultFont", null );
}
public static void scaleFont( float factor ) {
Font defaultFont = UIManager.getLookAndFeelDefaults().getFont( "defaultFont" );
UIManager.put( "defaultFont", defaultFont.deriveFont( (float) Math.round( defaultFont.getSize() * factor ) ) );
}
public static void resetFont() {
UIManager.put( "defaultFont", null );
}
}

View File

@@ -44,6 +44,7 @@ import java.awt.event.WindowListener;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport; import java.beans.PropertyChangeSupport;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method;
import javax.swing.AbstractButton; import javax.swing.AbstractButton;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JLayeredPane; import javax.swing.JLayeredPane;
@@ -64,6 +65,7 @@ import javax.swing.plaf.UIResource;
import javax.swing.text.JTextComponent; import javax.swing.text.JTextComponent;
import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.SystemInfo;
import com.formdev.flatlaf.util.UIScale; import com.formdev.flatlaf.util.UIScale;
/** /**
@@ -478,9 +480,17 @@ public class FlatInspector
if( c instanceof JComponent ) { if( c instanceof JComponent ) {
try { try {
Field f = JComponent.class.getDeclaredField( "ui" ); Object ui;
f.setAccessible( true ); if( SystemInfo.isJava_9_orLater ) {
Object ui = f.get( c ); // Java 9+: use public method JComponent.getUI()
Method m = JComponent.class.getMethod( "getUI" );
ui = m.invoke( c );
} else {
// Java 8: read protected field 'ui'
Field f = JComponent.class.getDeclaredField( "ui" );
f.setAccessible( true );
ui = f.get( c );
}
appendRow( buf, "UI", (ui != null ? toString( ui.getClass(), classHierarchy ) : "null") ); appendRow( buf, "UI", (ui != null ? toString( ui.getClass(), classHierarchy ) : "null") );
} catch( Exception ex ) { } catch( Exception ex ) {
// ignore // ignore
@@ -553,6 +563,9 @@ public class FlatInspector
String simpleName = (dot >= 0) ? name.substring( dot + 1 ) : name; String simpleName = (dot >= 0) ? name.substring( dot + 1 ) : name;
buf.append( simpleName ).append( ' ' ).append( toDimmedText( "(" + pkg + ")" ) ); buf.append( simpleName ).append( ' ' ).append( toDimmedText( "(" + pkg + ")" ) );
if( UIResource.class.isAssignableFrom( cls ) )
buf.append( " UI" );
if( !classHierarchy ) if( !classHierarchy )
break; break;
@@ -613,11 +626,14 @@ public class FlatInspector
String s = toString( b.getClass(), classHierarchy ); String s = toString( b.getClass(), classHierarchy );
if( b instanceof EmptyBorder ) if( b instanceof EmptyBorder ) {
s += '(' + toString( ((EmptyBorder)b).getBorderInsets() ) + ')'; String borderInsets = " (" + toString( ((EmptyBorder)b).getBorderInsets() ) + ')';
int brIndex = s.indexOf( "<br>" );
if( b instanceof UIResource ) if( brIndex >= 0 )
s += " UI"; s = s.substring( 0, brIndex ) + borderInsets + s.substring( brIndex );
else
s += borderInsets;
}
return s; return s;
} }

View File

@@ -23,7 +23,7 @@ dependencies {
implementation( project( ":flatlaf-core" ) ) implementation( project( ":flatlaf-core" ) )
// use compileOnly() because there are various JIDE libraries available on Maven Central // use compileOnly() because there are various JIDE libraries available on Maven Central
compileOnly( "com.formdev:jide-oss:3.7.11.1" ) compileOnly( "com.formdev:jide-oss:3.7.12" )
} }
java { java {

View File

@@ -33,7 +33,7 @@ dependencies {
implementation( "com.jgoodies:jgoodies-forms:1.9.0" ) implementation( "com.jgoodies:jgoodies-forms:1.9.0" )
implementation( "org.swinglabs.swingx:swingx-all:1.6.5-1" ) implementation( "org.swinglabs.swingx:swingx-all:1.6.5-1" )
implementation( "org.swinglabs.swingx:swingx-beaninfo:1.6.5-1" ) implementation( "org.swinglabs.swingx:swingx-beaninfo:1.6.5-1" )
implementation( "com.formdev:jide-oss:3.7.11.1" ) implementation( "com.formdev:jide-oss:3.7.12" )
implementation( "com.glazedlists:glazedlists:1.11.0" ) implementation( "com.glazedlists:glazedlists:1.11.0" )
implementation( "org.netbeans.api:org-openide-awt:RELEASE112" ) implementation( "org.netbeans.api:org-openide-awt:RELEASE112" )
} }

View File

@@ -147,7 +147,7 @@ public class FlatAnimatedIconTest
@Override @Override
public void paintIconAnimated( Component c, Graphics g, int x, int y, float animatedValue ) { public void paintIconAnimated( Component c, Graphics g, int x, int y, float animatedValue ) {
Color color = ColorFunctions.mix( onColor, offColor, animatedValue );; Color color = ColorFunctions.mix( onColor, offColor, animatedValue );
// border // border
g.setColor( color ); g.setColor( color );
@@ -190,7 +190,7 @@ public class FlatAnimatedIconTest
@Override @Override
public void paintIconAnimated( Component c, Graphics g, int x, int y, float animatedValue ) { public void paintIconAnimated( Component c, Graphics g, int x, int y, float animatedValue ) {
Color color = ColorFunctions.mix( onColor, offColor, animatedValue );; Color color = ColorFunctions.mix( onColor, offColor, animatedValue );
g.setColor( color ); g.setColor( color );
g.fillRoundRect( x, y, width, height, height, height ); g.fillRoundRect( x, y, width, height, height, height );

View File

@@ -51,6 +51,7 @@ public class FlatBaselineTest
JFormattedTextField formattedTextField1 = new JFormattedTextField(); JFormattedTextField formattedTextField1 = new JFormattedTextField();
JPasswordField passwordField1 = new JPasswordField(); JPasswordField passwordField1 = new JPasswordField();
JComboBox<String> comboBox1 = new JComboBox<>(); JComboBox<String> comboBox1 = new JComboBox<>();
JComboBox<String> comboBox2 = new JComboBox<>();
JSpinner spinner1 = new JSpinner(); JSpinner spinner1 = new JSpinner();
JLabel label6 = new JLabel(); JLabel label6 = new JLabel();
JScrollPane scrollPane1 = new JScrollPane(); JScrollPane scrollPane1 = new JScrollPane();
@@ -88,7 +89,7 @@ public class FlatBaselineTest
//======== this ======== //======== this ========
setLayout(new MigLayout( setLayout(new MigLayout(
"insets dialog,hidemode 3,debug", "insets dialog,hidemode 3",
// columns // columns
"[fill]" + "[fill]" +
"[fill]" + "[fill]" +
@@ -96,6 +97,7 @@ public class FlatBaselineTest
"[fill]" + "[fill]" +
"[fill]" + "[fill]" +
"[fill]" + "[fill]" +
"[fill]" +
"[fill]", "[fill]",
// rows // rows
"[]" + "[]" +
@@ -130,7 +132,7 @@ public class FlatBaselineTest
//---- textField4 ---- //---- textField4 ----
textField4.setText("Dext field"); textField4.setText("Dext field");
add(textField4, "cell 6 0"); add(textField4, "cell 7 0");
//---- label2 ---- //---- label2 ----
label2.setText("Dext"); label2.setText("Dext");
@@ -147,8 +149,20 @@ public class FlatBaselineTest
//---- passwordField1 ---- //---- passwordField1 ----
passwordField1.setText("Dext"); passwordField1.setText("Dext");
add(passwordField1, "cell 3 1"); add(passwordField1, "cell 3 1");
//---- comboBox1 ----
comboBox1.setModel(new DefaultComboBoxModel<>(new String[] {
"Dext"
}));
add(comboBox1, "cell 4 1"); add(comboBox1, "cell 4 1");
add(spinner1, "cell 5 1");
//---- comboBox2 ----
comboBox2.setModel(new DefaultComboBoxModel<>(new String[] {
"Dext"
}));
comboBox2.setEditable(true);
add(comboBox2, "cell 5 1");
add(spinner1, "cell 6 1");
//---- label6 ---- //---- label6 ----
label6.setText("Dext"); label6.setText("Dext");
@@ -171,7 +185,7 @@ public class FlatBaselineTest
//---- textField2 ---- //---- textField2 ----
textField2.setText("Dext field"); textField2.setText("Dext field");
add(textField2, "cell 6 2"); add(textField2, "cell 7 2");
//---- label7 ---- //---- label7 ----
label7.setText("Dext"); label7.setText("Dext");
@@ -230,18 +244,18 @@ public class FlatBaselineTest
//---- textField3 ---- //---- textField3 ----
textField3.setText("Dext field"); textField3.setText("Dext field");
add(textField3, "cell 6 3"); add(textField3, "cell 7 3");
//---- label3 ---- //---- label3 ----
label3.setText("Dext"); label3.setText("Dext");
add(label3, "cell 0 4"); add(label3, "cell 0 4");
add(slider1, "cell 1 4 6 1"); add(slider1, "cell 1 4 7 1");
//---- slider6 ---- //---- slider6 ----
slider6.setPaintTicks(true); slider6.setPaintTicks(true);
slider6.setMajorTickSpacing(25); slider6.setMajorTickSpacing(25);
slider6.setMinorTickSpacing(5); slider6.setMinorTickSpacing(5);
add(slider6, "cell 1 4 6 1"); add(slider6, "cell 1 4 7 1");
//---- label8 ---- //---- label8 ----
label8.setText("Dext"); label8.setText("Dext");
@@ -251,14 +265,14 @@ public class FlatBaselineTest
slider7.setPaintLabels(true); slider7.setPaintLabels(true);
slider7.setMajorTickSpacing(25); slider7.setMajorTickSpacing(25);
slider7.setMinorTickSpacing(5); slider7.setMinorTickSpacing(5);
add(slider7, "cell 1 5 6 1"); add(slider7, "cell 1 5 7 1");
//---- slider8 ---- //---- slider8 ----
slider8.setPaintLabels(true); slider8.setPaintLabels(true);
slider8.setPaintTicks(true); slider8.setPaintTicks(true);
slider8.setMajorTickSpacing(25); slider8.setMajorTickSpacing(25);
slider8.setMinorTickSpacing(5); slider8.setMinorTickSpacing(5);
add(slider8, "cell 1 5 6 1"); add(slider8, "cell 1 5 7 1");
//---- label4 ---- //---- label4 ----
label4.setText("Dext"); label4.setText("Dext");
@@ -266,13 +280,13 @@ public class FlatBaselineTest
//---- progressBar1 ---- //---- progressBar1 ----
progressBar1.setValue(30); progressBar1.setValue(30);
add(progressBar1, "cell 1 6 6 1"); add(progressBar1, "cell 1 6 7 1");
//---- progressBar3 ---- //---- progressBar3 ----
progressBar3.setStringPainted(true); progressBar3.setStringPainted(true);
progressBar3.setValue(30); progressBar3.setValue(30);
add(progressBar3, "cell 1 6 6 1"); add(progressBar3, "cell 1 6 7 1");
add(separator1, "cell 1 6 6 1"); add(separator1, "cell 1 6 7 1");
//---- label5 ---- //---- label5 ----
label5.setText("Dext"); label5.setText("Dext");
@@ -280,26 +294,26 @@ public class FlatBaselineTest
//---- slider2 ---- //---- slider2 ----
slider2.setOrientation(SwingConstants.VERTICAL); slider2.setOrientation(SwingConstants.VERTICAL);
add(slider2, "cell 1 7 6 1"); add(slider2, "cell 1 7 7 1");
//---- slider3 ---- //---- slider3 ----
slider3.setOrientation(SwingConstants.VERTICAL); slider3.setOrientation(SwingConstants.VERTICAL);
slider3.setPaintTicks(true); slider3.setPaintTicks(true);
slider3.setMajorTickSpacing(25); slider3.setMajorTickSpacing(25);
slider3.setMinorTickSpacing(5); slider3.setMinorTickSpacing(5);
add(slider3, "cell 1 7 6 1"); add(slider3, "cell 1 7 7 1");
//---- progressBar2 ---- //---- progressBar2 ----
progressBar2.setOrientation(SwingConstants.VERTICAL); progressBar2.setOrientation(SwingConstants.VERTICAL);
progressBar2.setValue(30); progressBar2.setValue(30);
add(progressBar2, "cell 1 7 6 1"); add(progressBar2, "cell 1 7 7 1");
//---- progressBar4 ---- //---- progressBar4 ----
progressBar4.setOrientation(SwingConstants.VERTICAL); progressBar4.setOrientation(SwingConstants.VERTICAL);
progressBar4.setStringPainted(true); progressBar4.setStringPainted(true);
progressBar4.setValue(30); progressBar4.setValue(30);
add(progressBar4, "cell 1 7 6 1"); add(progressBar4, "cell 1 7 7 1");
add(hSpacer1, "cell 1 7 6 1,growx"); add(hSpacer1, "cell 1 7 7 1,growx");
//---- label9 ---- //---- label9 ----
label9.setText("Dext"); label9.setText("Dext");
@@ -310,7 +324,7 @@ public class FlatBaselineTest
slider4.setPaintLabels(true); slider4.setPaintLabels(true);
slider4.setMajorTickSpacing(25); slider4.setMajorTickSpacing(25);
slider4.setMinorTickSpacing(5); slider4.setMinorTickSpacing(5);
add(slider4, "cell 1 8 6 1"); add(slider4, "cell 1 8 7 1");
//---- slider5 ---- //---- slider5 ----
slider5.setOrientation(SwingConstants.VERTICAL); slider5.setOrientation(SwingConstants.VERTICAL);
@@ -318,8 +332,8 @@ public class FlatBaselineTest
slider5.setPaintTicks(true); slider5.setPaintTicks(true);
slider5.setMajorTickSpacing(25); slider5.setMajorTickSpacing(25);
slider5.setMinorTickSpacing(5); slider5.setMinorTickSpacing(5);
add(slider5, "cell 1 8 6 1"); add(slider5, "cell 1 8 7 1");
add(hSpacer2, "cell 1 8 6 1,growx"); add(hSpacer2, "cell 1 8 7 1,growx");
// JFormDesigner - End of component initialization //GEN-END:initComponents // JFormDesigner - End of component initialization //GEN-END:initComponents
} }

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.2.0.298" Java: "15" encoding: "UTF-8" JFDML JFormDesigner: "7.0.4.0.360" Java: "16" encoding: "UTF-8"
new FormModel { new FormModel {
contentType: "form/swing" contentType: "form/swing"
@@ -7,8 +7,8 @@ new FormModel {
"JavaCodeGenerator.defaultVariableLocal": true "JavaCodeGenerator.defaultVariableLocal": true
} }
add( new FormContainer( "com.formdev.flatlaf.testing.FlatTestPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { add( new FormContainer( "com.formdev.flatlaf.testing.FlatTestPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "insets dialog,hidemode 3,debug" "$layoutConstraints": "insets dialog,hidemode 3"
"$columnConstraints": "[fill][fill][fill][fill][fill][fill][fill]" "$columnConstraints": "[fill][fill][fill][fill][fill][fill][fill][fill]"
"$rowConstraints": "[][][50][::80][][][][][]" "$rowConstraints": "[][][50][::80][][][][][]"
} ) { } ) {
name: "this" name: "this"
@@ -46,7 +46,7 @@ new FormModel {
name: "textField4" name: "textField4"
"text": "Dext field" "text": "Dext field"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 6 0" "value": "cell 7 0"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "label2" name: "label2"
@@ -74,16 +74,33 @@ new FormModel {
} ) } )
add( new FormComponent( "javax.swing.JComboBox" ) { add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox1" name: "comboBox1"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "Dext"
addElement( "Dext" )
}
auxiliary() { auxiliary() {
"JavaCodeGenerator.typeParameters": "String" "JavaCodeGenerator.typeParameters": "String"
} }
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 1" "value": "cell 4 1"
} ) } )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox2"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "Dext"
addElement( "Dext" )
}
"editable": true
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 1"
} )
add( new FormComponent( "javax.swing.JSpinner" ) { add( new FormComponent( "javax.swing.JSpinner" ) {
name: "spinner1" name: "spinner1"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 1" "value": "cell 6 1"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "label6" name: "label6"
@@ -112,7 +129,7 @@ new FormModel {
name: "textField2" name: "textField2"
"text": "Dext field" "text": "Dext field"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 6 2" "value": "cell 7 2"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "label7" name: "label7"
@@ -184,7 +201,7 @@ new FormModel {
name: "textField3" name: "textField3"
"text": "Dext field" "text": "Dext field"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 6 3" "value": "cell 7 3"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "label3" name: "label3"
@@ -195,7 +212,7 @@ new FormModel {
add( new FormComponent( "javax.swing.JSlider" ) { add( new FormComponent( "javax.swing.JSlider" ) {
name: "slider1" name: "slider1"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 4 6 1" "value": "cell 1 4 7 1"
} ) } )
add( new FormComponent( "javax.swing.JSlider" ) { add( new FormComponent( "javax.swing.JSlider" ) {
name: "slider6" name: "slider6"
@@ -203,7 +220,7 @@ new FormModel {
"majorTickSpacing": 25 "majorTickSpacing": 25
"minorTickSpacing": 5 "minorTickSpacing": 5
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 4 6 1" "value": "cell 1 4 7 1"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "label8" name: "label8"
@@ -217,7 +234,7 @@ new FormModel {
"majorTickSpacing": 25 "majorTickSpacing": 25
"minorTickSpacing": 5 "minorTickSpacing": 5
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 5 6 1" "value": "cell 1 5 7 1"
} ) } )
add( new FormComponent( "javax.swing.JSlider" ) { add( new FormComponent( "javax.swing.JSlider" ) {
name: "slider8" name: "slider8"
@@ -226,7 +243,7 @@ new FormModel {
"majorTickSpacing": 25 "majorTickSpacing": 25
"minorTickSpacing": 5 "minorTickSpacing": 5
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 5 6 1" "value": "cell 1 5 7 1"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "label4" name: "label4"
@@ -238,19 +255,19 @@ new FormModel {
name: "progressBar1" name: "progressBar1"
"value": 30 "value": 30
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 6 6 1" "value": "cell 1 6 7 1"
} ) } )
add( new FormComponent( "javax.swing.JProgressBar" ) { add( new FormComponent( "javax.swing.JProgressBar" ) {
name: "progressBar3" name: "progressBar3"
"stringPainted": true "stringPainted": true
"value": 30 "value": 30
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 6 6 1" "value": "cell 1 6 7 1"
} ) } )
add( new FormComponent( "javax.swing.JSeparator" ) { add( new FormComponent( "javax.swing.JSeparator" ) {
name: "separator1" name: "separator1"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 6 6 1" "value": "cell 1 6 7 1"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "label5" name: "label5"
@@ -262,7 +279,7 @@ new FormModel {
name: "slider2" name: "slider2"
"orientation": 1 "orientation": 1
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 7 6 1" "value": "cell 1 7 7 1"
} ) } )
add( new FormComponent( "javax.swing.JSlider" ) { add( new FormComponent( "javax.swing.JSlider" ) {
name: "slider3" name: "slider3"
@@ -271,14 +288,14 @@ new FormModel {
"majorTickSpacing": 25 "majorTickSpacing": 25
"minorTickSpacing": 5 "minorTickSpacing": 5
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 7 6 1" "value": "cell 1 7 7 1"
} ) } )
add( new FormComponent( "javax.swing.JProgressBar" ) { add( new FormComponent( "javax.swing.JProgressBar" ) {
name: "progressBar2" name: "progressBar2"
"orientation": 1 "orientation": 1
"value": 30 "value": 30
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 7 6 1" "value": "cell 1 7 7 1"
} ) } )
add( new FormComponent( "javax.swing.JProgressBar" ) { add( new FormComponent( "javax.swing.JProgressBar" ) {
name: "progressBar4" name: "progressBar4"
@@ -286,12 +303,12 @@ new FormModel {
"stringPainted": true "stringPainted": true
"value": 30 "value": 30
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 7 6 1" "value": "cell 1 7 7 1"
} ) } )
add( new FormComponent( "com.jformdesigner.designer.wrapper.HSpacer" ) { add( new FormComponent( "com.jformdesigner.designer.wrapper.HSpacer" ) {
name: "hSpacer1" name: "hSpacer1"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 7 6 1,growx" "value": "cell 1 7 7 1,growx"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "label9" name: "label9"
@@ -306,7 +323,7 @@ new FormModel {
"majorTickSpacing": 25 "majorTickSpacing": 25
"minorTickSpacing": 5 "minorTickSpacing": 5
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 8 6 1" "value": "cell 1 8 7 1"
} ) } )
add( new FormComponent( "javax.swing.JSlider" ) { add( new FormComponent( "javax.swing.JSlider" ) {
name: "slider5" name: "slider5"
@@ -316,12 +333,12 @@ new FormModel {
"majorTickSpacing": 25 "majorTickSpacing": 25
"minorTickSpacing": 5 "minorTickSpacing": 5
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 8 6 1" "value": "cell 1 8 7 1"
} ) } )
add( new FormComponent( "com.jformdesigner.designer.wrapper.HSpacer" ) { add( new FormComponent( "com.jformdesigner.designer.wrapper.HSpacer" ) {
name: "hSpacer2" name: "hSpacer2"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 8 6 1,growx" "value": "cell 1 8 7 1,growx"
} ) } )
}, new FormLayoutConstraints( null ) { }, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 ) "location": new java.awt.Point( 0, 0 )

View File

@@ -20,6 +20,7 @@ import java.awt.*;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.*; import javax.swing.border.*;
import javax.swing.plaf.basic.BasicComboBoxEditor; import javax.swing.plaf.basic.BasicComboBoxEditor;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
import com.formdev.flatlaf.icons.FlatFileViewFloppyDriveIcon; import com.formdev.flatlaf.icons.FlatFileViewFloppyDriveIcon;
import com.formdev.flatlaf.util.UIScale; import com.formdev.flatlaf.util.UIScale;
import net.miginfocom.swing.*; import net.miginfocom.swing.*;
@@ -42,9 +43,23 @@ public class FlatCustomBordersTest
} ); } );
} }
@SuppressWarnings( "unchecked" )
FlatCustomBordersTest() { FlatCustomBordersTest() {
initComponents(); initComponents();
applyCustomBorders(); applyCustomBorders();
DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>( new String[] {
"text",
"123",
"4567",
"abc",
"def"
} );
for( Component c : getComponents() ) {
if( c instanceof JComboBox )
((JComboBox<String>)c).setModel( model );
}
} }
@Override @Override
@@ -99,6 +114,13 @@ public class FlatCustomBordersTest
applyCustomComboBoxEditorBorderWithIcon( comboBox20 ); applyCustomComboBoxEditorBorderWithIcon( comboBox20 );
applyCustomComboBoxEditorBorder( comboBox21, null ); applyCustomComboBoxEditorBorder( comboBox21, null );
applyCustomComboBoxEditorBorder( comboBox22, null ); applyCustomComboBoxEditorBorder( comboBox22, null );
applyCustomComboBoxRendererBorder( comboBox23 );
applyCustomComboBoxRendererBorder( comboBox24 );
applyCustomComboBoxRendererBorderWithIcon( comboBox25 );
applyCustomComboBoxRendererBorderWithIcon( comboBox26 );
applyCustomComboBoxRendererBorder( comboBox27, null );
applyCustomComboBoxRendererBorder( comboBox28, null );
} }
private void applyCustomInsideBorder( JComponent c, String uiKey ) { private void applyCustomInsideBorder( JComponent c, String uiKey ) {
@@ -110,7 +132,7 @@ public class FlatCustomBordersTest
} }
private void applyCustomComboBoxEditorBorder( JComboBox<String> comboBox ) { private void applyCustomComboBoxEditorBorder( JComboBox<String> comboBox ) {
applyCustomComboBoxEditorBorder( comboBox, new LineBorder( ORANGE, UIScale.scale( 3 ) ) ); applyCustomComboBoxEditorBorder( comboBox, new LineBorder( ORANGE, UIScale.scale( 6 ) ) );
} }
private void applyCustomComboBoxEditorBorderWithIcon( JComboBox<String> comboBox ) { private void applyCustomComboBoxEditorBorderWithIcon( JComboBox<String> comboBox ) {
@@ -129,6 +151,21 @@ public class FlatCustomBordersTest
} ); } );
} }
private void applyCustomComboBoxRendererBorder( JComboBox<String> comboBox ) {
applyCustomComboBoxRendererBorder( comboBox, new LineBorder( ORANGE, UIScale.scale( 6 ) ) );
}
private void applyCustomComboBoxRendererBorderWithIcon( JComboBox<String> comboBox ) {
applyCustomComboBoxRendererBorder( comboBox, new BorderWithIcon() );
}
@SuppressWarnings( "unchecked" )
private void applyCustomComboBoxRendererBorder( JComboBox<String> comboBox, Border border ) {
BasicComboBoxRenderer customRenderer = new BasicComboBoxRenderer();
customRenderer.setBorder( border );
comboBox.setRenderer( customRenderer );
}
private void initComponents() { private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
label1 = new JLabel(); label1 = new JLabel();
@@ -152,10 +189,16 @@ public class FlatCustomBordersTest
comboBox2 = new JComboBox<>(); comboBox2 = new JComboBox<>();
comboBox3 = new JComboBox<>(); comboBox3 = new JComboBox<>();
comboBox4 = new JComboBox<>(); comboBox4 = new JComboBox<>();
comboBox23 = new JComboBox<>();
comboBox25 = new JComboBox<>();
comboBox27 = new JComboBox<>();
comboBox5 = new JComboBox<>(); comboBox5 = new JComboBox<>();
comboBox6 = new JComboBox<>(); comboBox6 = new JComboBox<>();
comboBox7 = new JComboBox<>(); comboBox7 = new JComboBox<>();
comboBox8 = new JComboBox<>(); comboBox8 = new JComboBox<>();
comboBox24 = new JComboBox<>();
comboBox26 = new JComboBox<>();
comboBox28 = new JComboBox<>();
comboBox9 = new JComboBox<>(); comboBox9 = new JComboBox<>();
comboBox10 = new JComboBox<>(); comboBox10 = new JComboBox<>();
comboBox11 = new JComboBox<>(); comboBox11 = new JComboBox<>();
@@ -289,6 +332,9 @@ public class FlatCustomBordersTest
add(comboBox2, "cell 2 3"); add(comboBox2, "cell 2 3");
add(comboBox3, "cell 3 3"); add(comboBox3, "cell 3 3");
add(comboBox4, "cell 4 3"); add(comboBox4, "cell 4 3");
add(comboBox23, "cell 5 3");
add(comboBox25, "cell 6 3");
add(comboBox27, "cell 7 3");
//---- comboBox5 ---- //---- comboBox5 ----
comboBox5.putClientProperty("JComponent.roundRect", true); comboBox5.putClientProperty("JComponent.roundRect", true);
@@ -306,6 +352,18 @@ public class FlatCustomBordersTest
comboBox8.putClientProperty("JComponent.roundRect", true); comboBox8.putClientProperty("JComponent.roundRect", true);
add(comboBox8, "cell 4 4"); add(comboBox8, "cell 4 4");
//---- comboBox24 ----
comboBox24.putClientProperty("JComponent.roundRect", true);
add(comboBox24, "cell 5 4");
//---- comboBox26 ----
comboBox26.putClientProperty("JComponent.roundRect", true);
add(comboBox26, "cell 6 4");
//---- comboBox28 ----
comboBox28.putClientProperty("JComponent.roundRect", true);
add(comboBox28, "cell 7 4");
//---- comboBox9 ---- //---- comboBox9 ----
comboBox9.setEditable(true); comboBox9.setEditable(true);
add(comboBox9, "cell 1 5"); add(comboBox9, "cell 1 5");
@@ -460,10 +518,16 @@ public class FlatCustomBordersTest
private JComboBox<String> comboBox2; private JComboBox<String> comboBox2;
private JComboBox<String> comboBox3; private JComboBox<String> comboBox3;
private JComboBox<String> comboBox4; private JComboBox<String> comboBox4;
private JComboBox<String> comboBox23;
private JComboBox<String> comboBox25;
private JComboBox<String> comboBox27;
private JComboBox<String> comboBox5; private JComboBox<String> comboBox5;
private JComboBox<String> comboBox6; private JComboBox<String> comboBox6;
private JComboBox<String> comboBox7; private JComboBox<String> comboBox7;
private JComboBox<String> comboBox8; private JComboBox<String> comboBox8;
private JComboBox<String> comboBox24;
private JComboBox<String> comboBox26;
private JComboBox<String> comboBox28;
private JComboBox<String> comboBox9; private JComboBox<String> comboBox9;
private JComboBox<String> comboBox10; private JComboBox<String> comboBox10;
private JComboBox<String> comboBox11; private JComboBox<String> comboBox11;
@@ -508,6 +572,9 @@ public class FlatCustomBordersTest
@Override @Override
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
icon.paintIcon( c, g, x + width - icon.getIconWidth() - 2, y + ((height - icon.getIconHeight()) / 2) ); icon.paintIcon( c, g, x + width - icon.getIconWidth() - 2, y + ((height - icon.getIconHeight()) / 2) );
g.setColor( RED );
g.drawRect( x, y, width - 1, height - 1 );
} }
@Override @Override

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.2.0.298" Java: "15" encoding: "UTF-8" JFDML JFormDesigner: "7.0.4.0.360" Java: "16" encoding: "UTF-8"
new FormModel { new FormModel {
contentType: "form/swing" contentType: "form/swing"
@@ -147,6 +147,30 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 3" "value": "cell 4 3"
} ) } )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox23"
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 3"
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox25"
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 6 3"
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox27"
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 7 3"
} )
add( new FormComponent( "javax.swing.JComboBox" ) { add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox5" name: "comboBox5"
"$client.JComponent.roundRect": true "$client.JComponent.roundRect": true
@@ -183,6 +207,33 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 4" "value": "cell 4 4"
} ) } )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox24"
"$client.JComponent.roundRect": true
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 4"
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox26"
"$client.JComponent.roundRect": true
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 6 4"
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox28"
"$client.JComponent.roundRect": true
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 7 4"
} )
add( new FormComponent( "javax.swing.JComboBox" ) { add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox9" name: "comboBox9"
"editable": true "editable": true

View File

@@ -73,6 +73,25 @@ public class FlatPaintingTest
repaint(); repaint();
} }
private void offsetChanged() {
float offset = (float) offsetSpinner.getValue();
System.out.println( offset );
arrowPainter5.setYOffset( offset );
arrowPainter6.setYOffset( -offset );
arrowPainter7.setXOffset( offset );
arrowPainter8.setXOffset( -offset );
arrowPainter13.setYOffset( offset );
arrowPainter14.setYOffset( -offset );
arrowPainter15.setXOffset( offset );
arrowPainter16.setXOffset( -offset );
repaint();
}
private void vectorChanged() { private void vectorChanged() {
boolean vector = vectorCheckBox.isSelected(); boolean vector = vectorCheckBox.isSelected();
@@ -84,7 +103,7 @@ public class FlatPaintingTest
repaint(); repaint();
} }
private void checkBox1ActionPerformed() { private void arrowButtonChanged() {
boolean button = buttonCheckBox.isSelected(); boolean button = buttonCheckBox.isSelected();
FlatTestFrame.updateComponentsRecur( (Container) getViewport().getView(), (c, type) -> { FlatTestFrame.updateComponentsRecur( (Container) getViewport().getView(), (c, type) -> {
@@ -143,11 +162,11 @@ public class FlatPaintingTest
FlatPaintingTest.ArrowPainter arrowPainter3 = new FlatPaintingTest.ArrowPainter(); FlatPaintingTest.ArrowPainter arrowPainter3 = new FlatPaintingTest.ArrowPainter();
FlatPaintingTest.ArrowPainter arrowPainter4 = new FlatPaintingTest.ArrowPainter(); FlatPaintingTest.ArrowPainter arrowPainter4 = new FlatPaintingTest.ArrowPainter();
JPanel panel1 = new JPanel(); JPanel panel1 = new JPanel();
FlatPaintingTest.ArrowPainter arrowPainter5 = new FlatPaintingTest.ArrowPainter(); arrowPainter5 = new FlatPaintingTest.ArrowPainter();
FlatPaintingTest.ArrowPainter arrowPainter6 = new FlatPaintingTest.ArrowPainter(); arrowPainter6 = new FlatPaintingTest.ArrowPainter();
JPanel panel2 = new JPanel(); JPanel panel2 = new JPanel();
FlatPaintingTest.ArrowPainter arrowPainter7 = new FlatPaintingTest.ArrowPainter(); arrowPainter7 = new FlatPaintingTest.ArrowPainter();
FlatPaintingTest.ArrowPainter arrowPainter8 = new FlatPaintingTest.ArrowPainter(); arrowPainter8 = new FlatPaintingTest.ArrowPainter();
JPanel panel5 = new JPanel(); JPanel panel5 = new JPanel();
JLabel arrowWidthLabel = new JLabel(); JLabel arrowWidthLabel = new JLabel();
arrowWidthSpinner = new JSpinner(); arrowWidthSpinner = new JSpinner();
@@ -155,6 +174,8 @@ public class FlatPaintingTest
arrowHeightSpinner = new JSpinner(); arrowHeightSpinner = new JSpinner();
JLabel arrowSizeLabel = new JLabel(); JLabel arrowSizeLabel = new JLabel();
arrowSizeSpinner = new JSpinner(); arrowSizeSpinner = new JSpinner();
JLabel offsetLabel = new JLabel();
offsetSpinner = new JSpinner();
vectorCheckBox = new JCheckBox(); vectorCheckBox = new JCheckBox();
buttonCheckBox = new JCheckBox(); buttonCheckBox = new JCheckBox();
FlatPaintingTest.ArrowPainter arrowPainter9 = new FlatPaintingTest.ArrowPainter(); FlatPaintingTest.ArrowPainter arrowPainter9 = new FlatPaintingTest.ArrowPainter();
@@ -162,11 +183,11 @@ public class FlatPaintingTest
FlatPaintingTest.ArrowPainter arrowPainter11 = new FlatPaintingTest.ArrowPainter(); FlatPaintingTest.ArrowPainter arrowPainter11 = new FlatPaintingTest.ArrowPainter();
FlatPaintingTest.ArrowPainter arrowPainter12 = new FlatPaintingTest.ArrowPainter(); FlatPaintingTest.ArrowPainter arrowPainter12 = new FlatPaintingTest.ArrowPainter();
JPanel panel3 = new JPanel(); JPanel panel3 = new JPanel();
FlatPaintingTest.ArrowPainter arrowPainter13 = new FlatPaintingTest.ArrowPainter(); arrowPainter13 = new FlatPaintingTest.ArrowPainter();
FlatPaintingTest.ArrowPainter arrowPainter14 = new FlatPaintingTest.ArrowPainter(); arrowPainter14 = new FlatPaintingTest.ArrowPainter();
JPanel panel4 = new JPanel(); JPanel panel4 = new JPanel();
FlatPaintingTest.ArrowPainter arrowPainter15 = new FlatPaintingTest.ArrowPainter(); arrowPainter15 = new FlatPaintingTest.ArrowPainter();
FlatPaintingTest.ArrowPainter arrowPainter16 = new FlatPaintingTest.ArrowPainter(); arrowPainter16 = new FlatPaintingTest.ArrowPainter();
//======== this ======== //======== this ========
setBorder(null); setBorder(null);
@@ -519,6 +540,7 @@ public class FlatPaintingTest
"[]" + "[]" +
"[]" + "[]" +
"[]" + "[]" +
"[]" +
"[]")); "[]"));
//---- arrowWidthLabel ---- //---- arrowWidthLabel ----
@@ -548,17 +570,26 @@ public class FlatPaintingTest
arrowSizeSpinner.addChangeListener(e -> arrowSizeChanged()); arrowSizeSpinner.addChangeListener(e -> arrowSizeChanged());
panel5.add(arrowSizeSpinner, "cell 1 2"); panel5.add(arrowSizeSpinner, "cell 1 2");
//---- offsetLabel ----
offsetLabel.setText("Offset:");
panel5.add(offsetLabel, "cell 0 3");
//---- offsetSpinner ----
offsetSpinner.setModel(new SpinnerNumberModel(1.0F, null, null, 0.05F));
offsetSpinner.addChangeListener(e -> offsetChanged());
panel5.add(offsetSpinner, "cell 1 3");
//---- vectorCheckBox ---- //---- vectorCheckBox ----
vectorCheckBox.setText("vector"); vectorCheckBox.setText("vector");
vectorCheckBox.addActionListener(e -> vectorChanged()); vectorCheckBox.addActionListener(e -> vectorChanged());
panel5.add(vectorCheckBox, "cell 0 3 2 1,alignx left,growx 0"); panel5.add(vectorCheckBox, "cell 0 4 2 1,alignx left,growx 0");
//---- buttonCheckBox ---- //---- buttonCheckBox ----
buttonCheckBox.setText("FlatArrowButton"); buttonCheckBox.setText("FlatArrowButton");
buttonCheckBox.addActionListener(e -> checkBox1ActionPerformed()); buttonCheckBox.addActionListener(e -> arrowButtonChanged());
panel5.add(buttonCheckBox, "cell 0 4 2 1,alignx left,growx 0"); panel5.add(buttonCheckBox, "cell 0 5 2 1,alignx left,growx 0");
} }
flatTestPanel1.add(panel5, "cell 6 5,aligny top,growy 0"); flatTestPanel1.add(panel5, "cell 6 5 1 2,aligny top,growy 0");
//---- arrowPainter9 ---- //---- arrowPainter9 ----
arrowPainter9.setScale(8.0F); arrowPainter9.setScale(8.0F);
@@ -635,11 +666,20 @@ public class FlatPaintingTest
} }
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private FlatPaintingTest.ArrowPainter arrowPainter5;
private FlatPaintingTest.ArrowPainter arrowPainter6;
private FlatPaintingTest.ArrowPainter arrowPainter7;
private FlatPaintingTest.ArrowPainter arrowPainter8;
private JSpinner arrowWidthSpinner; private JSpinner arrowWidthSpinner;
private JSpinner arrowHeightSpinner; private JSpinner arrowHeightSpinner;
private JSpinner arrowSizeSpinner; private JSpinner arrowSizeSpinner;
private JSpinner offsetSpinner;
private JCheckBox vectorCheckBox; private JCheckBox vectorCheckBox;
private JCheckBox buttonCheckBox; private JCheckBox buttonCheckBox;
private FlatPaintingTest.ArrowPainter arrowPainter13;
private FlatPaintingTest.ArrowPainter arrowPainter14;
private FlatPaintingTest.ArrowPainter arrowPainter15;
private FlatPaintingTest.ArrowPainter arrowPainter16;
// JFormDesigner - End of variables declaration //GEN-END:variables // JFormDesigner - End of variables declaration //GEN-END:variables
//---- class BorderPainter ------------------------------------------------ //---- class BorderPainter ------------------------------------------------
@@ -792,8 +832,8 @@ public class FlatPaintingTest
private int direction = SwingConstants.SOUTH; private int direction = SwingConstants.SOUTH;
private boolean chevron = true; private boolean chevron = true;
private int arrowSize = FlatArrowButton.DEFAULT_ARROW_WIDTH; private int arrowSize = FlatArrowButton.DEFAULT_ARROW_WIDTH;
private int xOffset = 0; private float xOffset = 0;
private int yOffset = 0; private float yOffset = 0;
private float scale = 1; private float scale = 1;
private boolean halfWidth; private boolean halfWidth;
private boolean halfHeight; private boolean halfHeight;
@@ -845,19 +885,19 @@ public class FlatPaintingTest
this.arrowSize = arrowSize; this.arrowSize = arrowSize;
} }
public int getXOffset() { public float getXOffset() {
return xOffset; return xOffset;
} }
public void setXOffset( int xOffset ) { public void setXOffset( float xOffset ) {
this.xOffset = xOffset; this.xOffset = xOffset;
} }
public int getYOffset() { public float getYOffset() {
return yOffset; return yOffset;
} }
public void setYOffset( int yOffset ) { public void setYOffset( float yOffset ) {
this.yOffset = yOffset; this.yOffset = yOffset;
} }

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.3.1.342" Java: "15" encoding: "UTF-8" JFDML JFormDesigner: "7.0.4.0.360" Java: "16" encoding: "UTF-8"
new FormModel { new FormModel {
contentType: "form/swing" contentType: "form/swing"
@@ -383,6 +383,9 @@ new FormModel {
"h": 10 "h": 10
"halfHeight": true "halfHeight": true
"YOffset": 1 "YOffset": 1
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
} ) } )
add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) { add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) {
name: "arrowPainter6" name: "arrowPainter6"
@@ -390,6 +393,9 @@ new FormModel {
"h": 10 "h": 10
"halfHeight": true "halfHeight": true
"YOffset": -1 "YOffset": -1
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
} ) } )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 5,align left top,grow 0 0" "value": "cell 4 5,align left top,grow 0 0"
@@ -403,6 +409,9 @@ new FormModel {
"w": 10 "w": 10
"halfWidth": true "halfWidth": true
"XOffset": 1 "XOffset": 1
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
} ) } )
add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) { add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) {
name: "arrowPainter8" name: "arrowPainter8"
@@ -411,6 +420,9 @@ new FormModel {
"w": 10 "w": 10
"halfWidth": true "halfWidth": true
"XOffset": -1 "XOffset": -1
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
} ) } )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 5,align left top,grow 0 0" "value": "cell 5 5,align left top,grow 0 0"
@@ -418,7 +430,7 @@ new FormModel {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3" "$layoutConstraints": "hidemode 3"
"$columnConstraints": "[fill][fill]" "$columnConstraints": "[fill][fill]"
"$rowConstraints": "[][][][][]" "$rowConstraints": "[][][][][][]"
} ) { } ) {
name: "panel5" name: "panel5"
"border": new javax.swing.border.TitledBorder( "Arrow Control" ) "border": new javax.swing.border.TitledBorder( "Arrow Control" )
@@ -479,6 +491,25 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 2" "value": "cell 1 2"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "offsetLabel"
"text": "Offset:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "offsetSpinner"
"model": new javax.swing.SpinnerNumberModel {
stepSize: 0.05f
value: 1.0f
}
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "offsetChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 3"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) { add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "vectorCheckBox" name: "vectorCheckBox"
"text": "vector" "text": "vector"
@@ -487,7 +518,7 @@ new FormModel {
} }
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "vectorChanged", false ) ) addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "vectorChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3 2 1,alignx left,growx 0" "value": "cell 0 4 2 1,alignx left,growx 0"
} ) } )
add( new FormComponent( "javax.swing.JCheckBox" ) { add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "buttonCheckBox" name: "buttonCheckBox"
@@ -495,12 +526,12 @@ new FormModel {
auxiliary() { auxiliary() {
"JavaCodeGenerator.variableLocal": false "JavaCodeGenerator.variableLocal": false
} }
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "checkBox1ActionPerformed", false ) ) addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "arrowButtonChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4 2 1,alignx left,growx 0" "value": "cell 0 5 2 1,alignx left,growx 0"
} ) } )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 6 5,aligny top,growy 0" "value": "cell 6 5 1 2,aligny top,growy 0"
} ) } )
add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) { add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) {
name: "arrowPainter9" name: "arrowPainter9"
@@ -545,6 +576,9 @@ new FormModel {
"chevron": false "chevron": false
"halfHeight": true "halfHeight": true
"YOffset": 1 "YOffset": 1
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
} ) } )
add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) { add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) {
name: "arrowPainter14" name: "arrowPainter14"
@@ -553,6 +587,9 @@ new FormModel {
"chevron": false "chevron": false
"halfHeight": true "halfHeight": true
"YOffset": -1 "YOffset": -1
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
} ) } )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 6,align left top,grow 0 0" "value": "cell 4 6,align left top,grow 0 0"
@@ -567,6 +604,9 @@ new FormModel {
"chevron": false "chevron": false
"halfWidth": true "halfWidth": true
"XOffset": 1 "XOffset": 1
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
} ) } )
add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) { add( new FormComponent( "com.formdev.flatlaf.testing.FlatPaintingTest$ArrowPainter" ) {
name: "arrowPainter16" name: "arrowPainter16"
@@ -576,6 +616,9 @@ new FormModel {
"chevron": false "chevron": false
"halfWidth": true "halfWidth": true
"XOffset": -1 "XOffset": -1
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
} ) } )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 6,align left top,grow 0 0" "value": "cell 5 6,align left top,grow 0 0"

View File

@@ -23,6 +23,7 @@ import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter; import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
@@ -284,6 +285,8 @@ public class FlatTestFrame
Properties properties = new Properties(); Properties properties = new Properties();
try( InputStream in = new FileInputStream( "lafs.properties" ) ) { try( InputStream in = new FileInputStream( "lafs.properties" ) ) {
properties.load( in ); properties.load( in );
} catch( FileNotFoundException ex ) {
// ignore
} catch( IOException ex ) { } catch( IOException ex ) {
ex.printStackTrace(); ex.printStackTrace();
} }

View File

@@ -16,8 +16,12 @@
package com.formdev.flatlaf.testing; package com.formdev.flatlaf.testing;
import java.awt.Component;
import java.awt.Insets;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.*;
import javax.swing.text.DefaultEditorKit; import javax.swing.text.DefaultEditorKit;
import com.formdev.flatlaf.FlatClientProperties;
import net.miginfocom.swing.*; import net.miginfocom.swing.*;
/** /**
@@ -41,16 +45,40 @@ public class FlatTextComponentsTest
textField1.setText( "new text" ); textField1.setText( "new text" );
} }
private void paddingChanged() {
Insets padding = new Insets(
(int) topPaddingField.getValue(),
(int) leftPaddingField.getValue(),
(int) bottomPaddingField.getValue(),
(int) rightPaddingField.getValue() );
if( padding.equals( new Insets( 0, 0, 0, 0 ) ) )
padding = null;
for( Component c : getComponents() ) {
if( c instanceof JTextField )
((JTextField)c).putClientProperty( FlatClientProperties.TEXT_FIELD_PADDING, padding );
}
}
private void initComponents() { private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
JLabel textFieldLabel = new JLabel(); JLabel textFieldLabel = new JLabel();
textField1 = new JTextField(); textField1 = new JTextField();
JTextField textField3 = new JTextField(); JTextField textField3 = new JTextField();
JTextField textField2 = new JTextField(); JTextField textField2 = new JTextField();
JButton button1 = new JButton();
JLabel formattedTextFieldLabel = new JLabel(); JLabel formattedTextFieldLabel = new JLabel();
JFormattedTextField formattedTextField1 = new JFormattedTextField(); JFormattedTextField formattedTextField1 = new JFormattedTextField();
JFormattedTextField formattedTextField3 = new JFormattedTextField(); JFormattedTextField formattedTextField3 = new JFormattedTextField();
JPanel panel1 = new JPanel();
JButton button1 = new JButton();
JLabel leftPaddingLabel = new JLabel();
leftPaddingField = new JSpinner();
JLabel rightPaddingLabel = new JLabel();
rightPaddingField = new JSpinner();
JLabel topPaddingLabel = new JLabel();
topPaddingField = new JSpinner();
JLabel bottomPaddingLabel = new JLabel();
bottomPaddingField = new JSpinner();
JLabel passwordFieldLabel = new JLabel(); JLabel passwordFieldLabel = new JLabel();
JPasswordField passwordField1 = new JPasswordField(); JPasswordField passwordField1 = new JPasswordField();
JPasswordField passwordField3 = new JPasswordField(); JPasswordField passwordField3 = new JPasswordField();
@@ -134,12 +162,6 @@ public class FlatTextComponentsTest
textField2.setName("textField2"); textField2.setName("textField2");
add(textField2, "cell 3 0"); add(textField2, "cell 3 0");
//---- button1 ----
button1.setText("change text");
button1.setName("button1");
button1.addActionListener(e -> changeText());
add(button1, "cell 4 0");
//---- formattedTextFieldLabel ---- //---- formattedTextFieldLabel ----
formattedTextFieldLabel.setText("JFormattedTextField:"); formattedTextFieldLabel.setText("JFormattedTextField:");
formattedTextFieldLabel.setDisplayedMnemonic('F'); formattedTextFieldLabel.setDisplayedMnemonic('F');
@@ -159,6 +181,70 @@ public class FlatTextComponentsTest
formattedTextField3.setName("formattedTextField3"); formattedTextField3.setName("formattedTextField3");
add(formattedTextField3, "cell 2 1,growx"); add(formattedTextField3, "cell 2 1,growx");
//======== panel1 ========
{
panel1.setBorder(new TitledBorder("Control"));
panel1.setName("panel1");
panel1.setLayout(new MigLayout(
"hidemode 3",
// columns
"[fill]" +
"[fill]",
// rows
"[]" +
"[]" +
"[]" +
"[]" +
"[]"));
//---- button1 ----
button1.setText("change text");
button1.setName("button1");
button1.addActionListener(e -> changeText());
panel1.add(button1, "cell 0 0 2 1,alignx left,growx 0");
//---- leftPaddingLabel ----
leftPaddingLabel.setText("Left padding:");
leftPaddingLabel.setName("leftPaddingLabel");
panel1.add(leftPaddingLabel, "cell 0 1");
//---- leftPaddingField ----
leftPaddingField.setName("leftPaddingField");
leftPaddingField.addChangeListener(e -> paddingChanged());
panel1.add(leftPaddingField, "cell 1 1");
//---- rightPaddingLabel ----
rightPaddingLabel.setText("Right padding:");
rightPaddingLabel.setName("rightPaddingLabel");
panel1.add(rightPaddingLabel, "cell 0 2");
//---- rightPaddingField ----
rightPaddingField.setName("rightPaddingField");
rightPaddingField.addChangeListener(e -> paddingChanged());
panel1.add(rightPaddingField, "cell 1 2");
//---- topPaddingLabel ----
topPaddingLabel.setText("Top padding:");
topPaddingLabel.setName("topPaddingLabel");
panel1.add(topPaddingLabel, "cell 0 3");
//---- topPaddingField ----
topPaddingField.setName("topPaddingField");
topPaddingField.addChangeListener(e -> paddingChanged());
panel1.add(topPaddingField, "cell 1 3");
//---- bottomPaddingLabel ----
bottomPaddingLabel.setText("Bottom padding:");
bottomPaddingLabel.setName("bottomPaddingLabel");
panel1.add(bottomPaddingLabel, "cell 0 4");
//---- bottomPaddingField ----
bottomPaddingField.setName("bottomPaddingField");
bottomPaddingField.addChangeListener(e -> paddingChanged());
panel1.add(bottomPaddingField, "cell 1 4");
}
add(panel1, "cell 4 0 1 6,aligny top,growy 0");
//---- passwordFieldLabel ---- //---- passwordFieldLabel ----
passwordFieldLabel.setText("JPasswordField:"); passwordFieldLabel.setText("JPasswordField:");
passwordFieldLabel.setDisplayedMnemonic('P'); passwordFieldLabel.setDisplayedMnemonic('P');
@@ -301,7 +387,7 @@ public class FlatTextComponentsTest
comboBox3.setPrototypeDisplayValue("12345"); comboBox3.setPrototypeDisplayValue("12345");
comboBox3.setComponentPopupMenu(popupMenu1); comboBox3.setComponentPopupMenu(popupMenu1);
comboBox3.setName("comboBox3"); comboBox3.setName("comboBox3");
add(comboBox3, "cell 2 6,growx"); add(comboBox3, "cell 2 6,growx,wmin 50");
//---- spinnerLabel ---- //---- spinnerLabel ----
spinnerLabel.setText("JSpinner:"); spinnerLabel.setText("JSpinner:");
@@ -361,5 +447,9 @@ public class FlatTextComponentsTest
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JTextField textField1; private JTextField textField1;
private JSpinner leftPaddingField;
private JSpinner rightPaddingField;
private JSpinner topPaddingField;
private JSpinner bottomPaddingField;
// JFormDesigner - End of variables declaration //GEN-END:variables // JFormDesigner - End of variables declaration //GEN-END:variables
} }

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.3.1.342" Java: "16" encoding: "UTF-8" JFDML JFormDesigner: "7.0.4.0.360" Java: "16" encoding: "UTF-8"
new FormModel { new FormModel {
contentType: "form/swing" contentType: "form/swing"
@@ -47,13 +47,6 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 3 0" "value": "cell 3 0"
} ) } )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button1"
"text": "change text"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "changeText", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 0"
} )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "formattedTextFieldLabel" name: "formattedTextFieldLabel"
"text": "JFormattedTextField:" "text": "JFormattedTextField:"
@@ -76,6 +69,83 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 1,growx" "value": "cell 2 1,growx"
} ) } )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$columnConstraints": "[fill][fill]"
"$rowConstraints": "[][][][][]"
} ) {
name: "panel1"
"border": new javax.swing.border.TitledBorder( "Control" )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button1"
"text": "change text"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "changeText", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0 2 1,alignx left,growx 0"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "leftPaddingLabel"
"text": "Left padding:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "leftPaddingField"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "paddingChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 1"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "rightPaddingLabel"
"text": "Right padding:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "rightPaddingField"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "paddingChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "topPaddingLabel"
"text": "Top padding:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "topPaddingField"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "paddingChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 3"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "bottomPaddingLabel"
"text": "Bottom padding:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "bottomPaddingField"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "paddingChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 4"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 0 1 6,aligny top,growy 0"
} )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "passwordFieldLabel" name: "passwordFieldLabel"
"text": "JPasswordField:" "text": "JPasswordField:"
@@ -217,7 +287,7 @@ new FormModel {
"prototypeDisplayValue": "12345" "prototypeDisplayValue": "12345"
"componentPopupMenu": #FormReference0 "componentPopupMenu": #FormReference0
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 6,growx" "value": "cell 2 6,growx,wmin 50"
} ) } )
add( new FormComponent( "javax.swing.JLabel" ) { add( new FormComponent( "javax.swing.JLabel" ) {
name: "spinnerLabel" name: "spinnerLabel"

View File

@@ -132,7 +132,7 @@ ComboBox.buttonEditableBackground = #ccc
ComboBox.focusedBackground = #ff8 ComboBox.focusedBackground = #ff8
ComboBox.buttonFocusedBackground = #ff0 ComboBox.buttonFocusedBackground = #ff0
ComboBox.popupFocusedBackground = #ffc ComboBox.popupBackground = #ffc
#---- Component ---- #---- Component ----