From cfb19f311710b4fee736642ff060a975d71b5fe2 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 3 Sep 2019 16:40:55 +0200 Subject: [PATCH] ScrollPane: if having a column header (e.g. JTable), then increase height of vertical scroll bar so that it also fills the upper right corner --- .../formdev/flatlaf/ui/FlatScrollPaneUI.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java index 4705ce6e..6a55d867 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java @@ -17,8 +17,10 @@ package com.formdev.flatlaf.ui; import java.awt.Component; +import java.awt.Container; import java.awt.Graphics; import java.awt.Insets; +import java.awt.Rectangle; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; import java.awt.event.FocusEvent; @@ -27,7 +29,9 @@ import java.beans.PropertyChangeEvent; import javax.swing.JComponent; import javax.swing.JScrollPane; import javax.swing.JViewport; +import javax.swing.ScrollPaneLayout; import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicScrollPaneUI; /** @@ -44,6 +48,22 @@ public class FlatScrollPaneUI return new FlatScrollPaneUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + if( scrollpane.getLayout() instanceof UIResource ) + scrollpane.setLayout( new FlatScrollPaneLayout() ); + } + + @Override + public void uninstallUI( JComponent c ) { + if( scrollpane.getLayout() instanceof FlatScrollPaneLayout ) + scrollpane.setLayout( new ScrollPaneLayout.UIResource() ); + + super.uninstallUI( c ); + } + @Override protected void installListeners( JScrollPane c ) { super.installListeners( c ); @@ -144,4 +164,27 @@ public class FlatScrollPaneUI scrollpane.repaint(); } } + + //---- class FlatScrollPaneLayout ----------------------------------------- + + private static class FlatScrollPaneLayout + extends ScrollPaneLayout + { + @Override + public void layoutContainer( Container parent ) { + super.layoutContainer( parent ); + + // increase height of vertical scroll bar so that it also fills the upper right corner + if( colHead != null && vsb != null && colHead.isVisible() && vsb.isVisible() ) { + Rectangle colHeadBounds = colHead.getBounds(); + Rectangle vsbBounds = vsb.getBounds(); + + if( vsbBounds.y > colHeadBounds.y ) { + vsbBounds.height += (vsbBounds.y - colHeadBounds.y); + vsbBounds.y = colHeadBounds.y; + vsb.setBounds( vsbBounds ); + } + } + } + } }