diff --git a/CHANGELOG.md b/CHANGELOG.md index ac966eb5..5c7e1ae7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ FlatLaf Change Log - OptionPane: Fixed rendering of longer HTML text if it is passed as `StringBuilder`, `StringBuffer`, or any other object that returns HTML text in method `toString()`. (similar to issue #12) +- TableHeader: Do not show resize cursor for last column if resizing last column + is not possible because auto resize mode of table is not off. (issue #332) - TextField, FormattedTextField, PasswordField and ComboBox: Fixed alignment of placeholder text in right-to-left component orientation. diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java index 2ef512de..82d861ad 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java @@ -18,10 +18,13 @@ package com.formdev.flatlaf.ui; import java.awt.Color; import java.awt.Component; +import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.event.MouseEvent; import java.awt.geom.Rectangle2D; import java.util.Objects; import javax.swing.Icon; @@ -31,6 +34,7 @@ import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.border.Border; +import javax.swing.event.MouseInputListener; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicTableHeaderUI; @@ -94,6 +98,11 @@ public class FlatTableHeaderUI bottomSeparatorColor = null; } + @Override + protected MouseInputListener createMouseInputListener() { + return new FlatMouseInputHandler(); + } + // overridden and made public to allow usage in custom renderers @Override public int getRolloverColumn() { @@ -252,4 +261,54 @@ public class FlatTableHeaderUI return (origBorder != null) ? origBorder.isBorderOpaque() : false; } } + + //---- class FlatMouseInputHandler ---------------------------------------- + + /** + * @since 1.6 + */ + protected class FlatMouseInputHandler + extends MouseInputHandler + { + Cursor oldCursor; + + @Override + public void mouseMoved( MouseEvent e ) { + // restore old cursor, which is necessary because super.mouseMoved() swaps cursors + if( oldCursor != null ) { + header.setCursor( oldCursor ); + oldCursor = null; + } + + super.mouseMoved( e ); + + // if resizing last column is not possible, then Swing still shows a resize cursor, + // which can be confusing for the user --> change cursor to standard cursor + JTable table; + int column; + if( header.isEnabled() && + (table = header.getTable()) != null && + table.getAutoResizeMode() != JTable.AUTO_RESIZE_OFF && + header.getCursor() == Cursor.getPredefinedCursor( Cursor.E_RESIZE_CURSOR ) && + (column = header.columnAtPoint( e.getPoint() )) >= 0 && + column == header.getColumnModel().getColumnCount() - 1 ) + { + // mouse is in last column + Rectangle r = header.getHeaderRect( column ); + r.grow( -3, 0 ); + if( !r.contains( e.getX(), e.getY() ) ) { + // mouse is in left or right resize area of last column + boolean isResizeLastColumn = (e.getX() >= r.x + (r.width / 2)); + if( !header.getComponentOrientation().isLeftToRight() ) + isResizeLastColumn = !isResizeLastColumn; + + if( isResizeLastColumn ) { + // resize is not possible --> change cursor to standard cursor + oldCursor = header.getCursor(); + header.setCursor( Cursor.getDefaultCursor() ); + } + } + } + } + } }