TextField, TextArea, TextPane and EditorPane: apply minimum width of 64px

This commit is contained in:
Karl Tauber
2019-09-11 10:17:07 +02:00
parent 1ecafa5f2d
commit 551cc1d76b
6 changed files with 145 additions and 2 deletions

View File

@@ -16,19 +16,54 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Dimension;
import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicEditorPaneUI;
/**
* Provides the Flat LaF UI delegate for {@link javax.swing.JEditorPane}.
*
* TODO document used UI defaults of superclass
*
* @uiDefault Component.minimumWidth int
*
* @author Karl Tauber
*/
public class FlatEditorPaneUI
extends BasicEditorPaneUI
{
protected int minimumWidth;
public static ComponentUI createUI( JComponent c ) {
return new FlatEditorPaneUI();
}
@Override
protected void installDefaults() {
super.installDefaults();
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
}
@Override
public Dimension getPreferredSize( JComponent c ) {
return applyMinimumWidth( super.getPreferredSize( c ) );
}
@Override
public Dimension getMinimumSize( JComponent c ) {
return applyMinimumWidth( super.getMinimumSize( c ) );
}
private Dimension applyMinimumWidth( Dimension size ) {
// Assume that text area is in a scroll pane (that displays the border)
// and subtract 1px border line width.
// Using "(scale( 1 ) * 2)" instead of "scale( 2 )" to deal with rounding
// issues. E.g. at scale factor 1.5 the first returns 4, but the second 3.
size.width = Math.max( size.width, scale( minimumWidth ) - (scale( 1 ) * 2) );
return size;
}
}

View File

@@ -17,6 +17,7 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.FocusEvent;
@@ -33,6 +34,7 @@ import javax.swing.text.JTextComponent;
* TODO document used UI defaults of superclass
*
* @uiDefault Component.focusWidth int
* @uiDefault Component.minimumWidth int
*
* @author Karl Tauber
*/
@@ -40,6 +42,7 @@ public class FlatPasswordFieldUI
extends BasicPasswordFieldUI
{
protected int focusWidth;
protected int minimumWidth;
private Handler handler;
@@ -52,6 +55,7 @@ public class FlatPasswordFieldUI
super.installDefaults();
focusWidth = UIManager.getInt( "Component.focusWidth" );
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
}
@Override
@@ -95,6 +99,21 @@ public class FlatPasswordFieldUI
}
}
@Override
public Dimension getPreferredSize( JComponent c ) {
return applyMinimumWidth( super.getPreferredSize( c ) );
}
@Override
public Dimension getMinimumSize( JComponent c ) {
return applyMinimumWidth( super.getMinimumSize( c ) );
}
private Dimension applyMinimumWidth( Dimension size ) {
size.width = Math.max( size.width, scale( minimumWidth + (focusWidth * 2) ) );
return size;
}
//---- class Handler ------------------------------------------------------
private class Handler

View File

@@ -16,7 +16,9 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.UIManager;
@@ -30,14 +32,16 @@ import javax.swing.text.JTextComponent;
*
* TODO document used UI defaults of superclass
*
* @uiDefault ComboBox.disabledBackground Color
* @uiDefault ComboBox.inactiveBackground Color
* @uiDefault Component.minimumWidth int
* @uiDefault TextArea.disabledBackground Color
* @uiDefault TextArea.inactiveBackground Color
*
* @author Karl Tauber
*/
public class FlatTextAreaUI
extends BasicTextAreaUI
{
protected int minimumWidth;
protected Color disabledBackground;
protected Color inactiveBackground;
@@ -49,6 +53,7 @@ public class FlatTextAreaUI
protected void installDefaults() {
super.installDefaults();
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
disabledBackground = UIManager.getColor( "TextArea.disabledBackground" );
inactiveBackground = UIManager.getColor( "TextArea.inactiveBackground" );
}
@@ -73,4 +78,23 @@ public class FlatTextAreaUI
: (!c.isEditable() ? inactiveBackground : background)) );
g.fillRect( 0, 0, c.getWidth(), c.getHeight() );
}
@Override
public Dimension getPreferredSize( JComponent c ) {
return applyMinimumWidth( super.getPreferredSize( c ) );
}
@Override
public Dimension getMinimumSize( JComponent c ) {
return applyMinimumWidth( super.getMinimumSize( c ) );
}
private Dimension applyMinimumWidth( Dimension size ) {
// Assume that text area is in a scroll pane (that displays the border)
// and subtract 1px border line width.
// Using "(scale( 1 ) * 2)" instead of "scale( 2 )" to deal with rounding
// issues. E.g. at scale factor 1.5 the first returns 4, but the second 3.
size.width = Math.max( size.width, scale( minimumWidth ) - (scale( 1 ) * 2) );
return size;
}
}

