From fd56de403d68392c849a4f03565cd5f5b3699c30 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 13 Sep 2021 22:05:48 +0200 Subject: [PATCH] Slider: fixed calculation of baseline (see also PR #214) --- CHANGELOG.md | 2 ++ .../com/formdev/flatlaf/ui/FlatSliderUI.java | 24 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46723dfe..4a56d068 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ FlatLaf Change Log 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. +- Slider: Fixed calculation of baseline, which was wrong under some + circumstances. ## 1.5 diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index b44f769f..5a1b7352 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -18,9 +18,11 @@ package com.formdev.flatlaf.ui; import java.awt.Color; import java.awt.Dimension; +import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Insets; import java.awt.Rectangle; import java.awt.Shape; import java.awt.event.MouseEvent; @@ -176,9 +178,27 @@ public class FlatSliderUI if( slider.getOrientation() == JSlider.VERTICAL ) return -1; + // use default font (instead of slider font) because the slider font size + // may be different to label font size, but we want align the track/thumb with labels + Font font = UIManager.getFont( "defaultFont" ); + if( font == null ) + font = slider.getFont(); + FontMetrics fm = slider.getFontMetrics( font ); + + // calculate track y coordinate and height + // (not using field trackRect here because slider size may be [0,0] + // and field trackRect may have invalid values in this case) + Insets insets = slider.getInsets(); + int thumbHeight = getThumbSize().height; + int contentHeight = height - insets.top - insets.bottom - focusInsets.top - focusInsets.bottom; + int centerSpacing = thumbHeight + + (slider.getPaintTicks() ? getTickLength() : 0) + + (slider.getPaintLabels() ? getHeightOfTallestLabel() : 0); + int trackY = insets.top + focusInsets.top + (contentHeight - centerSpacing - 1) / 2; + int trackHeight = thumbHeight; + // compute a baseline so that the track is vertically centered - FontMetrics fm = slider.getFontMetrics( slider.getFont() ); - return trackRect.y + Math.round( (trackRect.height - fm.getHeight()) / 2f ) + fm.getAscent() - 1; + return trackY + Math.round( (trackHeight - fm.getHeight()) / 2f ) + fm.getAscent() - 1; } @Override