From 03f4cda9074822bf3aa3d0232c0324a4474cf861 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 1 Sep 2019 19:13:19 +0200 Subject: [PATCH] avoid using sun.swing.SwingUtilities2 --- .../com/formdev/flatlaf/ui/FlatButtonUI.java | 5 +- .../com/formdev/flatlaf/ui/FlatLabelUI.java | 3 +- .../formdev/flatlaf/ui/FlatTabbedPaneUI.java | 3 +- .../com/formdev/flatlaf/ui/FlatUIUtils.java | 10 +++ .../flatlaf/util/JavaCompatibility.java | 71 +++++++++++++++++++ 5 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/util/JavaCompatibility.java diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java index c6c43631..a181812c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java @@ -29,7 +29,6 @@ import javax.swing.JComponent; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicButtonUI; -import sun.swing.SwingUtilities2; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JButton}. @@ -109,11 +108,11 @@ public class FlatButtonUI @Override protected void paintText( Graphics g, JComponent c, Rectangle textRect, String text ) { AbstractButton b = (AbstractButton) c; - FontMetrics fm = SwingUtilities2.getFontMetrics( c, g ); + FontMetrics fm = c.getFontMetrics( c.getFont() ); int mnemonicIndex = b.getDisplayedMnemonicIndex(); g.setColor( b.getModel().isEnabled() ? getForeground( c ) : disabledText ); - SwingUtilities2.drawStringUnderlineCharAt( c, g, text, mnemonicIndex, + FlatUIUtils.drawStringUnderlineCharAt( c, g, text, mnemonicIndex, textRect.x + getTextShiftOffset(), textRect.y + fm.getAscent() + getTextShiftOffset() ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java index 8f2cfaa3..5d2218a3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java @@ -23,7 +23,6 @@ import javax.swing.JLabel; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicLabelUI; -import sun.swing.SwingUtilities2; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JLabel}. @@ -59,6 +58,6 @@ public class FlatLabelUI protected void paintDisabledText( JLabel l, Graphics g, String s, int textX, int textY ) { int mnemIndex = l.getDisplayedMnemonicIndex(); g.setColor( disabledForeground ); - SwingUtilities2.drawStringUnderlineCharAt( l, g, s, mnemIndex, textX, textY ); + FlatUIUtils.drawStringUnderlineCharAt( l, g, s, mnemIndex, textX, textY ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index 945fd592..8f575691 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -33,7 +33,6 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicTabbedPaneUI; import javax.swing.text.View; -import sun.swing.SwingUtilities2; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JTabbedPane}. @@ -261,7 +260,7 @@ public class FlatTabbedPaneUI int mnemIndex = tabPane.getDisplayedMnemonicIndexAt( tabIndex ); g.setColor( color ); - SwingUtilities2.drawStringUnderlineCharAt( tabPane, g, title, mnemIndex, + FlatUIUtils.drawStringUnderlineCharAt( tabPane, g, title, mnemIndex, textRect.x, textRect.y + metrics.getAscent() ); } 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 34fe76e3..54178545 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 @@ -27,6 +27,7 @@ import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import javax.swing.JComponent; import javax.swing.UIManager; +import com.formdev.flatlaf.util.JavaCompatibility; import com.formdev.flatlaf.util.UIScale; /** @@ -156,4 +157,13 @@ public class FlatUIUtils rect.closePath(); return rect; } + + /** + * Replacement for SwingUtilities2.drawStringUnderlineCharAt() + */ + public static void drawStringUnderlineCharAt( JComponent c, Graphics g, + String text, int underlinedIndex, int x, int y ) + { + JavaCompatibility.drawStringUnderlineCharAt( c, g, text, underlinedIndex, x, y ); + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/JavaCompatibility.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/JavaCompatibility.java new file mode 100644 index 00000000..f927297c --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/JavaCompatibility.java @@ -0,0 +1,71 @@ +/* + * Copyright 2019 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.util; + +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import javax.swing.JComponent; + +/** + * Provides Java version compatibility methods. + * + * WARNING: This is private API and may change. + * + * @author Karl Tauber + */ +public class JavaCompatibility +{ + private static Method drawStringUnderlineCharAtMethod; + + /** + * Java 8: sun.swing.SwingUtilities2.drawStringUnderlineCharAt( JComponent c, + * Graphics g, String text, int underlinedIndex, int x, int y ) + * Java 9: javax.swing.plaf.basic.BasicGraphicsUtils.drawStringUnderlineCharAt( JComponent c, + * Graphics2D g, String string, int underlinedIndex, float x, float y ) + */ + public static void drawStringUnderlineCharAt( JComponent c, Graphics g, + String text, int underlinedIndex, int x, int y ) + { + synchronized( JavaCompatibility.class ) { + if( drawStringUnderlineCharAtMethod == null ) { + try { + Class cls = Class.forName( SystemInfo.IS_JAVA_9_OR_LATER + ? "javax.swing.plaf.basic.BasicGraphicsUtils" + : "sun.swing.SwingUtilities2" ); + drawStringUnderlineCharAtMethod = cls.getMethod( "drawStringUnderlineCharAt", SystemInfo.IS_JAVA_9_OR_LATER + ? new Class[] { JComponent.class, Graphics2D.class, String.class, int.class, float.class, float.class } + : new Class[] { JComponent.class, Graphics.class, String.class, int.class, int.class, int.class } ); + } catch( Exception ex ) { + ex.printStackTrace(); + throw new RuntimeException( ex ); + } + } + } + + try { + if( SystemInfo.IS_JAVA_9_OR_LATER ) + drawStringUnderlineCharAtMethod.invoke( null, c, g, text, underlinedIndex, (float) x, (float) y ); + else + drawStringUnderlineCharAtMethod.invoke( null, c, g, text, underlinedIndex, x, y ); + } catch( IllegalAccessException | IllegalArgumentException | InvocationTargetException ex ) { + ex.printStackTrace(); + throw new RuntimeException( ex ); + } + } +}