Compare commits

...

10 Commits

9 changed files with 66 additions and 22 deletions

View File

@@ -5,9 +5,21 @@ FlatLaf Change Log
- ComboBox: Added UI property `ComboBox.buttonFocusedEditableBackground`. (issue - ComboBox: Added UI property `ComboBox.buttonFocusedEditableBackground`. (issue
#1068) #1068)
- Dialog: Some client properties (e.g. `JRootPane.titleBarShowTitle`) did not
work before the dialog was made visible. (issue #1081)
- Popup: Fixed scrolling popup painting issue on Windows 10 when a glass pane is - Popup: Fixed scrolling popup painting issue on Windows 10 when a glass pane is
visible and frame is maximized. (issue #1071) visible and frame is maximized. (issue #1071)
- Slider: Styling `thumbSize` or `focusWidth` did not update slider size/layout.
(PR #1074)
- ToolBar: Grip disappeared when switching between Look and Feels. (issue #1075) - ToolBar: Grip disappeared when switching between Look and Feels. (issue #1075)
- macOS: Popups (menus and combobox lists) were not always hidden when window is
resized. (issue #1082)
- Extras:
- UI defaults inspector: Fixed NPE if color of `FlatLineBorder` is null. Also
use `FlatLineBorder` line color as cell background color in "Value" column.
(PR #1080)
- `FlatDesktop`: Avoid unnecessary logging if desktop is not supported (e.g.
on NixOS with Plasma/KDE desktop).
## 3.7 ## 3.7

View File

@@ -76,10 +76,16 @@ Otherwise, download `flatlaf-<version>.jar` here:
[![Maven Central](https://img.shields.io/maven-central/v/com.formdev/flatlaf?style=flat-square)](https://central.sonatype.com/artifact/com.formdev/flatlaf) [![Maven Central](https://img.shields.io/maven-central/v/com.formdev/flatlaf?style=flat-square)](https://central.sonatype.com/artifact/com.formdev/flatlaf)
See also - See
[Native Libraries distribution](https://www.formdev.com/flatlaf/native-libraries/) [Native Libraries distribution](https://www.formdev.com/flatlaf/native-libraries/)
for instructions on how to redistribute FlatLaf native libraries with your for instructions on how to redistribute FlatLaf native libraries with your
application. application.
- If repackaging FlatLaf (and other) JARs into a single fat/uber JAR:
- add `Multi-Release: true` to `META-INF/MANIFEST.MF`
- keep `META-INF/versions/` and `META-INF/services/` directories
- merge content of equally named files in `META-INF/services/`
- If using obfuscation/minimizing/shrinking tools (e.g. **ProGuard** or
**Shadow**), exclude package `com.formdev.flatlaf` and all sub-packages.
### Snapshots ### Snapshots

View File

@@ -310,8 +310,8 @@ public abstract class FlatLaf
// install submenu usability helper // install submenu usability helper
subMenuUsabilityHelperInstalled = SubMenuUsabilityHelper.install(); subMenuUsabilityHelperInstalled = SubMenuUsabilityHelper.install();
// install Linux popup menu canceler // install Linux/macOS popup menu canceler
if( SystemInfo.isLinux ) if( SystemInfo.isLinux || SystemInfo.isMacOS )
linuxPopupMenuCanceler = new LinuxPopupMenuCanceler(); linuxPopupMenuCanceler = new LinuxPopupMenuCanceler();
// listen to desktop property changes to update UI if system font or scaling changes // listen to desktop property changes to update UI if system font or scaling changes

View File

@@ -30,7 +30,7 @@ import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
/** /**
* Cancels (hides) popup menus on Linux. * Cancels (hides) popup menus on Linux and macOS.
* <p> * <p>
* On Linux, popups are not hidden under following conditions, which results in * On Linux, popups are not hidden under following conditions, which results in
* misplaced popups: * misplaced popups:
@@ -41,7 +41,13 @@ import javax.swing.event.ChangeListener;
* <li>window deactivated (e.g. activated other application) * <li>window deactivated (e.g. activated other application)
* </ul> * </ul>
* *
* On Windows and macOS, popups are automatically hidden. * On macOS, popups are usually automatically hidden, but not always.
* When resizing a window, then it depends where clicking to start resizing (and on the Java version).
* E.g. with Java 25, clicking at bottom-right corner inside of the window does not hide the popups.
* But clicking on same corner outside of the window, hides the popup.
*
* <p>
* On Windows, popups are automatically hidden.
* <p> * <p>
* The implementation is similar to what's done in * The implementation is similar to what's done in
* {@code javax.swing.plaf.basic.BasicPopupMenuUI.MouseGrabber}, * {@code javax.swing.plaf.basic.BasicPopupMenuUI.MouseGrabber},

View File

@@ -227,7 +227,13 @@ public class FlatSliderUI
/** @since 2 */ /** @since 2 */
protected void applyStyle( Object style ) { protected void applyStyle( Object style ) {
Dimension oldThumbSize = thumbSize;
int oldFocusWidth = focusWidth;
oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty );
if( !thumbSize.equals( oldThumbSize ) || focusWidth != oldFocusWidth )
calculateGeometry();
} }
/** @since 2 */ /** @since 2 */

View File

@@ -484,7 +484,7 @@ public class FlatTitlePane
} }
protected void frameStateChanged() { protected void frameStateChanged() {
if( window == null || rootPane.getWindowDecorationStyle() != JRootPane.FRAME ) if( window == null || rootPane.getWindowDecorationStyle() == JRootPane.NONE )
return; return;
updateVisibility(); updateVisibility();

View File

@@ -43,7 +43,8 @@ public class FlatDesktop
public static boolean isSupported( Action action ) { public static boolean isSupported( Action action ) {
if( SystemInfo.isJava_9_orLater ) { if( SystemInfo.isJava_9_orLater ) {
try { try {
return Desktop.getDesktop().isSupported( Enum.valueOf( Desktop.Action.class, action.name() ) ); return Desktop.isDesktopSupported() &&
Desktop.getDesktop().isSupported( Enum.valueOf( Desktop.Action.class, action.name() ) );
} catch( Exception ex ) { } catch( Exception ex ) {
LoggingFacade.INSTANCE.logSevere( null, ex ); LoggingFacade.INSTANCE.logSevere( null, ex );
return false; return false;

View File

@@ -524,7 +524,9 @@ public class FlatSVGIcon
private URL getIconURL( String name, boolean dark ) { private URL getIconURL( String name, boolean dark ) {
if( dark ) { if( dark ) {
int dotIndex = name.lastIndexOf( '.' ); int dotIndex = name.lastIndexOf( '.' );
name = name.substring( 0, dotIndex ) + "_dark" + name.substring( dotIndex ); name = (dotIndex > 0)
? name.substring( 0, dotIndex ) + "_dark" + name.substring( dotIndex )
: name + "_dark";
} }
ClassLoader cl = (classLoader != null) ? classLoader : FlatSVGIcon.class.getClassLoader(); ClassLoader cl = (classLoader != null) ? classLoader : FlatSVGIcon.class.getClassLoader();

View File

@@ -777,6 +777,9 @@ public class FlatUIDefaultsInspector
@SuppressWarnings( "FormatString" ) // Error Prone @SuppressWarnings( "FormatString" ) // Error Prone
private static String color2hex( Color color ) { private static String color2hex( Color color ) {
if( color == null )
return "";
int rgb = color.getRGB(); int rgb = color.getRGB();
boolean hasAlpha = color.getAlpha() != 255; boolean hasAlpha = color.getAlpha() != 255;
@@ -1018,28 +1021,36 @@ public class FlatUIDefaultsInspector
item = (Item) value; item = (Item) value;
init( table, item.key, isSelected, row ); init( table, item.key, isSelected, row );
// reset background, foreground and icon // get color of value
if( !(item.value instanceof Color) ) { valueColor = null;
if( item.value instanceof Color )
valueColor = (item.info instanceof Color[]) ? ((Color[])item.info)[0] : (Color) item.value;
else if( item.value instanceof FlatLineBorder )
valueColor = ((FlatLineBorder)item.value).getLineColor();
// reset background and foreground
if( valueColor == null ) {
setBackground( null ); setBackground( null );
setForeground( null ); setForeground( null );
} }
if( !(item.value instanceof Icon) )
setIcon( null );
// value to string // value to string
value = item.getValueAsString(); value = item.getValueAsString();
super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column ); super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
if( item.value instanceof Color ) { // set foreground, if value has color
Color color = (item.info instanceof Color[]) ? ((Color[])item.info)[0] : (Color) item.value; if( valueColor != null ) {
boolean isDark = new HSLColor( color ).getLuminance() < 70 && color.getAlpha() >= 128; boolean isDark = new HSLColor( valueColor ).getLuminance() < 70 && valueColor.getAlpha() >= 128;
valueColor = color;
setForeground( isDark ? Color.white : Color.black ); setForeground( isDark ? Color.white : Color.black );
} else if( item.value instanceof Icon ) { }
// set icon
if( item.value instanceof Icon ) {
Icon icon = (Icon) item.value; Icon icon = (Icon) item.value;
setIcon( new SafeIcon( icon ) ); setIcon( new SafeIcon( icon ) );
} } else
setIcon( null );
// set tooltip // set tooltip
String toolTipText = (item.value instanceof Object[]) String toolTipText = (item.value instanceof Object[])
@@ -1056,7 +1067,7 @@ public class FlatUIDefaultsInspector
@Override @Override
protected void paintComponent( Graphics g ) { protected void paintComponent( Graphics g ) {
if( item.value instanceof Color ) { if( valueColor != null ) {
int width = getWidth(); int width = getWidth();
int height = getHeight(); int height = getHeight();
Color background = valueColor; Color background = valueColor;