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; package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Dimension;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI; import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicEditorPaneUI; import javax.swing.plaf.basic.BasicEditorPaneUI;
/** /**
* Provides the Flat LaF UI delegate for {@link javax.swing.JEditorPane}. * 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 * @author Karl Tauber
*/ */
public class FlatEditorPaneUI public class FlatEditorPaneUI
extends BasicEditorPaneUI extends BasicEditorPaneUI
{ {
protected int minimumWidth;
public static ComponentUI createUI( JComponent c ) { public static ComponentUI createUI( JComponent c ) {
return new FlatEditorPaneUI(); 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; package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale; import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
@@ -33,6 +34,7 @@ import javax.swing.text.JTextComponent;
* TODO document used UI defaults of superclass * TODO document used UI defaults of superclass
* *
* @uiDefault Component.focusWidth int * @uiDefault Component.focusWidth int
* @uiDefault Component.minimumWidth int
* *
* @author Karl Tauber * @author Karl Tauber
*/ */
@@ -40,6 +42,7 @@ public class FlatPasswordFieldUI
extends BasicPasswordFieldUI extends BasicPasswordFieldUI
{ {
protected int focusWidth; protected int focusWidth;
protected int minimumWidth;
private Handler handler; private Handler handler;
@@ -52,6 +55,7 @@ public class FlatPasswordFieldUI
super.installDefaults(); super.installDefaults();
focusWidth = UIManager.getInt( "Component.focusWidth" ); focusWidth = UIManager.getInt( "Component.focusWidth" );
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
} }
@Override @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 ------------------------------------------------------ //---- class Handler ------------------------------------------------------
private class Handler private class Handler

View File

@@ -16,7 +16,9 @@
package com.formdev.flatlaf.ui; package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.UIManager; import javax.swing.UIManager;
@@ -30,14 +32,16 @@ import javax.swing.text.JTextComponent;
* *
* TODO document used UI defaults of superclass * TODO document used UI defaults of superclass
* *
* @uiDefault ComboBox.disabledBackground Color * @uiDefault Component.minimumWidth int
* @uiDefault ComboBox.inactiveBackground Color * @uiDefault TextArea.disabledBackground Color
* @uiDefault TextArea.inactiveBackground Color
* *
* @author Karl Tauber * @author Karl Tauber
*/ */
public class FlatTextAreaUI public class FlatTextAreaUI
extends BasicTextAreaUI extends BasicTextAreaUI
{ {
protected int minimumWidth;
protected Color disabledBackground; protected Color disabledBackground;
protected Color inactiveBackground; protected Color inactiveBackground;
@@ -49,6 +53,7 @@ public class FlatTextAreaUI
protected void installDefaults() { protected void installDefaults() {
super.installDefaults(); super.installDefaults();
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
disabledBackground = UIManager.getColor( "TextArea.disabledBackground" ); disabledBackground = UIManager.getColor( "TextArea.disabledBackground" );
inactiveBackground = UIManager.getColor( "TextArea.inactiveBackground" ); inactiveBackground = UIManager.getColor( "TextArea.inactiveBackground" );
} }
@@ -73,4 +78,23 @@ public class FlatTextAreaUI
: (!c.isEditable() ? inactiveBackground : background)) ); : (!c.isEditable() ? inactiveBackground : background)) );
g.fillRect( 0, 0, c.getWidth(), c.getHeight() ); 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; package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale; import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.FocusListener; import java.awt.event.FocusListener;
import javax.swing.JComboBox;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JSpinner;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI; import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicTextFieldUI; import javax.swing.plaf.basic.BasicTextFieldUI;
@@ -33,6 +37,7 @@ import javax.swing.text.JTextComponent;
* TODO document used UI defaults of superclass * TODO document used UI defaults of superclass
* *
* @uiDefault Component.focusWidth int * @uiDefault Component.focusWidth int
* @uiDefault Component.minimumWidth int
* *
* @author Karl Tauber * @author Karl Tauber
*/ */
@@ -40,6 +45,7 @@ public class FlatTextFieldUI
extends BasicTextFieldUI extends BasicTextFieldUI
{ {
protected int focusWidth; protected int focusWidth;
protected int minimumWidth;
private Handler handler; private Handler handler;
@@ -52,6 +58,7 @@ public class FlatTextFieldUI
super.installDefaults(); super.installDefaults();
focusWidth = UIManager.getInt( "Component.focusWidth" ); focusWidth = UIManager.getInt( "Component.focusWidth" );
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
} }
@Override @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 ------------------------------------------------------ //---- class Handler ------------------------------------------------------
private class Handler private class Handler

View File

@@ -16,19 +16,54 @@
package com.formdev.flatlaf.ui; package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Dimension;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI; import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicTextPaneUI; import javax.swing.plaf.basic.BasicTextPaneUI;
/** /**
* Provides the Flat LaF UI delegate for {@link javax.swing.JTextPane}. * 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 * @author Karl Tauber
*/ */
public class FlatTextPaneUI public class FlatTextPaneUI
extends BasicTextPaneUI extends BasicTextPaneUI
{ {
protected int minimumWidth;
public static ComponentUI createUI( JComponent c ) { public static ComponentUI createUI( JComponent c ) {
return new FlatTextPaneUI(); 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.focusWidth=0
Component.arc=5 Component.arc=5
Component.minimumWidth=64
#---- EditorPane ---- #---- EditorPane ----
@@ -324,6 +325,7 @@ TextArea.border=com.formdev.flatlaf.ui.FlatMarginBorder
TextArea.background=@textComponentBackground TextArea.background=@textComponentBackground
TextArea.margin=@textComponentMargin TextArea.margin=@textComponentMargin
#---- TextField ---- #---- TextField ----
TextField.border=com.formdev.flatlaf.ui.FlatBorder TextField.border=com.formdev.flatlaf.ui.FlatBorder