2016-08-08 4 views
1

EclipseビューにScrollBarを実装しようとしていて、このメソッドを設定して動作を設定しようとしています。私がプログラムを実行すると、List<Number> dataの長さにかかわらず、親指はScrollBarと同じくらい大きくなり、動かすことはできません。私が間違っていることは何ですか?最大値と最小値を定義するときにスクロールバーがスタックになる

私はすでにプログラムをデバッグしたところ、ScrollBarの最大値が設定されるとすぐに、親がバーを埋めます。

private void setupScrollBar(ScrollBar scrollBar, List<Number> data) { 
    // Set max/minimum 
    if (data.size() > 0) { 
     Comparator<Number> comparator = new Comparator<Number>() { 
      @Override 
      public int compare(Number o1, Number o2) { 
       return (int) (o2.doubleValue() - o1.doubleValue()); 
      } 
     }; 

     double max, min; 
     data.sort(comparator); 
     max = data.get(data.size() - 1).doubleValue(); 
     min = data.get(0).doubleValue(); 

     scrollBar.setMax(max); 
     scrollBar.setMin(min); 
     scrollBar.setVisibleAmount(100 * (max-min)); 
    } else { 
     scrollBar.setMax(0); 
     scrollBar.setMin(0); 
    } 
} 
+0

Eclipseは通常SWTを使用しているので、JavaFXとEclipseをどのように統合していますか? –

+0

@ greg-449 FXCanvasを使用してシーンを設定します 'public void createPartControl(Composite parent){ canvas = new FXCanvas(parent、SWT.NO); SplitPane mainSplit = new SplitPane(); シーンシーン=新規シーン(mainSplit); canvas.setScene(canvas); } ' – herculanodavi

+0

@ greg-449私はe(fx)クリップを使用しました – herculanodavi

答えて

1

まず第一に、カスタムComparatorは逆Listを注文し、それはあなたが1 == 1.91.9 == 2.8が、1 != 2.8を取得しますキャストためintを、fabianによって指摘されたように生成します。

2つの引数を比較します。負の整数 ゼロまたは正の整数を返します。最初の引数は、より小さいか、 に等しいか、または2番目の引数より大きくなります。

  • あなたはdata.sort(Comparator.comparingDouble(Number::doubleValue));のような二重の比較を使用することができます。これを修正するには

  • または他の問題は、あなたがScrollBarvisibleAmountPropertyを設定する方法ですreturn (int) Math.signum(o1.doubleValue() - o2.doubleValue());
  • にごComparatorインスタンスのcompare方法を変更することもできますので、このプロパティを設定し、ScrollBarフルレンジを返し(max-min)この値は既に100%の空き領域を埋めるためにサムを生成します。

    あなたは割合を親指を設定したいと思います:

    final double PERCENTAGE = 30.0; 
    scrollBar.setVisibleAmount((max-min)/100.0*PERCENTAGE); 
    

    このコードは、利用可能なスペースの30%を埋めるために親指を持つになります。

    +1

    等価性が推移的であるという条件を満たしていないので、 'Comparator'はそれほど良くありません。例えば。そのコンパレータを使うと、 '1 == 1.9'と' 1.9 == 2.8 '、 '1!= 2.8'となるので、コンパレータの規約を満たしていません。 'Math.signum'は' int'にキャストする前に適用するか、単に 'Comparator.comparingDouble(Number :: doubleValue)'を使うべきです... – fabian

    +0

    修正のための@fabianに感謝します。私はちょうどその命令が逆転することに気づいたので、私はintキャスティングの問題を完全に見落としました。 – DVarga

    +0

    ありがとう@DVargaと@fabian!それは完全に働いた – herculanodavi

    関連する問題