親指の中央にテキストを配置したいので、親指の位置にテキストのレイアウトを置いてみるといいでしょう。
必ずしも以下のような解決策を推奨するわけではありません。おそらくこれを達成するためのより良い方法や、少なくともラベルを付けたスライダーを独自の「コントロール」にするためのコードを構造化するためのより良い方法がありますが、これは仕事を完成させるようなものでした。
このように、スライダーの上にテキストを配置した方が、その方が使いやすいように見えました。そのため、親指をドラッグしたときにテキストがマウスポインタによって隠されることはありませんでした。
ラベル付きスライダーのアイデアは、実際にはかなりいいアイデアです。
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);
}
}
ねえ、私はあなたのアプローチを試みたし、ドラッグすると、それはうまく動作します - それは、スライダをクリックするとなると、ラベルは時に背後と変更のみを遅れているようですもう一度クリックしてください。 –
スライダをクリックしてもラグが発生しません。これを行うと、ラベルが正しい場所に移動し、クリックするとすぐに値が更新されます(テストシステムのJava 8u60、OS X 10.11.4、MacBook Air 2012)。 – jewelsea