mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-06 22:10:54 +03:00
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
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:
@@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|||||||
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|||||||
Reference in New Issue
Block a user