Popup: fixed NPE if GraphicsConfiguration is null on Windows (issue #921)
Some checks failed
CI / build (11, ) (push) Waiting to run
CI / build (17, ) (push) Waiting to run
CI / build (21, ) (push) Waiting to run
CI / build (23, ) (push) Waiting to run
CI / build (8, ) (push) Waiting to run
CI / snapshot (push) Blocked by required conditions
CI / release (push) Blocked by required conditions
Native Libraries / Natives (macos) (push) Waiting to run
Native Libraries / Natives (ubuntu) (push) Waiting to run
Native Libraries / Natives (windows) (push) Waiting to run
Fonts / Fonts (inter) (push) Has been cancelled
Fonts / Fonts (jetbrains-mono) (push) Has been cancelled
Fonts / Fonts (roboto) (push) Has been cancelled
Fonts / Fonts (roboto-mono) (push) Has been cancelled

also check for null GraphicsConfiguration in other classes
This commit is contained in:
Karl Tauber
2024-11-27 19:27:47 +01:00
parent 7e002ff6c2
commit 16fc3cabf2
7 changed files with 36 additions and 25 deletions

View File

@@ -16,6 +16,7 @@ FlatLaf Change Log
when resizing window. (issue #907) when resizing window. (issue #907)
- Popup: On Windows 10, fixed misplaced popup drop shadow. (issue #911; - Popup: On Windows 10, fixed misplaced popup drop shadow. (issue #911;
regression in 3.5) regression in 3.5)
- Popup: Fixed NPE if `GraphicsConfiguration` is `null` on Windows. (issue #921)
- Theme Editor: Fixed using color picker on secondary screen. - Theme Editor: Fixed using color picker on secondary screen.

View File

@@ -16,6 +16,7 @@
package com.formdev.flatlaf.ui; package com.formdev.flatlaf.ui;
import java.awt.GraphicsConfiguration;
import java.awt.Point; import java.awt.Point;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.Window; import java.awt.Window;
@@ -96,7 +97,11 @@ class FlatNativeLinuxLibrary
} }
private static Point scale( Window window, Point pt ) { private static Point scale( Window window, Point pt ) {
AffineTransform transform = window.getGraphicsConfiguration().getDefaultTransform(); GraphicsConfiguration gc = window.getGraphicsConfiguration();
if( gc == null )
return pt;
AffineTransform transform = gc.getDefaultTransform();
int x = (int) Math.round( pt.x * transform.getScaleX() ); int x = (int) Math.round( pt.x * transform.getScaleX() );
int y = (int) Math.round( pt.y * transform.getScaleY() ); int y = (int) Math.round( pt.y * transform.getScaleY() );
return new Point( x, y ); return new Point( x, y );

View File

@@ -138,7 +138,8 @@ public class FlatPopupFactory
// create drop shadow popup // create drop shadow popup
Popup popupForScreenOfOwner = getPopupForScreenOfOwner( owner, contents, x, y, forceHeavyWeight ); Popup popupForScreenOfOwner = getPopupForScreenOfOwner( owner, contents, x, y, forceHeavyWeight );
return owner.getGraphicsConfiguration().isTranslucencyCapable() GraphicsConfiguration gc = owner.getGraphicsConfiguration();
return (gc != null && gc.isTranslucencyCapable())
? new DropShadowPopup( popupForScreenOfOwner, owner, contents ) ? new DropShadowPopup( popupForScreenOfOwner, owner, contents )
: new NonFlashingPopup( popupForScreenOfOwner, owner, contents ); : new NonFlashingPopup( popupForScreenOfOwner, owner, contents );
} }

View File

@@ -239,11 +239,13 @@ public class FlatPopupMenuUI
if( gc == null && popupMenu.getInvoker() != null ) if( gc == null && popupMenu.getInvoker() != null )
gc = popupMenu.getInvoker().getGraphicsConfiguration(); gc = popupMenu.getInvoker().getGraphicsConfiguration();
// compute screen height if( gc == null )
return new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() );
// compute screen bounds
// (always subtract screen insets because there is no API to detect whether // (always subtract screen insets because there is no API to detect whether
// the popup can overlap the taskbar; see JPopupMenu.canPopupOverlapTaskBar()) // the popup can overlap the taskbar; see JPopupMenu.canPopupOverlapTaskBar())
Toolkit toolkit = Toolkit.getDefaultToolkit(); Rectangle screenBounds = gc.getBounds();
Rectangle screenBounds = (gc != null) ? gc.getBounds() : new Rectangle( toolkit.getScreenSize() );
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets( gc ); Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets( gc );
return FlatUIUtils.subtractInsets( screenBounds, screenInsets ); return FlatUIUtils.subtractInsets( screenBounds, screenInsets );
} }

