2013-01-04 6 views
6

スライダーのようにProgressBarをクリックして処理したいと思います。トラックの割合を知ることができます。 私はプログレスバーの代わりにスライダーを使用しますが、親指までハイライトされたトラックはありません。スライダーとプログレスバーのハイブリッドJavaFX

私は、曲を演奏する音楽プレーヤーで進歩のようなものを作成し、進捗状況をクリックして検索する必要があります。

誰にもヒントはありますか?どうすればいいですか?

+0

[あなたは何を試してみました?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

+0

私はCSSでカスタマイズを見つけることを試みました。しかし、Googleは何も与えなかった。ドキュメンテーションには、サムとトラックのような下部構造のCSSリファレンスはありません。 – Vetalll

答えて

16

は別のアプローチです。スライダーとプログレスバーのリアルハイブリッド:)。 SlidoProgressBarを見てください! style.cssにして

public class SlidoProgressBarDemo extends Application { 

    @Override 
    public void start(Stage stage) { 
     Group root = new Group(); 
     Scene scene = new Scene(root); 
     scene.getStylesheets().add(this.getClass().getResource("style.css").toExternalForm()); 
     stage.setScene(scene); 
     stage.setTitle("Progress Controls"); 

     double sliderWidth = 200; 

     final Slider slider = new Slider(); 
     slider.setMin(0); 
     slider.setMax(50); 
     slider.setMinWidth(sliderWidth); 
     slider.setMaxWidth(sliderWidth); 

     final ProgressBar pb = new ProgressBar(0); 
     pb.setMinWidth(sliderWidth); 
     pb.setMaxWidth(sliderWidth); 

     final ProgressIndicator pi = new ProgressIndicator(0); 

     slider.valueProperty().addListener(new ChangeListener<Number>() { 
      public void changed(ObservableValue<? extends Number> ov, 
        Number old_val, Number new_val) { 
       pb.setProgress(new_val.doubleValue()/50); 
       pi.setProgress(new_val.doubleValue()/50); 
      } 
     }); 

     StackPane pane = new StackPane(); 

     pane.getChildren().addAll(pb, slider); 

     final HBox hb = new HBox(); 
     hb.setSpacing(5); 
     hb.setAlignment(Pos.CENTER); 
     hb.getChildren().addAll(pane, pi); 

     scene.setRoot(hb); 
     stage.show(); 
    } 

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

.slider .track { 
    -fx-background-color:null; /* Hide the track */ 
    -fx-background-insets: 1 0 -1 0, 0, 1; 
    -fx-background-radius: 2.5, 2.5, 1.5; 
    -fx-padding: 0.208333em; /* 2.5 */ 
} 

基本的なロジックがstackpaneにスライダーと進歩を置くことです。それらに同じ幅を与えます。それらの進捗値をバインドします。スライダのトラックを非表示にします。
出力:
enter image description here

+0

母、私はそれについて考えました。しかし、私はそれがランダムなチャンスと動作すると思います。あなたはどこをクリックしているのですか?スライダまたは鉛に? – Vetalll

+0

@ Vetal.lebed。 Stackpaneは、最後に追加された子が他の子の上にくるように、子を重ねて配置します。したがって、マウスのクリックを取得するのは常にスライダ(およびその目に見えないトラック)です。さらに、プログレスバーはデフォルトでクリックできません。 –

+0

ありがとう、私はそれを知らなかった。私はアンドロイドの開発者です。 – Vetalll

1

私はコードでこの問題を解決:ここ

progress.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      if (event.getButton() == MouseButton.PRIMARY){ 
       Bounds b1 = progress.getLayoutBounds(); 
       double mouseX = event.getSceneX(); 
       double percent = (((b1.getMinX() + mouseX) * 100)/b1.getMaxX()); 
       //correcting a percent, i don't know when it need 
       percent -= 2; 
       progress.setProgress((percent)/100); 
       //do something with progress in percent 
      } 
     } 
    }); 
関連する問題