View File

@@ -17,11 +17,15 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JSpinner;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicTextFieldUI;
@@ -33,6 +37,7 @@ import javax.swing.text.JTextComponent;
* TODO document used UI defaults of superclass
*
* @uiDefault Component.focusWidth int
* @uiDefault Component.minimumWidth int
*
* @author Karl Tauber
*/
@@ -40,6 +45,7 @@ public class FlatTextFieldUI
extends BasicTextFieldUI
{
protected int focusWidth;
protected int minimumWidth;
private Handler handler;
@@ -52,6 +58,7 @@ public class FlatTextFieldUI
super.installDefaults();
focusWidth = UIManager.getInt( "Component.focusWidth" );
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
}
@Override
@@ -95,6 +102,27 @@ public class FlatTextFieldUI
}
}
@Override
public Dimension getPreferredSize( JComponent c ) {
return applyMinimumWidth( super.getPreferredSize( c ), c );
}
@Override
public Dimension getMinimumSize( JComponent c ) {
return applyMinimumWidth( super.getMinimumSize( c ), c );
}
private Dimension applyMinimumWidth( Dimension size, JComponent c ) {
Container parent = c.getParent();
if( parent instanceof JComboBox ||
parent instanceof JSpinner ||
(parent != null && parent.getParent() instanceof JSpinner) )
return size;
size.width = Math.max( size.width, scale( minimumWidth + (focusWidth * 2) ) );
return size;
}
//---- class Handler ------------------------------------------------------
private class Handler

View File

@@ -16,19 +16,54 @@
package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Dimension;
import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicTextPaneUI;
/**
* Provides the Flat LaF UI delegate for {@link javax.swing.JTextPane}.
*
* TODO document used UI defaults of superclass
*
* @uiDefault Component.minimumWidth int
*
* @author Karl Tauber
*/
public class FlatTextPaneUI
extends BasicTextPaneUI
{
protected int minimumWidth;
public static ComponentUI createUI( JComponent c ) {
return new FlatTextPaneUI();
}
@Override
protected void installDefaults() {
super.installDefaults();
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
}
@Override
public Dimension getPreferredSize( JComponent c ) {
return applyMinimumWidth( super.getPreferredSize( c ) );
}
@Override
public Dimension getMinimumSize( JComponent c ) {
return applyMinimumWidth( super.getMinimumSize( c ) );
}
private Dimension applyMinimumWidth( Dimension size ) {
// Assume that text area is in a scroll pane (that displays the border)
// and subtract 1px border line width.
// Using "(scale( 1 ) * 2)" instead of "scale( 2 )" to deal with rounding
// issues. E.g. at scale factor 1.5 the first returns 4, but the second 3.
size.width = Math.max( size.width, scale( minimumWidth ) - (scale( 1 ) * 2) );
return size;
}
}

View File

@@ -96,6 +96,7 @@ ComboBox.padding=1,6,1,6
Component.focusWidth=0
Component.arc=5
Component.minimumWidth=64
#---- EditorPane ----
@@ -324,6 +325,7 @@ TextArea.border=com.formdev.flatlaf.ui.FlatMarginBorder
TextArea.background=@textComponentBackground
TextArea.margin=@textComponentMargin
#---- TextField ----
TextField.border=com.formdev.flatlaf.ui.FlatBorder