JavaFX:标签的位置与滑块中拖动按钮的位置不匹配

JavaFX:标签的位置与滑块中拖动按钮的位置不匹配,java,javafx,slider,Java,Javafx,Slider,在我的场景中有一个滑块和一个标签。我已经编写了一个匿名方法,它将根据滑块的值设置标签的文本,然后将其直接放置在滑块的拖动按钮下 timeSlider.valueProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Num

在我的场景中有一个滑块和一个标签。我已经编写了一个匿名方法,它将根据滑块的值设置标签的文本,然后将其直接放置在滑块的拖动按钮下

timeSlider.valueProperty().addListener(new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                final double timeSliderMin = timeSlider.getMin();
                timeLabel.setText(String.valueOf(newValue.intValue()));
                timeLabel.setLayoutX(timeSlider.getLayoutX() + (timeSlider.getValue() - timeSliderMin)
                        / (timeSlider.getMax() - timeSliderMin) * timeSlider.getWidth());
            }
});
timeSlider.valueProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observevalue在我看来,您的标签和文本似乎是对齐的。试着将其居中,看看有什么区别。

您希望文本居中于拇指上,所以我想我会尝试将文本的布局建立在拇指的位置上,效果很好

我不一定推荐下面这样的解决方案。可能有更好的方法来实现这一点,或者至少有更好的方法来构造代码,使带标签的滑块成为自己的“控件”,但这只是我想出的似乎能完成任务的方法

注意,我将文本放在滑块上方,因为这样看起来更有用。因为这样,当你拖动拇指时,文本不会被鼠标指针遮挡

顺便说一句,标签滑块的想法实际上是个不错的主意


嘿,我尝试过你的方法,拖动时效果很好-但是当点击滑块时,标签似乎落后,只有再次点击时才会更改。我在点击滑块时没有任何滞后。当我这样做时,标签移动到正确的位置,并在点击时立即更新其值(测试系统Java 8u60,OS X 10.11.4,MacBook Air 2012)。
import javafx.application.Application;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.*;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class LabeledSlider extends Application {
    @Override
    public void start(Stage stage) {
        Text text = new Text();
        text.setTextOrigin(VPos.TOP);
        Slider slider = new Slider(7, 7_700, 4_200) {
            @Override
            protected void layoutChildren() {
                super.layoutChildren();

                Region thumb = (Region) lookup(".thumb");
                if (thumb != null) {
                    text.setLayoutX(
                            thumb.getLayoutX() 
                                    + thumb.getWidth() / 2 
                                    - text.getLayoutBounds().getWidth() / 2
                    );
                }
            }
        };
        slider.setLayoutY(20);
        text.textProperty().bind(slider.valueProperty().asString("%,.0f"));

        Pane sliderPane = new Pane(slider, text);
        slider.prefWidthProperty().bind(sliderPane.widthProperty());
        sliderPane.setPrefWidth(200);

        StackPane layout = new StackPane(sliderPane);
        layout.setPadding(new Insets(10));

        stage.setScene(new Scene(layout));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}