From d3a70b8bb299744ce1d333e4f66299705a799b72 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 12 May 2020 22:35:05 +0200 Subject: [PATCH] CheckBox and RadioButton: Opaque flag is no longer ignored when checkbox is used as table cell renderer (issue #77) this fix replaces/improves fix made in commit 3ba8133890d0f68b7746dc21722ac13ad8560605 --- CHANGELOG.md | 2 ++ .../java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java | 6 ++---- .../src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java | 8 ++++++++ .../java/com/formdev/flatlaf/testing/FlatInspector.java | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89fe20354..2f3766586 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ FlatLaf Change Log (e.g. 1000). - Added Java 9 module descriptor to `flatlaf-extras-.jar` and `flatlaf-swingx-.jar`. +- CheckBox and RadioButton: Flag `opaque` is no longer ignored when checkbox or + radio button is used as table cell renderer. (issue #77) ## 0.34 diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index c7cdd4bf5..ffc2b854d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -23,7 +23,6 @@ import java.awt.Insets; import java.awt.Rectangle; import javax.swing.AbstractButton; -import javax.swing.CellRendererPane; import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.UIManager; @@ -122,11 +121,10 @@ public Dimension getPreferredSize( JComponent c ) { public void paint( Graphics g, JComponent c ) { // fill background even if not opaque if // - contentAreaFilled is true and - // - used as cell renderer (because of selection background) - // - or if background was explicitly set to a non-UIResource color + // - if background was explicitly set to a non-UIResource color if( !c.isOpaque() && ((AbstractButton)c).isContentAreaFilled() && - (c.getParent() instanceof CellRendererPane || !(c.getBackground() instanceof UIResource))) + !(c.getBackground() instanceof UIResource) ) { g.setColor( c.getBackground() ); g.fillRect( 0, 0, c.getWidth(), c.getHeight() ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java index 4d93a5028..6d6b5481e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java @@ -20,11 +20,13 @@ import java.awt.Dimension; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTableUI; +import javax.swing.table.TableCellRenderer; import com.formdev.flatlaf.util.UIScale; /** @@ -132,6 +134,12 @@ protected void installDefaults() { oldIntercellSpacing = table.getIntercellSpacing(); table.setIntercellSpacing( intercellSpacing ); } + + // checkbox is non-opaque in FlatLaf and therefore would not paint selection + // --> make checkbox renderer opaque (but opaque in Metal or Windows LaF) + TableCellRenderer booleanRenderer = table.getDefaultRenderer( Boolean.class ); + if( booleanRenderer instanceof JCheckBox ) + ((JCheckBox)booleanRenderer).setOpaque( true ); } @Override diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInspector.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInspector.java index 3cef2fd48..659897070 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInspector.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatInspector.java @@ -304,6 +304,8 @@ else if( c instanceof JToolBar ) text += "Enabled: " + c.isEnabled() + '\n'; text += "Opaque: " + c.isOpaque() + (c instanceof JComponent && FlatUIUtils.hasOpaqueBeenExplicitlySet( (JComponent) c ) ? " EXPLICIT" : "") + '\n'; + if( c instanceof AbstractButton ) + text += "ContentAreaFilled: " + ((AbstractButton)c).isContentAreaFilled() + '\n'; text += "Focusable: " + c.isFocusable() + '\n'; text += "Left-to-right: " + c.getComponentOrientation().isLeftToRight() + '\n'; text += "Parent: " + c.getParent().getClass().getName();