From 072bdfb27601479f152bb46c5a82257f2b68efbd Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 28 Aug 2019 22:21:56 +0200 Subject: [PATCH] TabbedPane: re-implemented paintContentBorder() because super.paintContentBorder() uses UIManager.getColor(), which is not GUI builder friendly --- .../formdev/flatlaf/ui/FlatTabbedPaneUI.java | 56 +++++++++++++++---- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index 9095b356..5c8fdb68 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -80,6 +80,7 @@ public class FlatTabbedPaneUI protected int tabHeight; protected int tabSelectionHeight; protected int contentSeparatorHeight; + protected boolean tabsOverlapBorder; public static ComponentUI createUI( JComponent c ) { return new FlatTabbedPaneUI(); @@ -100,6 +101,7 @@ public class FlatTabbedPaneUI tabHeight = UIManager.getInt( "TabbedPane.tabHeight" ); tabSelectionHeight = UIManager.getInt( "TabbedPane.tabSelectionHeight" ); contentSeparatorHeight = UIManager.getInt( "TabbedPane.contentSeparatorHeight" ); + tabsOverlapBorder = UIManager.getBoolean( "TabbedPane.tabsOverlapBorder" ); // scale textIconGap = scale( textIconGap ); @@ -311,20 +313,54 @@ public class FlatTabbedPaneUI } } + /** + * Actually does the nearly the same as super.paintContentBorder() but + * - content pane is always opaque + * - not using UIManager.getColor("TabbedPane.contentAreaColor") to be GUI builder friendly + * - not invoking paintContentBorder*Edge() methods + */ @Override - protected void paintContentBorderTopEdge( Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h ) { - } + protected void paintContentBorder( Graphics g, int tabPlacement, int selectedIndex ) { + if( tabPane.getTabCount() <= 0 ) + return; - @Override - protected void paintContentBorderLeftEdge( Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h ) { - } + Insets insets = tabPane.getInsets(); + Insets tabAreaInsets = getTabAreaInsets( tabPlacement ); - @Override - protected void paintContentBorderBottomEdge( Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h ) { - } + int x = insets.left; + int y = insets.top; + int w = tabPane.getWidth() - insets.right - insets.left; + int h = tabPane.getHeight() - insets.top - insets.bottom; - @Override - protected void paintContentBorderRightEdge( Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h ) { + // remove tabs from bounds + switch( tabPlacement ) { + case LEFT: + x += calculateTabAreaWidth( tabPlacement, runCount, maxTabWidth ); + if( tabsOverlapBorder ) + x -= tabAreaInsets.right; + w -= (x - insets.left); + break; + case RIGHT: + w -= calculateTabAreaWidth( tabPlacement, runCount, maxTabWidth ); + if( tabsOverlapBorder ) + w += tabAreaInsets.left; + break; + case BOTTOM: + h -= calculateTabAreaHeight( tabPlacement, runCount, maxTabHeight ); + if( tabsOverlapBorder ) + h += tabAreaInsets.top; + break; + case TOP: + default: + y += calculateTabAreaHeight( tabPlacement, runCount, maxTabHeight ); + if( tabsOverlapBorder ) + y -= tabAreaInsets.bottom; + h -= (y - insets.top); + } + + // paint content area + g.setColor( contentAreaColor ); + g.fillRect( x, y, w, h ); } @Override