diff --git a/CHANGELOG.md b/CHANGELOG.md index 99e96f5d..bc4b67ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,10 +11,13 @@ FlatLaf Change Log `sun.java2d.d3d` and `sun.java2d.noddraw` are not yet set), which disables usage of Windows Direct3D (DirectX) onscreen surfaces. Component rendering still uses Direct3D. (issue #887) -- FlatLaf window decorations on Windows: Fixed possible application freeze when - using custom component that overrides `Component.contains(int x, int y)` and - invokes `SwingUtilities.convertPoint()` (or similar) from the overridden - method. (issue #878) +- FlatLaf window decorations: + - Iconify/maximize/close buttons did not fill whole title bar height, if some + custom component in menu bar increases title bar height. (issue #897) + - Windows: Fixed possible application freeze when using custom component that + overrides `Component.contains(int x, int y)` and invokes + `SwingUtilities.convertPoint()` (or similar) from the overridden method. + (issue #878) - TextComponents: Fixed too fast scrolling in multi-line text components when using touchpads (e.g. on macOS). (issue #892) - ToolBar: Fixed endless loop if button in Toolbar has focus and is made diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAbstractIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAbstractIcon.java index 8448f128..f8777677 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAbstractIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAbstractIcon.java @@ -57,6 +57,8 @@ public abstract class FlatAbstractIcon // g2.setColor( Color.blue ); // g2.drawRect( x, y, getIconWidth() - 1, getIconHeight() - 1 ); + paintBackground( c, g2, x, y ); + g2.translate( x, y ); UIScale.scaleGraphics( g2 ); @@ -69,7 +71,11 @@ public abstract class FlatAbstractIcon } } - protected abstract void paintIcon( Component c, Graphics2D g2 ); + /** @since 3.5.2 */ + protected void paintBackground( Component c, Graphics2D g, int x, int y ) { + } + + protected abstract void paintIcon( Component c, Graphics2D g ); @Override public int getIconWidth() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowAbstractIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowAbstractIcon.java index 87afd209..46ed00cb 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowAbstractIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatWindowAbstractIcon.java @@ -60,23 +60,24 @@ public abstract class FlatWindowAbstractIcon @Override protected void paintIcon( Component c, Graphics2D g ) { - paintBackground( c, g ); - g.setColor( getForeground( c ) ); HiDPIUtils.paintAtScale1x( g, 0, 0, width, height, this::paintIconAt1x ); } protected abstract void paintIconAt1x( Graphics2D g, int x, int y, int width, int height, double scaleFactor ); - protected void paintBackground( Component c, Graphics2D g ) { + /** @since 3.5.2 */ + @Override + protected void paintBackground( Component c, Graphics2D g, int x, int y ) { Color background = FlatButtonUI.buttonStateColor( c, null, null, null, hoverBackground, pressedBackground ); if( background != null ) { // disable antialiasing for background rectangle painting to avoid blurry edges when scaled (e.g. at 125% or 175%) Object oldHint = g.getRenderingHint( RenderingHints.KEY_ANTIALIASING ); g.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF ); + // fill background of whole component g.setColor( FlatUIUtils.deriveColor( background, c.getBackground() ) ); - g.fillRect( 0, 0, width, height ); + g.fillRect( 0, 0, c.getWidth(), c.getHeight() ); g.setRenderingHint( RenderingHints.KEY_ANTIALIASING, oldHint ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java index df465247..f00d9d6a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java @@ -395,6 +395,12 @@ public class FlatTitlePane // allow the button to shrink if space is rare return new Dimension( UIScale.scale( buttonMinimumWidth ), super.getMinimumSize().height ); } + @Override + public Dimension getMaximumSize() { + // allow the button to fill whole button area height + // see also BasicMenuUI.getMaximumSize() + return new Dimension( super.getMaximumSize().width, Short.MAX_VALUE ); + } }; button.setFocusable( false ); button.setContentAreaFilled( false ); diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java index 1748ff69..ef31a999 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java @@ -189,6 +189,7 @@ public class FlatWindowDecorationsTest if( rightCompCheckBox.isSelected() ) { rightStretchCompCheckBox.setSelected( false ); + tallCompCheckBox.setSelected( false ); JButton myButton = new JButton( "?" ); myButton.putClientProperty( "JButton.buttonType", "toolBarButton" ); @@ -207,6 +208,7 @@ public class FlatWindowDecorationsTest if( rightStretchCompCheckBox.isSelected() ) { rightCompCheckBox.setSelected( false ); + tallCompCheckBox.setSelected( false ); menuBar.add( Box.createGlue() ); menuBar.add( new JProgressBar() ); @@ -216,6 +218,20 @@ public class FlatWindowDecorationsTest menuBar.repaint(); } + private void tallCompChanged() { + removeNonMenusFromMenuBar(); + + if( tallCompCheckBox.isSelected() ) { + rightCompCheckBox.setSelected( false ); + rightStretchCompCheckBox.setSelected( false ); + + menuBar.add( new JButton( "large
button
large
button" ) ); + } + + menuBar.revalidate(); + menuBar.repaint(); + } + private void removeNonMenusFromMenuBar() { Component[] components = menuBar.getComponents(); for( int i = components.length - 1; i >= 0; i-- ) { @@ -585,6 +601,7 @@ debug*/ menuBarVisibleCheckBox = new JCheckBox(); rightCompCheckBox = new JCheckBox(); rightStretchCompCheckBox = new JCheckBox(); + tallCompCheckBox = new JCheckBox(); JPanel panel3 = new JPanel(); addMenuButton = new JButton(); addGlueButton = new JButton(); @@ -777,6 +794,7 @@ debug*/ "[]" + "[]" + "[]" + + "[]" + "[]")); //---- menuBarCheckBox ---- @@ -806,6 +824,11 @@ debug*/ rightStretchCompCheckBox.setText("right aligned stretching component"); rightStretchCompCheckBox.addActionListener(e -> rightStretchCompChanged()); panel6.add(rightStretchCompCheckBox, "cell 0 4"); + + //---- tallCompCheckBox ---- + tallCompCheckBox.setText("tall component"); + tallCompCheckBox.addActionListener(e -> tallCompChanged()); + panel6.add(tallCompCheckBox, "cell 0 5"); } add(panel6, "cell 2 0"); @@ -1254,6 +1277,7 @@ debug*/ private JCheckBox menuBarVisibleCheckBox; private JCheckBox rightCompCheckBox; private JCheckBox rightStretchCompCheckBox; + private JCheckBox tallCompCheckBox; private JButton addMenuButton; private JButton addGlueButton; private JButton addCaptionButton; diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.jfd index c3579666..a05293da 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.jfd +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.jfd @@ -1,4 +1,4 @@ -JFDML JFormDesigner: "8.2.1.0.348" Java: "21.0.1" encoding: "UTF-8" +JFDML JFormDesigner: "8.2.3.0.386" Java: "21" encoding: "UTF-8" new FormModel { contentType: "form/swing" @@ -166,7 +166,7 @@ new FormModel { add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { "$layoutConstraints": "ltr,hidemode 3,gap 0 0" "$columnConstraints": "[left]" - "$rowConstraints": "[][][][][]" + "$rowConstraints": "[][][][][][]" } ) { name: "panel6" "border": new javax.swing.border.TitledBorder( "Menu Bar" ) @@ -223,6 +223,16 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 0 4" } ) + add( new FormComponent( "javax.swing.JCheckBox" ) { + name: "tallCompCheckBox" + "text": "tall component" + auxiliary() { + "JavaCodeGenerator.variableLocal": false + } + addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "tallCompChanged", false ) ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 5" + } ) }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 2 0" } )