MenuItem: fixed sometimes wrapped HTML text on HiDPI screens on Windows

This commit is contained in:
Karl Tauber
2022-07-02 22:38:37 +02:00
parent 23bac7e5fd
commit a8b15c6a12
4 changed files with 52 additions and 0 deletions

View File

@@ -7,6 +7,7 @@ FlatLaf Change Log
- ComboBox: Fixed vertical alignment of text in popup list with text in combo - ComboBox: Fixed vertical alignment of text in popup list with text in combo
box in IntelliJ/Darcula themes. box in IntelliJ/Darcula themes.
- MenuItem: Fixed sometimes wrapped HTML text on HiDPI screens on Windows.
- TableHeader: Fixed exception when changing table structure (e.g. removing - TableHeader: Fixed exception when changing table structure (e.g. removing
column) from a table header popup menu action. (issue #532) column) from a table header popup menu action. (issue #532)
- `HiDPIUtils.paintAtScale1x()` now supports rotated graphics. (issue #557) - `HiDPIUtils.paintAtScale1x()` now supports rotated graphics. (issue #557)

View File

@@ -446,6 +446,19 @@ debug*/
protected static void paintHTMLText( Graphics g, JMenuItem menuItem, protected static void paintHTMLText( Graphics g, JMenuItem menuItem,
Rectangle textRect, View htmlView, Color selectionForeground ) Rectangle textRect, View htmlView, Color selectionForeground )
{ {
// On Windows, using Segoe UI font, Java 15 or older and scaling greater than 1,
// the width of the HTML view may be initially too small (because component
// is not connected to a GraphicsConfiguration when getPreferredSize() is invoked).
// Since Java 16, this seems to be fixed somehow by doing popup menu layout twice.
//
// If using a too small width for htmlView.paint(), the view would rearrange
// its children and wrap them to two lines. To avoid this, use view preferred X span
// for painting. Core Lafs actually do the same in class MenuItemLayoutHelper.
//
// Example HTML text that causes the problem: "<html>some <b>HTML</b> <i>text</i></html>"
textRect = new Rectangle( textRect );
textRect.width = (int) htmlView.getPreferredSpan( View.X_AXIS );
if( isArmedOrSelected( menuItem ) && selectionForeground != null ) if( isArmedOrSelected( menuItem ) && selectionForeground != null )
g = new GraphicsProxyWithTextColor( (Graphics2D) g, selectionForeground ); g = new GraphicsProxyWithTextColor( (Graphics2D) g, selectionForeground );

View File

@@ -181,6 +181,10 @@ public class FlatMenusTest
JMenuItem menuItem45 = new JMenuItem(); JMenuItem menuItem45 = new JMenuItem();
JMenuItem menuItem46 = new JMenuItem(); JMenuItem menuItem46 = new JMenuItem();
JMenuItem menuItem47 = new JMenuItem(); JMenuItem menuItem47 = new JMenuItem();
JMenu menu13 = new JMenu();
JMenuItem menuItem48 = new JMenuItem();
JMenuItem menuItem49 = new JMenuItem();
JMenuItem menuItem50 = new JMenuItem();
menuBar2 = new JMenuBar(); menuBar2 = new JMenuBar();
JMenu menu8 = new JMenu(); JMenu menu8 = new JMenu();
FlatMenusTest.LargerMenuItem menuItem13 = new FlatMenusTest.LargerMenuItem(); FlatMenusTest.LargerMenuItem menuItem13 = new FlatMenusTest.LargerMenuItem();
@@ -442,6 +446,24 @@ public class FlatMenusTest
menu12.add(menuItem47); menu12.add(menuItem47);
} }
menuBar1.add(menu12); menuBar1.add(menu12);
//======== menu13 ========
{
menu13.setText("HTML");
//---- menuItem48 ----
menuItem48.setText("<html>some <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>");
menu13.add(menuItem48);
//---- menuItem49 ----
menuItem49.setText("<html>some longer <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>");
menu13.add(menuItem49);
//---- menuItem50 ----
menuItem50.setText("<html>another <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>");
menu13.add(menuItem50);
}
menuBar1.add(menu13);
} }
add(menuBar1, "cell 1 0 2 1,growx"); add(menuBar1, "cell 1 0 2 1,growx");

View File

@@ -194,6 +194,22 @@ new FormModel {
"icon": new com.jformdesigner.model.SwingIcon( 0, "/com/formdev/flatlaf/testing/test64.png" ) "icon": new com.jformdesigner.model.SwingIcon( 0, "/com/formdev/flatlaf/testing/test64.png" )
} ) } )
} ) } )
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "menu13"
"text": "HTML"
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem48"
"text": "<html>some <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem49"
"text": "<html>some longer <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem50"
"text": "<html>another <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>"
} )
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0 2 1,growx" "value": "cell 1 0 2 1,growx"
} ) } )