View File

@@ -824,7 +824,8 @@ public class FlatTitlePane
Rectangle oldMaximizedBounds = frame.getMaximizedBounds(); Rectangle oldMaximizedBounds = frame.getMaximizedBounds();
if( !hasNativeCustomDecoration() && if( !hasNativeCustomDecoration() &&
(oldMaximizedBounds == null || (oldMaximizedBounds == null ||
Objects.equals( oldMaximizedBounds, rootPane.getClientProperty( "_flatlaf.maximizedBounds" ) )) ) Objects.equals( oldMaximizedBounds, rootPane.getClientProperty( "_flatlaf.maximizedBounds" ) )) &&
window.getGraphicsConfiguration() != null )
{ {
GraphicsConfiguration gc = window.getGraphicsConfiguration(); GraphicsConfiguration gc = window.getGraphicsConfiguration();

View File

@@ -329,12 +329,11 @@ public abstract class FlatWindowResizer
@Override @Override
protected boolean limitToParentBounds() { protected boolean limitToParentBounds() {
return limitResizeToScreenBounds && window != null; return limitResizeToScreenBounds && window != null && window.getGraphicsConfiguration() != null;
} }
@Override @Override
protected Rectangle getParentBounds() { protected Rectangle getParentBounds() {
if( limitResizeToScreenBounds && window != null ) {
GraphicsConfiguration gc = window.getGraphicsConfiguration(); GraphicsConfiguration gc = window.getGraphicsConfiguration();
Rectangle bounds = gc.getBounds(); Rectangle bounds = gc.getBounds();
Insets insets = window.getToolkit().getScreenInsets( gc ); Insets insets = window.getToolkit().getScreenInsets( gc );
@@ -342,8 +341,6 @@ public abstract class FlatWindowResizer
bounds.width - insets.left - insets.right, bounds.width - insets.left - insets.right,
bounds.height - insets.top - insets.bottom ); bounds.height - insets.top - insets.bottom );
} }
return null;
}
@Override @Override
protected boolean honorMinimumSizeOnResize() { protected boolean honorMinimumSizeOnResize() {

View File

@@ -24,6 +24,7 @@ import java.awt.Dimension;
import java.awt.EventQueue; import java.awt.EventQueue;
import java.awt.Font; import java.awt.Font;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.Insets; import java.awt.Insets;
import java.awt.KeyboardFocusManager; import java.awt.KeyboardFocusManager;
import java.awt.LayoutManager; import java.awt.LayoutManager;
@@ -450,7 +451,9 @@ public class FlatInspector
Dimension size = tip.getPreferredSize(); Dimension size = tip.getPreferredSize();
// position the tip in the visible area // position the tip in the visible area
Rectangle visibleRect = rootPane.getGraphicsConfiguration().getBounds(); GraphicsConfiguration gc = rootPane.getGraphicsConfiguration();
if( gc != null ) {
Rectangle visibleRect = gc.getBounds();
if( tx + size.width > visibleRect.x + visibleRect.width ) if( tx + size.width > visibleRect.x + visibleRect.width )
tx -= size.width + UIScale.scale( 16 ); tx -= size.width + UIScale.scale( 16 );
if( ty + size.height > visibleRect.y + visibleRect.height ) if( ty + size.height > visibleRect.y + visibleRect.height )
@@ -459,6 +462,7 @@ public class FlatInspector
tx = visibleRect.x; tx = visibleRect.x;
if( ty < visibleRect.y ) if( ty < visibleRect.y )
ty = visibleRect.y; ty = visibleRect.y;
}
PopupFactory popupFactory = PopupFactory.getSharedInstance(); PopupFactory popupFactory = PopupFactory.getSharedInstance();
popup = popupFactory.getPopup( c, tip, tx, ty ); popup = popupFactory.getPopup( c, tip, tx, ty );