From 1463723e52c3f9cbb780550d061d53867805d96b Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 4 Jun 2024 13:34:49 +0200 Subject: [PATCH] Table: Fixed painting of alternating rows below table if auto-resize mode is `JTable.AUTO_RESIZE_OFF` and table is smaller than scroll pane. Below alternating rows were not updated when table width changed and were painted on wrong side in right-to-left component orientation --- CHANGELOG.md | 8 ++- .../com/formdev/flatlaf/ui/FlatTableUI.java | 59 ++++++++++++++++++- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c59c30bf..a6a367a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,10 @@ FlatLaf Change Log ``, `` and `` in HTML text for components Button, CheckBox, RadioButton, MenuItem (and subclasses), JideLabel, JideButton, JXBusyLabel and JXHyperlink. Also fixed for Label and ToolTip if using Java 11+. +- Table: Fixed painting of alternating rows below table if auto-resize mode is + `JTable.AUTO_RESIZE_OFF` and table width is smaller than scroll pane (was not + updated when table width changed and was painted on wrong side in + right-to-left component orientation). - Theme Editor: Fixed occasional empty window on startup on macOS. #### Incompatibilities @@ -88,8 +92,8 @@ FlatLaf Change Log - Improved log messages for loading fails. - Fonts: Updated **Inter** to [v4.0](https://github.com/rsms/inter/releases/tag/v4.0). -- Table: Select all text in cell editor when starting editing using `F2` key. - (issue #652) +- Table: Select all text in cell editor when starting editing using `F2` key on + Windows or Linux. (issue #652) #### Fixed bugs 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 687f94bf..a7b032eb 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 @@ -25,6 +25,9 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.event.ActionEvent; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.geom.Rectangle2D; @@ -132,6 +135,7 @@ public class FlatTableUI private TableCellRenderer oldBooleanRenderer; private PropertyChangeListener propertyChangeListener; + private ComponentListener outsideAlternateRowsListener; private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { @@ -266,6 +270,11 @@ public class FlatTableUI table.removePropertyChangeListener( propertyChangeListener ); propertyChangeListener = null; + + if( outsideAlternateRowsListener != null ) { + table.removeComponentListener( outsideAlternateRowsListener ); + outsideAlternateRowsListener = null; + } } @Override @@ -513,8 +522,6 @@ public class FlatTableUI boolean paintOutside = UIManager.getBoolean( "Table.paintOutsideAlternateRows" ); Color alternateColor; if( paintOutside && (alternateColor = UIManager.getColor( "Table.alternateRowColor" )) != null ) { - g.setColor( alternateColor ); - int rowCount = table.getRowCount(); // paint alternating empty rows below the table @@ -523,10 +530,56 @@ public class FlatTableUI int tableWidth = table.getWidth(); int rowHeight = table.getRowHeight(); + g.setColor( alternateColor ); + + int x = viewport.getComponentOrientation().isLeftToRight() ? 0 : viewportWidth - tableWidth; for( int y = tableHeight, row = rowCount; y < viewportHeight; y += rowHeight, row++ ) { if( row % 2 != 0 ) - g.fillRect( 0, y, tableWidth, rowHeight ); + g.fillRect( x, y, tableWidth, rowHeight ); } + + // add listener on demand + if( outsideAlternateRowsListener == null && table.getAutoResizeMode() == JTable.AUTO_RESIZE_OFF ) { + outsideAlternateRowsListener = new FlatOutsideAlternateRowsListener(); + table.addComponentListener( outsideAlternateRowsListener ); + } + } + } + } + + //---- class OutsideAlternateRowsListener --------------------------------- + + /** + * Used if table auto-resize-mode is off to repaint outside alternate rows + * when table width changed (column resized) or component orientation changed. + */ + private class FlatOutsideAlternateRowsListener + extends ComponentAdapter + { + @Override + public void componentHidden( ComponentEvent e ) { + Container viewport = SwingUtilities.getUnwrappedParent( table ); + if( viewport instanceof JViewport ) + viewport.repaint(); + } + + @Override + public void componentMoved( ComponentEvent e ) { + repaintAreaBelowTable(); + } + + @Override + public void componentResized( ComponentEvent e ) { + repaintAreaBelowTable(); + } + + private void repaintAreaBelowTable() { + Container viewport = SwingUtilities.getUnwrappedParent( table ); + if( viewport instanceof JViewport ) { + int viewportHeight = viewport.getHeight(); + int tableHeight = table.getHeight(); + if( tableHeight < viewportHeight ) + viewport.repaint( 0, tableHeight, viewport.getWidth(), viewportHeight - tableHeight ); } } }