2016-05-27 7 views
3

シーンにスライダとラベルがあります。私は、スライダの値に応じてラベルのテキストを設定し、スライダのドラッグボタンのすぐ下に配置する匿名メソッドを作成しました。JavaFX:ラベルの位置がスライダのドラッグボタンの位置と一致しません

この文脈では、timeSliderはスライダーであり、timeLabelは先に参照したラベルです。ここ

は、スライダを基準にしたラベルの位置ずれの写真である。 enter image description here

上記画像はスライダが最小値であるとき、標識は直接下にあることを示しています。 enter image description here

ただし、スライダが最大値にある場合、ラベルはスライダと正しく位置合わせされていません。

私はこのことが起こるにはどうしたら間違っているのかについての洞察を本当に感謝しています。

ありがとうございました。

答えて

0

あなたのラベルとテキストが左揃えのように見えます。それを中心に置き、違いが何であるかを見てください。

1

親指の中央にテキストを配置したいので、親指の位置にテキストのレイアウトを置いてみるといいでしょう。

必ずしも以下のような解決策を推奨するわけではありません。おそらくこれを達成するためのより良い方法や、少なくともラベルを付けたスライダーを独自の「コントロール」にするためのコードを構造化するためのより良い方法がありますが、これは仕事を完成させるようなものでした。

このように、スライダーの上にテキストを配置した方が、その方が使いやすいように見えました。そのため、親指をドラッグしたときにテキストがマウスポインタによって隠されることはありませんでした。

ラベル付きスライダーのアイデアは、実際にはかなりいいアイデアです。

min mid max

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); 
    } 
} 
+0

ねえ、私はあなたのアプローチを試みたし、ドラッグすると、それはうまく動作します - それは、スライダをクリックするとなると、ラベルは時に背後と変更のみを遅れているようですもう一度クリックしてください。 –

+0

スライダをクリックしてもラグが発生しません。これを行うと、ラベルが正しい場所に移動し、クリックするとすぐに値が更新されます(テストシステムのJava 8u60、OS X 10.11.4、MacBook Air 2012)。 – jewelsea

関連する問題