mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-12 06:57:13 -06:00
Label: support painting background with rounded corners (issue #842)
Demo: added rounded panels and labels to "More Components" tab
This commit is contained in:
@@ -638,14 +638,18 @@ class UIDefaultsLoader
|
||||
// Syntax: top,left,bottom,right[,lineColor[,lineThickness[,arc]]]
|
||||
List<String> parts = splitFunctionParams( value, ',' );
|
||||
Insets insets = parseInsets( value );
|
||||
ColorUIResource lineColor = (parts.size() >= 5)
|
||||
ColorUIResource lineColor = (parts.size() >= 5 && !parts.get( 4 ).isEmpty())
|
||||
? (ColorUIResource) parseColorOrFunction( resolver.apply( parts.get( 4 ) ), resolver )
|
||||
: null;
|
||||
float lineThickness = (parts.size() >= 6 && !parts.get( 5 ).isEmpty()) ? parseFloat( parts.get( 5 ) ) : 1f;
|
||||
int arc = (parts.size() >= 7) ? parseInteger( parts.get( 6 ) ) : 0;
|
||||
float lineThickness = (parts.size() >= 6 && !parts.get( 5 ).isEmpty())
|
||||
? parseFloat( parts.get( 5 ) )
|
||||
: 1f;
|
||||
int arc = (parts.size() >= 7) && !parts.get( 6 ).isEmpty()
|
||||
? parseInteger( parts.get( 6 ) )
|
||||
: 0;
|
||||
|
||||
return (LazyValue) t -> {
|
||||
return (lineColor != null)
|
||||
return (lineColor != null || arc > 0)
|
||||
? new FlatLineBorder( insets, lineColor, lineThickness, arc )
|
||||
: new FlatEmptyBorder( insets );
|
||||
};
|
||||
|
||||
@@ -277,7 +277,7 @@ public class FlatBorder
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the (unscaled) arc diameter of the border.
|
||||
* Returns the (unscaled) arc diameter of the border corners.
|
||||
*/
|
||||
protected int getArc( Component c ) {
|
||||
return 0;
|
||||
|
||||
@@ -64,6 +64,9 @@ public class FlatLabelUI
|
||||
{
|
||||
@Styleable protected Color disabledForeground;
|
||||
|
||||
// only used via styling (not in UI defaults)
|
||||
/** @since 3.5 */ @Styleable protected int arc = -1;
|
||||
|
||||
private final boolean shared;
|
||||
private boolean defaults_initialized = false;
|
||||
private Map<String, Object> oldStyleValues;
|
||||
@@ -244,6 +247,12 @@ public class FlatLabelUI
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update( Graphics g, JComponent c ) {
|
||||
FlatPanelUI.fillRoundedBackground( g, c, arc );
|
||||
paint( g, c );
|
||||
}
|
||||
|
||||
static Graphics createGraphicsHTMLTextYCorrection( Graphics g, JComponent c ) {
|
||||
return (c.getClientProperty( BasicHTML.propertyKey ) != null)
|
||||
? HiDPIUtils.createGraphicsTextYCorrection( (Graphics2D) g )
|
||||
|
||||
@@ -26,10 +26,14 @@ import javax.swing.JComponent;
|
||||
|
||||
/**
|
||||
* Line border for various components.
|
||||
*
|
||||
* <p>
|
||||
* Paints a scaled (usually 1px thick) line around the component.
|
||||
* The line thickness is not added to the border insets.
|
||||
* The insets should be at least have line thickness (usually 1,1,1,1).
|
||||
* <p>
|
||||
* For {@link javax.swing.JPanel} and {@link javax.swing.JLabel}, this border
|
||||
* can be used paint rounded background (if line color is {@code null}) or
|
||||
* paint rounded line border with rounded background.
|
||||
*
|
||||
* @author Karl Tauber
|
||||
*/
|
||||
@@ -52,15 +56,28 @@ public class FlatLineBorder
|
||||
this.arc = arc;
|
||||
}
|
||||
|
||||
/** @since 3.5 */
|
||||
public FlatLineBorder( Insets insets, int arc ) {
|
||||
this( insets, null, 0, arc );
|
||||
}
|
||||
|
||||
public Color getLineColor() {
|
||||
return lineColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the (unscaled) line thickness used to paint the border.
|
||||
* The line thickness does not affect the border insets.
|
||||
*/
|
||||
public float getLineThickness() {
|
||||
return lineThickness;
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
/**
|
||||
* Returns the (unscaled) arc diameter of the border corners.
|
||||
*
|
||||
* @since 2
|
||||
*/
|
||||
public int getArc() {
|
||||
return arc;
|
||||
}
|
||||
@@ -70,11 +87,16 @@ public class FlatLineBorder
|
||||
if( c instanceof JComponent && ((JComponent)c).getClientProperty( FlatPopupFactory.KEY_POPUP_USES_NATIVE_BORDER ) != null )
|
||||
return;
|
||||
|
||||
Color lineColor = getLineColor();
|
||||
float lineThickness = getLineThickness();
|
||||
if( lineColor == null || lineThickness <= 0 )
|
||||
return;
|
||||
|
||||
Graphics2D g2 = (Graphics2D) g.create();
|
||||
try {
|
||||
FlatUIUtils.setRenderingHints( g2 );
|
||||
FlatUIUtils.paintOutlinedComponent( g2, x, y, width, height,
|
||||
0, 0, 0, scale( getLineThickness() ), scale( getArc() ), null, getLineColor(), null );
|
||||
0, 0, 0, scale( lineThickness ), scale( getArc() ), null, lineColor, null );
|
||||
} finally {
|
||||
g2.dispose();
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import java.util.Map;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.LookAndFeel;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.plaf.ComponentUI;
|
||||
import javax.swing.plaf.basic.BasicPanelUI;
|
||||
import com.formdev.flatlaf.FlatClientProperties;
|
||||
@@ -160,11 +161,18 @@ public class FlatPanelUI
|
||||
|
||||
@Override
|
||||
public void update( Graphics g, JComponent c ) {
|
||||
int arc = (this.arc >= 0)
|
||||
? this.arc
|
||||
: ((c.getBorder() instanceof FlatLineBorder)
|
||||
? ((FlatLineBorder)c.getBorder()).getArc()
|
||||
fillRoundedBackground( g, c, arc );
|
||||
paint( g, c );
|
||||
}
|
||||
|
||||
/** @since 3.5 */
|
||||
public static void fillRoundedBackground( Graphics g, JComponent c, int arc ) {
|
||||
if( arc < 0 ) {
|
||||
Border border = c.getBorder();
|
||||
arc = ((border instanceof FlatLineBorder)
|
||||
? ((FlatLineBorder)border).getArc()
|
||||
: 0);
|
||||
}
|
||||
|
||||
// fill background
|
||||
if( c.isOpaque() ) {
|
||||
@@ -185,8 +193,6 @@ public class FlatPanelUI
|
||||
0, UIScale.scale( arc ) );
|
||||
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
|
||||
}
|
||||
|
||||
paint( g, c );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -84,10 +84,12 @@ public class TestUIDefaultsLoader
|
||||
void parseBorders() {
|
||||
Insets insets = new Insets( 1,2,3,4 );
|
||||
assertBorderEquals( new FlatEmptyBorder( insets ), "1,2,3,4" );
|
||||
assertBorderEquals( new FlatEmptyBorder( insets ), "1,2,3,4,,," );
|
||||
assertBorderEquals( new FlatLineBorder( insets, Color.red ), "1,2,3,4,#f00" );
|
||||
assertBorderEquals( new FlatLineBorder( insets, Color.red, 2.5f, 0 ), "1,2,3,4,#f00,2.5" );
|
||||
assertBorderEquals( new FlatLineBorder( insets, Color.red, 2.5f, 6 ), "1,2,3,4,#f00,2.5,6" );
|
||||
assertBorderEquals( new FlatLineBorder( insets, Color.red, 1, 6 ), "1,2,3,4,#f00,,6" );
|
||||
assertBorderEquals( new FlatLineBorder( insets, null, 1, 6 ), "1,2,3,4,,,6" );
|
||||
}
|
||||
|
||||
private void assertBorderEquals( Border expected, String actualStyle ) {
|
||||
|
||||
@@ -253,7 +253,8 @@ public class TestFlatStyleableInfo
|
||||
FlatLabelUI ui = (FlatLabelUI) c.getUI();
|
||||
|
||||
Map<String, Class<?>> expected = expectedMap(
|
||||
"disabledForeground", Color.class
|
||||
"disabledForeground", Color.class,
|
||||
"arc", int.class
|
||||
);
|
||||
|
||||
assertMapEquals( expected, ui.getStyleableInfos( c ) );
|
||||
|
||||
@@ -355,6 +355,7 @@ public class TestFlatStyleableValue
|
||||
FlatLabelUI ui = (FlatLabelUI) c.getUI();
|
||||
|
||||
testColor( c, ui, "disabledForeground", 0x123456 );
|
||||
testInteger( c, ui, "arc", 123 );
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -412,6 +412,7 @@ public class TestFlatStyling
|
||||
FlatLabelUI ui = (FlatLabelUI) c.getUI();
|
||||
|
||||
ui.applyStyle( c, "disabledForeground: #fff" );
|
||||
ui.applyStyle( c, "arc: 8" );
|
||||
|
||||
// JComponent properties
|
||||
ui.applyStyle( c, "background: #fff" );
|
||||
|
||||
Reference in New Issue
Block a user