Skip to content

Commit

Permalink
Merge branch 'JFormDesigner:main' into classx
Browse files Browse the repository at this point in the history
  • Loading branch information
dar-dev authored May 22, 2024
2 parents b28e94f + 029f273 commit 618a652
Show file tree
Hide file tree
Showing 12 changed files with 206 additions and 41 deletions.
14 changes: 10 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,18 @@ FlatLaf Change Log

## 3.5-SNAPSHOT

#### New features and improvements

- Label: Support painting background with rounded corners. (issue #842)

#### Incompatibilities

- ProgressBar: Log warning (including stack trace) when uninstalling
indeterminate progress bar UI or using JProgressBar.setIndeterminate(false)
not on AWT thread, because this may throw NPE in FlatProgressBarUI.paint().
(issues #841 and #830)
- Panel: Rounded background of panel with rounded corners is now painted even if
panel is not opaque. (issue #840)


## 3.4.1
Expand All @@ -20,7 +26,7 @@ FlatLaf Change Log
- TabbedPane: Fixed swapped back and forward scroll buttons when using
`TabbedPane.scrollButtonsPlacement = trailing` (regression in FlatLaf 3.3).
- Fixed missing window top border on Windows 10 in "full window content" mode.
(issue 809)
(issue #809)
- Extras:
- `FlatSVGIcon` color filters now support linear gradients. (PR #817)
- `FlatSVGIcon`: Use log level `CONFIG` instead of `SEVERE` and allow
Expand Down Expand Up @@ -65,7 +71,7 @@ FlatLaf Change Log
- Fonts: Updated **Inter** to
[v4.0](https://github.com/rsms/inter/releases/tag/v4.0).
- Table: Select all text in cell editor when starting editing using `F2` key.
(issue 652)
(issue #652)

#### Fixed bugs

Expand Down Expand Up @@ -93,7 +99,7 @@ FlatLaf Change Log
#### Fixed bugs

- Button and ToggleButton: Selected buttons did not use explicitly set
foreground color. (issue 756)
foreground color. (issue #756)
- FileChooser: Catch NPE in Java 21 when getting icon for `.exe` files that use
default Windows exe icon. (see
[JDK-8320692](https://bugs.openjdk.org/browse/JDK-8320692))
Expand Down Expand Up @@ -846,7 +852,7 @@ FlatLaf Change Log
- Native window decorations (Windows 10 only):
- Fixed occasional application crash in `flatlaf-windows.dll`. (issue #357)
- When window is initially shown, fill background with window background color
(instead of white), which avoids flickering in dark themes. (issue 339)
(instead of white), which avoids flickering in dark themes. (issue #339)
- When resizing a window at the right/bottom edge, then first fill the new
space with the window background color (instead of black) before the layout
is updated.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -638,14 +638,18 @@ private static Object parseBorder( String value, Function<String, String> resolv
// 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 );
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ protected float getBorderWidth( Component c ) {
}

/**
* Returns the (unscaled) arc diameter of the border.
* Returns the (unscaled) arc diameter of the border corners.
*/
protected int getArc( Component c ) {
return 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -244,6 +247,12 @@ private static boolean needsFontBaseSize( String text ) {
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 )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,14 @@

/**
* 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
*/
Expand All @@ -52,15 +56,28 @@ public FlatLineBorder( Insets insets, Color lineColor, float lineThickness, int
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;
}
Expand All @@ -70,11 +87,16 @@ public void paintBorder( Component c, Graphics g, int x, int y, int width, int h
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();
}
Expand Down
47 changes: 27 additions & 20 deletions flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPanelUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
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;
Expand Down Expand Up @@ -160,32 +161,38 @@ public Object getStyleableValue( JComponent c, String key ) {

@Override
public void update( Graphics g, JComponent c ) {
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() ) {
int width = c.getWidth();
int height = c.getHeight();
int arc = (this.arc >= 0)
? this.arc
: ((c.getBorder() instanceof FlatLineBorder)
? ((FlatLineBorder)c.getBorder()).getArc()
: 0);

// fill background with parent color to avoid garbage in rounded corners
if( arc > 0 )
if( arc > 0 ) {
// fill background with parent color to avoid garbage in rounded corners
FlatUIUtils.paintParentBackground( g, c );
} else {
g.setColor( c.getBackground() );
g.fillRect( 0, 0, c.getWidth(), c.getHeight() );
}
}

// fill rounded rectangle if having rounded corners
if( arc > 0 ) {
g.setColor( c.getBackground() );
if( arc > 0 ) {
// fill rounded rectangle if having rounded corners
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g );
FlatUIUtils.paintComponentBackground( (Graphics2D) g, 0, 0, width, height,
0, UIScale.scale( arc ) );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
} else
g.fillRect( 0, 0, width, height );
Object[] oldRenderingHints = FlatUIUtils.setRenderingHints( g );
FlatUIUtils.paintComponentBackground( (Graphics2D) g, 0, 0, c.getWidth(), c.getHeight(),
0, UIScale.scale( arc ) );
FlatUIUtils.resetRenderingHints( g, oldRenderingHints );
}

paint( g, c );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,12 @@ void parseValueWithJavaType() {
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 ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,8 @@ void label() {
FlatLabelUI ui = (FlatLabelUI) c.getUI();

Map<String, Class<?>> expected = expectedMap(
"disabledForeground", Color.class
"disabledForeground", Color.class,
"arc", int.class
);

assertMapEquals( expected, ui.getStyleableInfos( c ) );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,7 @@ void label() {
FlatLabelUI ui = (FlatLabelUI) c.getUI();

testColor( c, ui, "disabledForeground", 0x123456 );
testInteger( c, ui, "arc", 123 );
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,7 @@ void label() {
FlatLabelUI ui = (FlatLabelUI) c.getUI();

ui.applyStyle( c, "disabledForeground: #fff" );
ui.applyStyle( c, "arc: 8" );

// JComponent properties
ui.applyStyle( c, "background: #fff" );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,14 @@ private void initComponents() {
JLabel label5 = new JLabel();
JPanel panel13 = new JPanel();
JLabel label6 = new JLabel();
JLabel panelLabel = new JLabel();
JPanel panel5 = new JPanel();
JLabel label9 = new JLabel();
JPanel panel4 = new JPanel();
JLabel label8 = new JLabel();
JLabel labelLabel = new JLabel();
JLabel label13 = new JLabel();
JLabel label10 = new JLabel();

//======== this ========
setLayout(new MigLayout(
Expand All @@ -140,7 +148,9 @@ private void initComponents() {
"[]" +
"[]" +
"[]" +
"[100,top]"));
"[100,top]" +
"[50,top]" +
"[]"));

//---- scrollPaneLabel ----
scrollPaneLabel.setText("JScrollPane:");
Expand Down Expand Up @@ -441,7 +451,7 @@ private void initComponents() {

//======== panel10 ========
{
panel10.setBackground(new Color(217, 163, 67));
panel10.setBackground(new Color(0xd9a343));
panel10.setLayout(new BorderLayout());

//---- label1 ----
Expand All @@ -454,7 +464,7 @@ private void initComponents() {

//======== panel11 ========
{
panel11.setBackground(new Color(98, 181, 67));
panel11.setBackground(new Color(0x62b543));
panel11.setLayout(new BorderLayout());

//---- label2 ----
Expand All @@ -474,7 +484,7 @@ private void initComponents() {

//======== panel12 ========
{
panel12.setBackground(new Color(242, 101, 34));
panel12.setBackground(new Color(0xf26522));
panel12.setLayout(new BorderLayout());

//---- label5 ----
Expand All @@ -487,7 +497,7 @@ private void initComponents() {

//======== panel13 ========
{
panel13.setBackground(new Color(64, 182, 224));
panel13.setBackground(new Color(0x40b6e0));
panel13.setLayout(new BorderLayout());

//---- label6 ----
Expand All @@ -502,6 +512,52 @@ private void initComponents() {
}
add(splitPane3, "cell 1 11 4 1,grow");

//---- panelLabel ----
panelLabel.setText("JPanel:");
add(panelLabel, "cell 0 12");

//======== panel5 ========
{
panel5.putClientProperty("FlatLaf.style", "arc: 16; background: darken($Panel.background,5%)");
panel5.setLayout(new BorderLayout());

//---- label9 ----
label9.setText("rounded background");
label9.setHorizontalAlignment(SwingConstants.CENTER);
panel5.add(label9, BorderLayout.CENTER);
}
add(panel5, "cell 1 12 4 1,growy,width 150");

//======== panel4 ========
{
panel4.putClientProperty("FlatLaf.style", "border: 1,1,1,1,@disabledForeground,1,16; background: darken($Panel.background,5%)");
panel4.setLayout(new BorderLayout());

//---- label8 ----
label8.setText("rounded border");
label8.setHorizontalAlignment(SwingConstants.CENTER);
panel4.add(label8, BorderLayout.CENTER);
}
add(panel4, "cell 1 12 4 1,growy,width 150");

//---- labelLabel ----
labelLabel.setText("JLabel:");
add(labelLabel, "cell 0 13");

//---- label13 ----
label13.setText("rounded background");
label13.putClientProperty("FlatLaf.style", "arc: 999; border: 2,10,2,10");
label13.setBackground(new Color(0xb8e4f3));
label13.setForeground(new Color(0x135b76));
add(label13, "cell 1 13 4 1");

//---- label10 ----
label10.setText("rounded border");
label10.putClientProperty("FlatLaf.style", "border: 2,10,2,10,#135b76,1,999");
label10.setBackground(new Color(0xb8e4f3));
label10.setForeground(new Color(0x135b76));
add(label10, "cell 1 13 4 1");

//---- buttonGroup1 ----
ButtonGroup buttonGroup1 = new ButtonGroup();
buttonGroup1.add(toggleButton1);
Expand Down
Loading

0 comments on commit 618a652

Please sign in to comment.