diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7f8dd0bc..48e68bff 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,8 @@ FlatLaf Change Log
- List: Support rounded selection. (PR #547)
- Menus: Support rounded selection. (PR #536)
- Tree: Support rounded selection. (PR #546)
+- Icons: New modern rounded outlined icons for `JFileChooser`, `JOptionPane`,
+ `JPasswordField` and `JTree`. (PR #577)
#### Fixed bugs
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java
index 933f05de..0fac6414 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java
@@ -16,9 +16,12 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Area;
import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
@@ -36,6 +39,8 @@ import com.formdev.flatlaf.ui.FlatUIUtils;
public class FlatCapsLockIcon
extends FlatAbstractIcon
{
+ private Path2D path;
+
public FlatCapsLockIcon() {
super( 16, 16, UIManager.getColor( "PasswordField.capsLockIconColor" ) );
}
@@ -63,16 +68,22 @@ public class FlatCapsLockIcon
*/
- Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- path.append( new RoundRectangle2D.Float( 0, 0, 16, 16, 6, 6 ), false );
- path.append( new Rectangle2D.Float( 5, 11.5f, 6, 2 ), false );
- path.append( FlatUIUtils.createPath( 2,8, 8,2, 14,8, 11,8, 11,10, 5,10, 5,8 ), false );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ BasicStroke stroke = new BasicStroke( 1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND );
+
+ if( path == null ) {
+ path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
+ path.append( new RoundRectangle2D.Float( 0, 0, 16, 16, 6, 6 ), false );
+ path.append( new Area( stroke.createStrokedShape( new Rectangle2D.Float( 5.5f, 11.5f, 5, 2 ) ) ), false );
+ path.append( new Area( stroke.createStrokedShape( FlatUIUtils.createPath(
+ 2.5,7.5, 8,2, 13.5,7.5, 10.5,7.5, 10.5,9.5, 5.5,9.5, 5.5,7.5, 2.5,7.5 ) ) ), false );
+ }
g.fill( path );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java
index 730a7887..28afd50a 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java
@@ -242,7 +242,7 @@ public class FlatCheckBoxIcon
}
protected void paintCheckmark( Component c, Graphics2D g ) {
- Path2D.Float path = new Path2D.Float();
+ Path2D.Float path = new Path2D.Float( Path2D.WIND_NON_ZERO, 3 );
path.moveTo( 4.5f, 7.5f );
path.lineTo( 6.6f, 10f );
path.lineTo( 11.25f, 3.5f );
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java
index 7079572f..30c85d79 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java
@@ -76,7 +76,7 @@ public class FlatCheckBoxMenuItemIcon
}
protected void paintCheckmark( Graphics2D g2 ) {
- Path2D.Float path = new Path2D.Float();
+ Path2D.Float path = new Path2D.Float( Path2D.WIND_NON_ZERO, 3 );
path.moveTo( 4.5f, 7.5f );
path.lineTo( 6.6f, 10f );
path.lineTo( 11.25f, 3.5f );
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java
index 29044e64..58393f8f 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java
@@ -20,7 +20,6 @@ import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
-import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import java.util.Map;
import javax.swing.AbstractButton;
@@ -103,9 +102,11 @@ public class FlatClearIcon
// paint cross
g.setColor( clearIconColor );
- Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- path.append( new Line2D.Float( 5,5, 11,11 ), false );
- path.append( new Line2D.Float( 5,11, 11,5 ), false );
+ Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD, 4 );
+ path.moveTo( 5, 5 );
+ path.lineTo( 11, 11 );
+ path.moveTo( 5, 11 );
+ path.lineTo( 11, 5 );
g.draw( path );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserDetailsViewIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserDetailsViewIcon.java
index 0a208f69..2f1572ed 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserDetailsViewIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserDetailsViewIcon.java
@@ -39,21 +39,25 @@ public class FlatFileChooserDetailsViewIcon
/*
*/
- g.fillRect( 2, 3, 2, 2 );
- g.fillRect( 2, 7, 2, 2 );
- g.fillRect( 2, 11, 2, 2 );
- g.fillRect( 6, 3, 8, 2 );
- g.fillRect( 6, 7, 8, 2 );
- g.fillRect( 6, 11, 8, 2 );
+ g.fillRoundRect( 2, 3, 2, 1, 1, 1 );
+ g.fillRoundRect( 2, 6, 2, 1, 1, 1 );
+ g.fillRoundRect( 2, 9, 2, 1, 1, 1 );
+ g.fillRoundRect( 2, 12, 2, 1, 1, 1 );
+ g.fillRoundRect( 6, 3, 8, 1, 1, 1 );
+ g.fillRoundRect( 6, 6, 8, 1, 1, 1 );
+ g.fillRoundRect( 6, 9, 8, 1, 1, 1 );
+ g.fillRoundRect( 6, 12, 8, 1, 1, 1 );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserHomeFolderIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserHomeFolderIcon.java
index 7a2a80f2..adcea5a6 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserHomeFolderIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserHomeFolderIcon.java
@@ -16,8 +16,10 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatUIUtils;
@@ -39,10 +41,22 @@ public class FlatFileChooserHomeFolderIcon
protected void paintIcon( Component c, Graphics2D g ) {
/*
*/
- g.fill( FlatUIUtils.createPath( 2,8, 8,2, 14,8, 12,8, 12,13, 9,13, 9,10, 7,10, 7,13, 4,13, 4,8 ) );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
+
+ g.draw( FlatUIUtils.createPath( false, 6.5,13, 6.5,9.5, 9.5,9.5, 9.5,13 ) );
+ g.draw( FlatUIUtils.createPath( false, 3.5,6.5,
+ 3.5,12.5, FlatUIUtils.QUAD_TO, 3.5,13.5, 4.5,13.5,
+ 11.5,13.5, FlatUIUtils.QUAD_TO, 12.5,13.5, 12.5,12.5,
+ 12.5,6.5 ) );
+ g.draw( FlatUIUtils.createPath( false, 1.5,8.5, 8,2, 14.5,8.5 ) );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserListViewIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserListViewIcon.java
index 9ae70b09..88870ca6 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserListViewIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserListViewIcon.java
@@ -16,8 +16,11 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.RoundRectangle2D;
import javax.swing.UIManager;
/**
@@ -39,17 +42,20 @@ public class FlatFileChooserListViewIcon
/*
*/
- g.fillRect( 3, 3, 4, 4 );
- g.fillRect( 3, 9, 4, 4 );
- g.fillRect( 9, 9, 4, 4 );
- g.fillRect( 9, 3, 4, 4 );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
+
+ g.draw( new RoundRectangle2D.Float( 2.5f, 2.5f, 4, 4, 2, 2 ) );
+ g.draw( new RoundRectangle2D.Float( 2.5f, 9.5f, 4, 4, 2, 2 ) );
+ g.draw( new RoundRectangle2D.Float( 9.5f, 9.5f, 4, 4, 2, 2 ) );
+ g.draw( new RoundRectangle2D.Float( 9.5f, 2.5f, 4, 4, 2, 2 ) );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserNewFolderIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserNewFolderIcon.java
index a5718b0e..bda7d6de 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserNewFolderIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserNewFolderIcon.java
@@ -16,10 +16,13 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
+import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Line2D;
import javax.swing.UIManager;
-import com.formdev.flatlaf.ui.FlatUIUtils;
/**
* "new folder" icon for {@link javax.swing.JFileChooser}.
@@ -31,6 +34,8 @@ import com.formdev.flatlaf.ui.FlatUIUtils;
public class FlatFileChooserNewFolderIcon
extends FlatAbstractIcon
{
+ private final Color greenColor = UIManager.getColor( "Actions.Green" );
+
public FlatFileChooserNewFolderIcon() {
super( 16, 16, UIManager.getColor( "Actions.Grey" ) );
}
@@ -40,13 +45,20 @@ public class FlatFileChooserNewFolderIcon
/*
*/
- g.fill( FlatUIUtils.createPath( 2,3, 5.5,3, 7,5, 14,5, 14,8, 11,8, 11,10, 9,10, 9,13, 2,13 ) );
- g.fill( FlatUIUtils.createPath( 14,11, 16,11, 16,13, 14,13, 14,15, 12,15, 12,13, 10,13, 10,11, 12,11, 12,9, 14,9, 14,11 ) );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
+
+ g.draw( FlatFileViewDirectoryIcon.createFolderPath() );
+
+ g.setColor( greenColor );
+ g.draw( new Line2D.Float( 5.5f, 9, 10.5f, 9 ) );
+ g.draw( new Line2D.Float( 8, 6.5f, 8, 11.5f ) );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserUpFolderIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserUpFolderIcon.java
index 0e7d7996..8bb4ba4b 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserUpFolderIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileChooserUpFolderIcon.java
@@ -16,9 +16,12 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Line2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatUIUtils;
@@ -44,15 +47,20 @@ public class FlatFileChooserUpFolderIcon
/*
*/
- g.fill( FlatUIUtils.createPath( 2,3, 5.5,3, 7,5, 9,5, 9,9, 13,9, 13,5, 14,5, 14,13, 2,13 ) );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
+
+ g.draw( FlatFileViewDirectoryIcon.createFolderPath() );
g.setColor( blueColor );
- g.fill( FlatUIUtils.createPath( 12,4, 12,8, 10,8, 10,4, 8,4, 11,1, 14,4, 12,4 ) );
+ g.draw( new Line2D.Float( 8, 6.5f, 8, 11.5f ) );
+ g.draw( FlatUIUtils.createPath( false, 5.5,9, 8,6.5, 10.5,9 ) );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewComputerIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewComputerIcon.java
index 0b7120f4..b3376589 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewComputerIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewComputerIcon.java
@@ -16,10 +16,12 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Graphics2D;
-import java.awt.geom.Path2D;
-import java.awt.geom.Rectangle2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Line2D;
+import java.awt.geom.RoundRectangle2D;
import javax.swing.UIManager;
/**
@@ -41,17 +43,18 @@ public class FlatFileViewComputerIcon
/*
*/
- Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- path.append( new Rectangle2D.Float( 2, 3, 12, 8 ), false );
- path.append( new Rectangle2D.Float( 4, 5, 8, 4 ), false );
- g.fill( path );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
- g.fillRect( 2, 12, 12, 2 );
+ g.draw( new RoundRectangle2D.Float( 2.5f, 3.5f, 11, 7, 2, 2 ) );
+ g.drawLine( 8, 11, 8, 12 );
+ g.draw( new Line2D.Float( 4.5f, 12.5f, 11.5f, 12.5f ) );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewDirectoryIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewDirectoryIcon.java
index 85a59156..7cbc24ef 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewDirectoryIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewDirectoryIcon.java
@@ -18,6 +18,8 @@ package com.formdev.flatlaf.icons;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Path2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatUIUtils;
@@ -31,6 +33,8 @@ import com.formdev.flatlaf.ui.FlatUIUtils;
public class FlatFileViewDirectoryIcon
extends FlatAbstractIcon
{
+ private Path2D path;
+
public FlatFileViewDirectoryIcon() {
super( 16, 16, UIManager.getColor( "Objects.Grey" ) );
}
@@ -39,10 +43,32 @@ public class FlatFileViewDirectoryIcon
protected void paintIcon( Component c, Graphics2D g ) {
/*
*/
- g.fill( FlatUIUtils.createPath( 1,2, 6,2, 8,4, 15,4, 15,13, 1,13 ) );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+
+ if( path == null )
+ path = createFolderPath();
+ g.draw( path );
+ }
+
+ static Path2D createFolderPath() {
+ double arc = 1.5;
+ double arc2 = 0.5;
+ return FlatUIUtils.createPath(
+ // bottom-right
+ 14.5,13.5-arc, FlatUIUtils.QUAD_TO, 14.5,13.5, 14.5-arc,13.5,
+ // bottom-left
+ 1.5+arc,13.5, FlatUIUtils.QUAD_TO, 1.5,13.5, 1.5,13.5-arc,
+ // top-left
+ 1.5,2.5+arc, FlatUIUtils.QUAD_TO, 1.5,2.5, 1.5+arc,2.5,
+ // top-mid-left
+ 6.5-arc2,2.5, FlatUIUtils.QUAD_TO, 6.5,2.5, 6.5+arc2,2.5+arc2,
+ // top-mid-right
+ 8.5,4.5,
+ // top-right
+ 14.5-arc,4.5, FlatUIUtils.QUAD_TO, 14.5,4.5, 14.5,4.5+arc );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFileIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFileIcon.java
index 69dac58a..9942238c 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFileIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFileIcon.java
@@ -16,8 +16,11 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Path2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatUIUtils;
@@ -31,6 +34,8 @@ import com.formdev.flatlaf.ui.FlatUIUtils;
public class FlatFileViewFileIcon
extends FlatAbstractIcon
{
+ private Path2D path;
+
public FlatFileViewFileIcon() {
super( 16, 16, UIManager.getColor( "Objects.Grey" ) );
}
@@ -39,14 +44,33 @@ public class FlatFileViewFileIcon
protected void paintIcon( Component c, Graphics2D g ) {
/*
*/
- g.fill( FlatUIUtils.createPath( 8,6, 8,1, 13,1, 13,15, 3,15, 3,6 ) );
- g.fill( FlatUIUtils.createPath( 3,5, 7,5, 7,1 ) );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
+
+ if( path == null ) {
+ double arc = 1.5;
+ path = FlatUIUtils.createPath( false,
+ // top-left
+ 2.5,1.5+arc, FlatUIUtils.QUAD_TO, 2.5,1.5, 2.5+arc,1.5,
+ // top-right
+ 8.8,1.5, 13.5,6.2,
+ // bottom-right
+ 13.5,14.5-arc, FlatUIUtils.QUAD_TO, 13.5,14.5, 13.5-arc,14.5,
+ // bottom-left
+ 2.5+arc,14.5, FlatUIUtils.QUAD_TO, 2.5,14.5, 2.5,14.5-arc,
+ FlatUIUtils.CLOSE_PATH,
+
+ FlatUIUtils.MOVE_TO, 8.5,2,
+ 8.5,6.5-arc, FlatUIUtils.QUAD_TO, 8.5,6.5, 8.5+arc,6.5,
+ 13,6.5 );
+ }
+ g.draw( path );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFloppyDriveIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFloppyDriveIcon.java
index 94c58cf6..2203c314 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFloppyDriveIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewFloppyDriveIcon.java
@@ -16,9 +16,10 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Graphics2D;
-import java.awt.geom.Path2D;
+import java.awt.RenderingHints;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatUIUtils;
@@ -40,18 +41,22 @@ public class FlatFileViewFloppyDriveIcon
protected void paintIcon( Component c, Graphics2D g ) {
/*
*/
- Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- path.append( FlatUIUtils.createPath( 11,14, 11,11, 5,11, 5,14, 2,14, 2,2, 14,2, 14,14, 11,14 ), false );
- path.append( FlatUIUtils.createPath( 4,4, 4,8, 12,8, 12,4, 4,4 ), false );
- g.fill( path );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
- g.fillRect( 6, 12, 4, 2 );
+ g.draw( FlatUIUtils.createPath( 3.5,2.5, 11.5,2.5, 11.5,2.5, 13.5,4.5,
+ 13.5,12.5, FlatUIUtils.QUAD_TO, 13.5,13.5, 12.5,13.5,
+ 3.5,13.5, FlatUIUtils.QUAD_TO, 2.5,13.5, 2.5,12.5,
+ 2.5,3.5, FlatUIUtils.QUAD_TO, 2.5,2.5, 3.5,2.5 ) );
+ g.draw( FlatUIUtils.createPath( false, 4.5,13, 4.5,9.5, 11.5,9.5, 11.5,13 ) );
+ g.draw( FlatUIUtils.createPath( false, 5.5,3, 5.5,5.5, 10.5,5.5, 10.5,3 ) );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewHardDriveIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewHardDriveIcon.java
index 8f635ce9..121aa4bf 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewHardDriveIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatFileViewHardDriveIcon.java
@@ -16,10 +16,12 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Graphics2D;
-import java.awt.geom.Path2D;
-import java.awt.geom.Rectangle2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.RoundRectangle2D;
import javax.swing.UIManager;
/**
@@ -40,14 +42,19 @@ public class FlatFileViewHardDriveIcon
protected void paintIcon( Component c, Graphics2D g ) {
/*
*/
- Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- path.append( new Rectangle2D.Float( 2, 6, 12, 4 ), false );
- path.append( new Rectangle2D.Float( 12, 8, 1, 1 ), false );
- path.append( new Rectangle2D.Float( 10, 8, 1, 1 ), false );
- g.fill( path );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
+
+ g.draw( new RoundRectangle2D.Float( 2.5f, 5.5f, 11, 5, 2, 2 ) );
+ g.fill( new Ellipse2D.Float( 10.8f, 7.8f, 1.4f, 1.4f ) );
+ g.fill( new Ellipse2D.Float( 8.8f, 7.8f, 1.4f, 1.4f ) );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java
index d415356f..2ef479e6 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java
@@ -17,9 +17,11 @@
package com.formdev.flatlaf.icons;
import static com.formdev.flatlaf.util.UIScale.*;
+import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
import java.util.Map;
@@ -96,7 +98,8 @@ public class FlatHelpButtonIcon
-
+
+
*/
@@ -147,22 +150,19 @@ public class FlatHelpButtonIcon
g2.fill( new Ellipse2D.Float( xy, xy, wh, wh ) );
// paint question mark
- Path2D q = new Path2D.Float();
- q.moveTo( 11, 5 );
- q.curveTo( 8.8,5, 7,6.8, 7,9 );
- q.lineTo( 9, 9 );
- q.curveTo( 9,7.9, 9.9,7, 11,7 );
- q.curveTo( 12.1,7, 13,7.9, 13,9 );
- q.curveTo( 13,11, 10,10.75, 10,14 );
- q.lineTo( 12, 14 );
- q.curveTo( 12,11.75, 15,11.5, 15,9 );
- q.curveTo( 15,6.8, 13.2,5, 11,5 );
- q.closePath();
+ Path2D q = new Path2D.Float( Path2D.WIND_NON_ZERO, 10 );
+ q.moveTo( 8,8.5 );
+ q.curveTo( 8.25,7, 9.66585007,6, 11,6 );
+ q.curveTo( 12.5,6, 14,7, 14,8.5 );
+ q.curveTo( 14,10.5, 11,11, 11,13 );
+
+ g2.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g2.setStroke( new BasicStroke( 2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
g2.translate( focusWidth, focusWidth );
g2.setColor( enabled ? questionMarkColor : disabledQuestionMarkColor );
- g2.fill( q );
- g2.fillRect( 10, 15, 2, 2 );
+ g2.draw( q );
+ g2.fill( new Ellipse2D.Float( 9.8f, 14.8f, 2.4f, 2.4f ) );
}
@Override
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java
index db6526fd..c4f002f8 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java
@@ -20,7 +20,6 @@ import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
-import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatButtonUI;
@@ -58,9 +57,11 @@ public class FlatInternalFrameCloseIcon
float my = height / 2;
float r = 3.25f;
- Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- path.append( new Line2D.Float( mx - r, my - r, mx + r, my + r ), false );
- path.append( new Line2D.Float( mx - r, my + r, mx + r, my - r ), false );
+ Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD, 4 );
+ path.moveTo( mx - r, my - r );
+ path.lineTo( mx + r, my + r );
+ path.moveTo( mx - r, my + r );
+ path.lineTo( mx + r, my - r );
g.setStroke( new BasicStroke( 1f ) );
g.draw( path );
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneErrorIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneErrorIcon.java
index 60c09778..5ff20b42 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneErrorIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneErrorIcon.java
@@ -19,7 +19,7 @@ package com.formdev.flatlaf.icons;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
-import java.awt.geom.Rectangle2D;
+import java.awt.geom.RoundRectangle2D;
/**
* "Error" icon for {@link javax.swing.JOptionPane}.
@@ -40,8 +40,8 @@ public class FlatOptionPaneErrorIcon
*/
@@ -54,8 +54,8 @@ public class FlatOptionPaneErrorIcon
@Override
protected Shape createInside() {
Path2D inside = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- inside.append( new Rectangle2D.Float( 14, 7, 4, 11 ), false );
- inside.append( new Rectangle2D.Float( 14, 21, 4, 4 ), false );
+ inside.append( new RoundRectangle2D.Float( 14, 7, 4, 12, 4, 4 ), false );
+ inside.append( new Ellipse2D.Float( 14, 21, 4, 4 ), false );
return inside;
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneInformationIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneInformationIcon.java
index 4ecee661..452e6fe8 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneInformationIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneInformationIcon.java
@@ -19,7 +19,7 @@ package com.formdev.flatlaf.icons;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
-import java.awt.geom.Rectangle2D;
+import java.awt.geom.RoundRectangle2D;
/**
* "Information" icon for {@link javax.swing.JOptionPane}.
@@ -40,8 +40,8 @@ public class FlatOptionPaneInformationIcon
*/
@@ -54,8 +54,8 @@ public class FlatOptionPaneInformationIcon
@Override
protected Shape createInside() {
Path2D inside = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- inside.append( new Rectangle2D.Float( 14, 14, 4, 11 ), false );
- inside.append( new Rectangle2D.Float( 14, 7, 4, 4 ), false );
+ inside.append( new RoundRectangle2D.Float( 14, 13, 4, 12, 4, 4 ), false );
+ inside.append( new Ellipse2D.Float( 14, 7, 4, 4 ), false );
return inside;
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneQuestionIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneQuestionIcon.java
index 0f7e14bd..85495e28 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneQuestionIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneQuestionIcon.java
@@ -16,10 +16,10 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
-import java.awt.geom.Rectangle2D;
/**
* "Question" icon for {@link javax.swing.JOptionPane}.
@@ -40,8 +40,8 @@ public class FlatOptionPaneQuestionIcon
*/
@@ -53,21 +53,17 @@ public class FlatOptionPaneQuestionIcon
@Override
protected Shape createInside() {
- Path2D q = new Path2D.Float();
- q.moveTo( 14, 20 );
- q.lineTo( 18, 20 );
- q.curveTo( 18, 16, 23, 16, 23, 12 );
- q.curveTo( 23, 8, 20, 6, 16, 6 );
- q.curveTo( 12, 6, 9, 8, 9, 12 );
- q.curveTo( 9, 12, 13, 12, 13, 12 );
- q.curveTo( 13, 10, 14, 9, 16, 9 );
- q.curveTo( 18, 9, 19, 10, 19, 12 );
- q.curveTo( 19, 15, 14, 15, 14, 20 );
- q.closePath();
+ Path2D q = new Path2D.Float( Path2D.WIND_NON_ZERO, 10 );
+ q.moveTo( 11.5,11.75 );
+ q.curveTo( 11.75,9.5, 13.75,8, 16,8 );
+ q.curveTo( 18.25,8, 20.5,9.5, 20.5,11.75 );
+ q.curveTo( 20.5,14.75, 16,15.5, 16,19 );
+
+ BasicStroke stroke = new BasicStroke( 3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER );
Path2D inside = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- inside.append( new Rectangle2D.Float( 14, 22, 4, 4 ), false );
- inside.append( q, false );
+ inside.append( new Ellipse2D.Float( 14.3f, 22.3f, 3.4f, 3.4f ), false );
+ inside.append( stroke.createStrokedShape( q ), false );
return inside;
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneWarningIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneWarningIcon.java
index edac6586..fa2eaa88 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneWarningIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatOptionPaneWarningIcon.java
@@ -17,8 +17,9 @@
package com.formdev.flatlaf.icons;
import java.awt.Shape;
+import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
-import java.awt.geom.Rectangle2D;
+import java.awt.geom.RoundRectangle2D;
import com.formdev.flatlaf.ui.FlatUIUtils;
/**
@@ -39,23 +40,24 @@ public class FlatOptionPaneWarningIcon
/*
*/
@Override
protected Shape createOutside() {
- return FlatUIUtils.createPath( 16,2, 31,28, 1,28 );
+ return FlatUIUtils.createRoundTrianglePath( 16,0, 32,28, 0,28, 4 );
+
}
@Override
protected Shape createInside() {
Path2D inside = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- inside.append( new Rectangle2D.Float( 14, 10, 4, 8 ), false );
- inside.append( new Rectangle2D.Float( 14, 21, 4, 4 ), false );
+ inside.append( new RoundRectangle2D.Float( 14, 8, 4, 11, 4, 4 ), false );
+ inside.append( new Ellipse2D.Float( 14, 21, 4, 4 ), false );
return inside;
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java
index 007e9718..bcaf2bc1 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java
@@ -46,6 +46,7 @@ public class FlatSearchIcon
@Styleable protected Color searchIconPressedColor = UIManager.getColor( "SearchField.searchIconPressedColor" );
private final boolean ignoreButtonState;
+ private Area area;
public FlatSearchIcon() {
this( false );
@@ -89,9 +90,11 @@ public class FlatSearchIcon
null, searchIconHoverColor, searchIconPressedColor ) );
// paint magnifier
- Area area = new Area( new Ellipse2D.Float( 2, 2, 10, 10 ) );
- area.subtract( new Area( new Ellipse2D.Float( 3, 3, 8, 8 ) ) );
- area.add( new Area( FlatUIUtils.createPath( 10.813,9.75, 14,12.938, 12.938,14, 9.75,10.813 ) ) );
+ if( area == null ) {
+ area = new Area( new Ellipse2D.Float( 2, 2, 10, 10 ) );
+ area.subtract( new Area( new Ellipse2D.Float( 3, 3, 8, 8 ) ) );
+ area.add( new Area( FlatUIUtils.createPath( 10.813,9.75, 14,12.938, 12.938,14, 9.75,10.813 ) ) );
+ }
g.fill( area );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java
index 6f6220d6..ef2df55a 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java
@@ -21,7 +21,6 @@ import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
-import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import java.util.Map;
import javax.swing.UIManager;
@@ -100,9 +99,11 @@ public class FlatTabbedPaneCloseIcon
float r = ((bg != null) ? closeCrossFilledSize : closeCrossPlainSize) / 2;
// paint cross
- Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- path.append( new Line2D.Float( mx - r, my - r, mx + r, my + r ), false );
- path.append( new Line2D.Float( mx - r, my + r, mx + r, my - r ), false );
+ Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD, 4 );
+ path.moveTo( mx - r, my - r );
+ path.lineTo( mx + r, my + r );
+ path.moveTo( mx - r, my + r );
+ path.lineTo( mx + r, my - r );
g.setStroke( new BasicStroke( closeCrossLineWidth ) );
g.draw( path );
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java
index c149bb9c..72ae473b 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java
@@ -18,8 +18,9 @@ package com.formdev.flatlaf.icons;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Path2D;
import javax.swing.UIManager;
-import com.formdev.flatlaf.ui.FlatUIUtils;
/**
* "closed" icon for {@link javax.swing.JTree} used by {@link javax.swing.tree.DefaultTreeCellRenderer}.
@@ -31,6 +32,8 @@ import com.formdev.flatlaf.ui.FlatUIUtils;
public class FlatTreeClosedIcon
extends FlatAbstractIcon
{
+ private Path2D path;
+
public FlatTreeClosedIcon() {
super( 16, 16, UIManager.getColor( "Tree.icon.closedColor" ) );
}
@@ -41,10 +44,14 @@ public class FlatTreeClosedIcon
/*
*/
- g.fill( FlatUIUtils.createPath( 1,2, 6,2, 8,4, 15,4, 15,13, 1,13 ) );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+
+ if( path == null )
+ path = FlatFileViewDirectoryIcon.createFolderPath();
+ g.draw( path );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java
index 9d76c9c4..6c3d4727 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java
@@ -16,9 +16,11 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.geom.Path2D;
import java.util.function.Function;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
@@ -39,6 +41,7 @@ public class FlatTreeCollapsedIcon
extends FlatAbstractIcon
{
private final boolean chevron;
+ private Path2D path;
public FlatTreeCollapsedIcon() {
this( UIManager.getColor( "Tree.icon.collapsedColor" ) );
@@ -59,10 +62,15 @@ public class FlatTreeCollapsedIcon
if( chevron ) {
// chevron arrow
- g.fill( FlatUIUtils.createPath( 3,1, 3,2.5, 6,5.5, 3,8.5, 3,10, 4.5,10, 9,5.5, 4.5,1 ) );
+ g.setStroke( new BasicStroke( 1f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER ) );
+ if( path == null )
+ path = FlatUIUtils.createPath( false, 3.5,1.5, 7.5,5.5, 3.5,9.5 );
+ g.draw( path );
} else {
// triangle arrow
- g.fill( FlatUIUtils.createPath( 2,1, 2,10, 10,5.5 ) );
+ if( path == null )
+ path = FlatUIUtils.createPath( 2,1, 2,10, 10,5.5 );
+ g.fill( path );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java
index b85ccbb1..397fa7cf 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java
@@ -16,10 +16,14 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Line2D;
+import java.awt.geom.RoundRectangle2D;
import javax.swing.UIManager;
-import com.formdev.flatlaf.ui.FlatUIUtils;
+import com.formdev.flatlaf.util.ColorFunctions;
/**
* "leaf" icon for {@link javax.swing.JTree} used by {@link javax.swing.tree.DefaultTreeCellRenderer}.
@@ -42,13 +46,22 @@ public class FlatTreeLeafIcon
/*
*/
- g.fill( FlatUIUtils.createPath( 8,6, 8,1, 13,1, 13,15, 3,15, 3,6 ) );
- g.fill( FlatUIUtils.createPath( 3,5, 7,5, 7,1 ) );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND ) );
+
+ g.draw( new RoundRectangle2D.Float( 2.5f, 1.5f, 11, 13, 3, 3 ) );
+
+ g.setColor( ColorFunctions.fade( g.getColor(), 0.6f ) );
+ g.draw( new Line2D.Float( 5.5f, 5.5f, 10.5f, 5.5f ) );
+ g.draw( new Line2D.Float( 5.5f, 8, 10.5f, 8 ) );
+ g.draw( new Line2D.Float( 5.5f, 10.5f, 10.5f, 10.5f ) );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java
index e2ca5213..bce89b95 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java
@@ -16,8 +16,11 @@
package com.formdev.flatlaf.icons;
+import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.Path2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatUIUtils;
@@ -31,6 +34,8 @@ import com.formdev.flatlaf.ui.FlatUIUtils;
public class FlatTreeOpenIcon
extends FlatAbstractIcon
{
+ private Path2D path;
+
public FlatTreeOpenIcon() {
super( 16, 16, UIManager.getColor( "Tree.icon.openColor" ) );
}
@@ -41,14 +46,38 @@ public class FlatTreeOpenIcon
/*
*/
- g.fill( FlatUIUtils.createPath( 1,2, 6,2, 8,4, 14,4, 14,6, 3.5,6, 1,11 ) );
- g.fill( FlatUIUtils.createPath( 4,7, 16,7, 13,13, 1,13 ) );
+ g.setRenderingHint( RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE );
+ g.setStroke( new BasicStroke( 1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER ) );
+
+ if( path == null ) {
+ double arc = 1.5;
+ double arc2 = 0.5;
+ path = FlatUIUtils.createPath( false,
+ // bottom-left of opend part
+ 2,13.5,
+ // top-left of opend part
+ FlatUIUtils.ROUNDED, 4.5,7.5, arc,
+ // top-right of opend part
+ FlatUIUtils.ROUNDED, 15.5,7.5, arc2,
+
+ // bottom-right
+ FlatUIUtils.ROUNDED, 13,13.5, arc,
+ // bottom-left
+ 1.5+arc,13.5, FlatUIUtils.QUAD_TO, 1.5,13.5, 1.5,13.5-arc,
+ // top-left
+ 1.5,2.5+arc, FlatUIUtils.QUAD_TO, 1.5,2.5, 1.5+arc,2.5,
+ // top-mid-left
+ 6.5-arc2,2.5, FlatUIUtils.QUAD_TO, 6.5,2.5, 6.5+arc2,2.5+arc2,
+ // top-mid-right
+ 8.5,4.5,
+ // top-right
+ 13.5-arc,4.5, FlatUIUtils.QUAD_TO, 13.5,4.5, 13.5,4.5+arc,
+ 13.5,6.5 );
+ }
+ g.draw( path );
}
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowCloseIcon.java
index d20ef27d..ef6e3b1b 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowCloseIcon.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowCloseIcon.java
@@ -20,7 +20,6 @@ import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
-import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import javax.swing.UIManager;
import com.formdev.flatlaf.ui.FlatButtonUI;
@@ -57,9 +56,11 @@ public class FlatWindowCloseIcon
int iy2 = iy + iwh - 1;
float thickness = SystemInfo.isWindows_11_orLater ? (float) scaleFactor : (int) scaleFactor;
- Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD );
- path.append( new Line2D.Float( ix, iy, ix2, iy2 ), false );
- path.append( new Line2D.Float( ix, iy2, ix2, iy ), false );
+ Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD, 4 );
+ path.moveTo( ix, iy );
+ path.lineTo( ix2, iy2 );
+ path.moveTo( ix, iy2 );
+ path.lineTo( ix2, iy );
g.setStroke( new BasicStroke( thickness ) );
g.draw( path );
}
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java
index e7bb62b7..790b5693 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java
@@ -531,7 +531,7 @@ debug*/
public static Shape createDirectionalThumbShape( float x, float y, float w, float h, float arc ) {
float wh = w / 2;
- Path2D path = new Path2D.Float();
+ Path2D path = new Path2D.Float( Path2D.WIND_NON_ZERO, 9 );
path.moveTo( x + wh, y + h );
path.lineTo( x, y + (h - wh) );
path.lineTo( x, y + arc );
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java
index c21f6b71..05e2e870 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java
@@ -39,6 +39,7 @@ import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
+import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.util.IdentityHashMap;
@@ -848,7 +849,7 @@ public class FlatUIUtils
double ciBottomLeft = arcBottomLeft * ci;
double ciBottomRight = arcBottomRight * ci;
- Path2D rect = new Path2D.Float();
+ Path2D rect = new Path2D.Float( Path2D.WIND_NON_ZERO, 16 );
rect.moveTo( x2 - arcTopRight, y );
rect.curveTo( x2 - ciTopRight, y,
x2, y + ciTopRight,
@@ -870,6 +871,27 @@ public class FlatUIUtils
return rect;
}
+ /**
+ * Creates a rounded triangle shape for the given points and arc radius.
+ *
+ * @since 3
+ */
+ public static Shape createRoundTrianglePath( float x1, float y1, float x2, float y2,
+ float x3, float y3, float arc )
+ {
+ double averageSideLength = (distance( x1,y1, x2,y2 ) + distance( x2,y2, x3,y3 ) + distance( x3,y3, x1,y1 )) / 3;
+ double t1 = (1 / averageSideLength) * arc;
+ double t2 = 1 - t1;
+
+ return createPath(
+ lerp( x3, x1, t2 ), lerp( y3, y1, t2 ),
+ QUAD_TO, x1, y1, lerp( x1, x2, t1 ), lerp( y1, y2, t1 ),
+ lerp( x1, x2, t2 ), lerp( y1, y2, t2 ),
+ QUAD_TO, x2, y2, lerp( x2, x3, t1 ), lerp( y2, y3, t1 ),
+ lerp( x2, x3, t2 ), lerp( y2, y3, t2 ),
+ QUAD_TO, x3, y3, lerp( x3, x1, t1 ), lerp( y3, y1, t1 ) );
+ }
+
/**
* Paints a chevron or triangle arrow in the center of the given rectangle.
*
@@ -979,6 +1001,12 @@ debug*/
}
debug*/
+ /** @since 3 */ public static final double MOVE_TO = -1_000_000_000_001.;
+ /** @since 3 */ public static final double QUAD_TO = -1_000_000_000_002.;
+ /** @since 3 */ public static final double CURVE_TO = -1_000_000_000_003.;
+ /** @since 3 */ public static final double ROUNDED = -1_000_000_000_004.;
+ /** @since 3 */ public static final double CLOSE_PATH = -1_000_000_000_005.;
+
/**
* Creates a closed path for the given points.
*/
@@ -990,15 +1018,88 @@ debug*/
* Creates an open or closed path for the given points.
*/
public static Path2D createPath( boolean close, double... points ) {
- Path2D path = new Path2D.Float();
+ Path2D path = new Path2D.Float( Path2D.WIND_NON_ZERO, points.length / 2 + (close ? 1 : 0) );
path.moveTo( points[0], points[1] );
- for( int i = 2; i < points.length; i += 2 )
- path.lineTo( points[i], points[i + 1] );
+ for( int i = 2; i < points.length; ) {
+ double p = points[i];
+ if( p == MOVE_TO ) {
+ // move pointer to
+ // params: x, y
+ path.moveTo( points[i + 1], points[i + 2] );
+ i += 3;
+ } else if( p == QUAD_TO ) {
+ // add quadratic curve
+ // params: x1, y1, x2, y2
+ path.quadTo( points[i + 1], points[i + 2], points[i + 3], points[i + 4] );
+ i += 5;
+ } else if( p == CURVE_TO ) {
+ // add bezier curve
+ // params: x1, y1, x2, y2, x3, y3
+ path.curveTo( points[i + 1], points[i + 2], points[i + 3], points[i + 4], points[i + 5], points[i + 6] );
+ i += 7;
+ } else if( p == ROUNDED ) {
+ // add rounded corner
+ // params: x, y, arc
+ double x = points[i + 1];
+ double y = points[i + 2];
+ double arc = points[i + 3];
+
+ // index of next point
+ int ip2 = i + 4;
+ if( points[ip2] == QUAD_TO || points[ip2] == ROUNDED )
+ ip2++;
+
+ // previous and next points
+ Point2D p1 = path.getCurrentPoint();
+ double x1 = p1.getX();
+ double y1 = p1.getY();
+ double x2 = points[ip2];
+ double y2 = points[ip2 + 1];
+
+ double d1 = distance( x, y, x1, y1 );
+ double d2 = distance( x, y, x2, y2 );
+ double t1 = 1 - ((1 / d1) * arc);
+ double t2 = (1 / d2) * arc;
+
+ path.lineTo( lerp( x1, x, t1 ), lerp( y1, y, t1 ) );
+ path.quadTo( x, y, lerp( x, x2, t2 ), lerp( y, y2, t2 ) );
+
+ i += 4;
+ } else if( p == CLOSE_PATH ) {
+ // close path
+ // params: -
+ path.closePath();
+ i += 1;
+ } else {
+ // add line to
+ // params: x, y
+ path.lineTo( p, points[i + 1] );
+ i += 2;
+ }
+ }
if( close )
path.closePath();
return path;
}
+ /**
+ * Calculates linear interpolation between two values.
+ *
+ * https://en.wikipedia.org/wiki/Linear_interpolation#Programming_language_support
+ */
+ private static double lerp( double v1, double v2, double t ) {
+ return (v1 * (1 - t)) + (v2 * t);
+ }
+
+ /**
+ * Calculates the distance between two points.
+ */
+ private static double distance( double x1, double y1, double x2, double y2 ) {
+ double dx = x2 - x1;
+ double dy = y2 - y1;
+ return Math.sqrt( (dx * dx) + (dy * dy) );
+ }
+
/**
* Draws the given shape with disabled stroke normalization.
* The x/y coordinates of the shape are translated by a half pixel.
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/ColorFunctions.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/ColorFunctions.java
index 913cf6a1..fc5f58d2 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/ColorFunctions.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/ColorFunctions.java
@@ -105,6 +105,19 @@ public class ColorFunctions
return HSLColor.toRGB( hsl[0], hsl[1], hsl[2], alpha );
}
+ /**
+ * Set the opacity (alpha) of a color.
+ *
+ * @param color base color
+ * @param amount the amount (in range 0-1) of the new opacity
+ * @return new color
+ * @since 3
+ */
+ public static Color fade( Color color, float amount ) {
+ int newAlpha = Math.round( 255 * amount );
+ return new Color( (color.getRGB() & 0xffffff) | (newAlpha << 24), true );
+ }
+
/**
* Returns a color that is a mixture of two colors.
*
diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/util/TestColorFunctions.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/util/TestColorFunctions.java
index 960ff57a..2c81bfce 100644
--- a/flatlaf-core/src/test/java/com/formdev/flatlaf/util/TestColorFunctions.java
+++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/util/TestColorFunctions.java
@@ -27,6 +27,7 @@ public class TestColorFunctions
{
@Test
void colorFunctions() {
+ // lighten, darken
assertEquals( new Color( 0xff6666 ), ColorFunctions.lighten( Color.red, 0.2f ) );
assertEquals( new Color( 0x990000 ), ColorFunctions.darken( Color.red, 0.2f ) );
@@ -38,6 +39,11 @@ public class TestColorFunctions
assertEquals( new Color( 0xffaa00 ), ColorFunctions.spin( Color.red,40 ) );
assertEquals( new Color( 0xff00aa ), ColorFunctions.spin( Color.red,-40 ) );
+ // fade
+ assertEquals( new Color( 0x33ff0000, true ), ColorFunctions.fade( Color.red, 0.2f ) );
+ assertEquals( new Color( 0xccff0000, true ), ColorFunctions.fade( Color.red, 0.8f ) );
+ assertEquals( new Color( 0xccff0000, true ), ColorFunctions.fade( new Color( 0x10ff0000, true ), 0.8f ) );
+
// mix
assertEquals( new Color( 0x1ae600 ), ColorFunctions.mix( Color.red, Color.green, 0.1f ) );
assertEquals( new Color( 0x40bf00 ), ColorFunctions.mix( Color.red, Color.green, 0.25f ) );
diff --git a/flatlaf-core/svg/CapsLockIcon.svg b/flatlaf-core/svg/CapsLockIcon.svg
index a81e218e..b58b8922 100644
--- a/flatlaf-core/svg/CapsLockIcon.svg
+++ b/flatlaf-core/svg/CapsLockIcon.svg
@@ -1,7 +1,7 @@
diff --git a/flatlaf-core/svg/FileChooserDetailsViewIcon.svg b/flatlaf-core/svg/FileChooserDetailsViewIcon.svg
index dda96e57..4f636e2e 100644
--- a/flatlaf-core/svg/FileChooserDetailsViewIcon.svg
+++ b/flatlaf-core/svg/FileChooserDetailsViewIcon.svg
@@ -1,10 +1,12 @@
diff --git a/flatlaf-core/svg/FileChooserHomeFolderIcon.svg b/flatlaf-core/svg/FileChooserHomeFolderIcon.svg
index e2599d40..46492757 100644
--- a/flatlaf-core/svg/FileChooserHomeFolderIcon.svg
+++ b/flatlaf-core/svg/FileChooserHomeFolderIcon.svg
@@ -1,3 +1,7 @@
diff --git a/flatlaf-core/svg/FileChooserListViewIcon.svg b/flatlaf-core/svg/FileChooserListViewIcon.svg
index 069275e1..f073e1e1 100644
--- a/flatlaf-core/svg/FileChooserListViewIcon.svg
+++ b/flatlaf-core/svg/FileChooserListViewIcon.svg
@@ -1,8 +1,8 @@
diff --git a/flatlaf-core/svg/FileChooserNewFolderIcon.svg b/flatlaf-core/svg/FileChooserNewFolderIcon.svg
index 59c59a83..ce472205 100644
--- a/flatlaf-core/svg/FileChooserNewFolderIcon.svg
+++ b/flatlaf-core/svg/FileChooserNewFolderIcon.svg
@@ -1,6 +1,7 @@
diff --git a/flatlaf-core/svg/FileChooserUpFolderIcon.svg b/flatlaf-core/svg/FileChooserUpFolderIcon.svg
index f5a072ef..fa6c07d6 100644
--- a/flatlaf-core/svg/FileChooserUpFolderIcon.svg
+++ b/flatlaf-core/svg/FileChooserUpFolderIcon.svg
@@ -1,6 +1,7 @@
diff --git a/flatlaf-core/svg/FileViewComputerIcon.svg b/flatlaf-core/svg/FileViewComputerIcon.svg
index 910f29f3..280b3303 100644
--- a/flatlaf-core/svg/FileViewComputerIcon.svg
+++ b/flatlaf-core/svg/FileViewComputerIcon.svg
@@ -1,6 +1,7 @@
diff --git a/flatlaf-core/svg/FileViewDirectoryIcon.svg b/flatlaf-core/svg/FileViewDirectoryIcon.svg
index d01b4331..111c03ee 100644
--- a/flatlaf-core/svg/FileViewDirectoryIcon.svg
+++ b/flatlaf-core/svg/FileViewDirectoryIcon.svg
@@ -1,3 +1,3 @@
diff --git a/flatlaf-core/svg/FileViewFileIcon.svg b/flatlaf-core/svg/FileViewFileIcon.svg
index 81f06450..d8e8e328 100644
--- a/flatlaf-core/svg/FileViewFileIcon.svg
+++ b/flatlaf-core/svg/FileViewFileIcon.svg
@@ -1,6 +1,6 @@
diff --git a/flatlaf-core/svg/FileViewFloppyDriveIcon.svg b/flatlaf-core/svg/FileViewFloppyDriveIcon.svg
index e07ed776..1a348053 100644
--- a/flatlaf-core/svg/FileViewFloppyDriveIcon.svg
+++ b/flatlaf-core/svg/FileViewFloppyDriveIcon.svg
@@ -1,6 +1,7 @@
diff --git a/flatlaf-core/svg/FileViewHardDriveIcon.svg b/flatlaf-core/svg/FileViewHardDriveIcon.svg
index 7dce2914..f8bd1d48 100644
--- a/flatlaf-core/svg/FileViewHardDriveIcon.svg
+++ b/flatlaf-core/svg/FileViewHardDriveIcon.svg
@@ -1,3 +1,7 @@
diff --git a/flatlaf-core/svg/FlatLaf Icons.sketch b/flatlaf-core/svg/FlatLaf Icons.sketch
index acca1c77..53678d63 100644
Binary files a/flatlaf-core/svg/FlatLaf Icons.sketch and b/flatlaf-core/svg/FlatLaf Icons.sketch differ
diff --git a/flatlaf-core/svg/FlatLaf.svg b/flatlaf-core/svg/FlatLaf.svg
index 41c42936..0c3d1462 100644
--- a/flatlaf-core/svg/FlatLaf.svg
+++ b/flatlaf-core/svg/FlatLaf.svg
@@ -6,7 +6,7 @@
-
+
diff --git a/flatlaf-core/svg/HelpButtonIcon.svg b/flatlaf-core/svg/HelpButtonIcon.svg
index c1b89884..6faf7cff 100644
--- a/flatlaf-core/svg/HelpButtonIcon.svg
+++ b/flatlaf-core/svg/HelpButtonIcon.svg
@@ -2,6 +2,7 @@
-
+
+
diff --git a/flatlaf-core/svg/OptionPaneErrorIcon.svg b/flatlaf-core/svg/OptionPaneErrorIcon.svg
index 500286c3..83356238 100644
--- a/flatlaf-core/svg/OptionPaneErrorIcon.svg
+++ b/flatlaf-core/svg/OptionPaneErrorIcon.svg
@@ -1,7 +1,7 @@
diff --git a/flatlaf-core/svg/OptionPaneInformationIcon.svg b/flatlaf-core/svg/OptionPaneInformationIcon.svg
index f418a778..a4d71164 100644
--- a/flatlaf-core/svg/OptionPaneInformationIcon.svg
+++ b/flatlaf-core/svg/OptionPaneInformationIcon.svg
@@ -1,7 +1,7 @@
diff --git a/flatlaf-core/svg/OptionPaneQuestionIcon.svg b/flatlaf-core/svg/OptionPaneQuestionIcon.svg
index a4de4ac0..3960c088 100644
--- a/flatlaf-core/svg/OptionPaneQuestionIcon.svg
+++ b/flatlaf-core/svg/OptionPaneQuestionIcon.svg
@@ -1,7 +1,7 @@
diff --git a/flatlaf-core/svg/OptionPaneWarningIcon.svg b/flatlaf-core/svg/OptionPaneWarningIcon.svg
index 30a91c7a..eda21225 100644
--- a/flatlaf-core/svg/OptionPaneWarningIcon.svg
+++ b/flatlaf-core/svg/OptionPaneWarningIcon.svg
@@ -1,7 +1,7 @@
diff --git a/flatlaf-core/svg/TreeClosedIcon.svg b/flatlaf-core/svg/TreeClosedIcon.svg
index d01b4331..111c03ee 100644
--- a/flatlaf-core/svg/TreeClosedIcon.svg
+++ b/flatlaf-core/svg/TreeClosedIcon.svg
@@ -1,3 +1,3 @@
diff --git a/flatlaf-core/svg/TreeCollapsedIcon-chevron.svg b/flatlaf-core/svg/TreeCollapsedIcon-chevron.svg
index ba0218ff..e4c50a2a 100644
--- a/flatlaf-core/svg/TreeCollapsedIcon-chevron.svg
+++ b/flatlaf-core/svg/TreeCollapsedIcon-chevron.svg
@@ -1,3 +1,3 @@
diff --git a/flatlaf-core/svg/TreeLeafIcon.svg b/flatlaf-core/svg/TreeLeafIcon.svg
index 81f06450..6a96ba02 100644
--- a/flatlaf-core/svg/TreeLeafIcon.svg
+++ b/flatlaf-core/svg/TreeLeafIcon.svg
@@ -1,6 +1,8 @@
diff --git a/flatlaf-core/svg/TreeOpenIcon.svg b/flatlaf-core/svg/TreeOpenIcon.svg
index 0ae3582d..f241eedc 100644
--- a/flatlaf-core/svg/TreeOpenIcon.svg
+++ b/flatlaf-core/svg/TreeOpenIcon.svg
@@ -1,6 +1,3 @@
diff --git a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/FlatLaf.svg b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/FlatLaf.svg
index 41c42936..0c3d1462 100644
--- a/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/FlatLaf.svg
+++ b/flatlaf-demo/src/main/resources/com/formdev/flatlaf/demo/FlatLaf.svg
@@ -6,7 +6,7 @@
-
+
diff --git a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLaf.svg b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLaf.svg
index 61569fce..e587c6f7 100644
--- a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLaf.svg
+++ b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLaf.svg
@@ -6,7 +6,7 @@
-
+