2016-08-08 50 views
1

Ich versuche, eine ScrollBar in meine Eclipse View zu implementieren und diese Methode einzurichten, um ihr Verhalten einzurichten. Wenn ich das Programm ausführe, egal wie lange der List<Number> data ist, wird der Daumen so groß sein wie der ScrollBar und nicht in der Lage sich zu bewegen. Was mache ich falsch?ScrollBar bleibt bei der Definition von Max und Min hängen

Ich debuggte bereits das Programm und sobald ScrollBar Maximum eingestellt ist, füllt der Daumen die Leiste.

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

Da Eclipse normalerweise SWT verwendet, wie integrieren Sie JavaFX mit Eclipse? –

+0

@ greg-449 Ich benutze FXCanvas und setze eine Szene 'public void createPartControl (zusammengesetzte Eltern) { Canvas = neue FXCanvas (Eltern, SWT.NO); SplitPane mainSplit = new SplitPane(); Szenenszene = neue Szene (mainSplit); canvas.setScene (Leinwand); } ' – herculanodavi

+0

@ greg-449 Ich benutzte e (fx) clipse – herculanodavi

Antwort

1

Zu allererst Ihre benutzerdefinierten Comparator erzeugt ein Reverse bestellt List und wie es wurde von fabian darauf hingewiesen, wegen der int Gießen Sie 1 == 1.9 und 1.9 == 2.8 aber 1 != 2.8 bekommen.

Vergleicht die beiden Argumente für die Reihenfolge. Gibt eine negative Ganzzahl, Null oder eine positive ganze Zahl zurück, wenn das erste Argument kleiner als, gleich oder größer als die zweite Zahl ist.

dies zu beheben:

  • Sie doppelt Vergleich wie data.sort(Comparator.comparingDouble(Number::doubleValue)); verwenden können.
  • oder könnte die compare Methode Ihrer Comparator Instanz return (int) Math.signum(o1.doubleValue() - o2.doubleValue());

Das andere Problem ist, ändern, wie Sie die visibleAmountProperty der ScrollBar gesetzt: (max-min) die vollständige Palette der ScrollBar zurückkehrt, so dass diese Eigenschaft auf Dieser Wert erzeugt bereits den Daumen, um den 100% verfügbaren Platz zu füllen.

Sie können dies beheben, wenn z. Sie möchten, dass die Daumen für einen Prozentsatz festlegen:

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

Dieser Code-Schnipsel in mit dem Daumen führen 30% der zur Verfügung stehenden Raum zu füllen.

+1

Es ist überhaupt kein guter' Comparator', da es die Bedingung nicht erfüllt, dass Gleichheit transitiv ist. Z.B. Mit diesem Vergleicher erhält man '1 == 1.9' und' 1.9 == 2.8' aber '1! = 2.8', so dass dies nicht dem Vertrag von' Comparator' entspricht. Entweder 'Math.signum' sollte angewendet werden, bevor es in' int' umgewandelt wird oder einfach 'Comparator.comparingDouble (Number :: doubleValue)' sollte verwendet werden ... – fabian

+0

Danke @fabian für die Korrektur. Ich habe gerade bemerkt, dass die Reihenfolge umgekehrt wird, also habe ich das Problem mit dem Int Casting völlig übersehen. – DVarga

+0

Danke @DVarga und @fabian! Es hat perfekt funktioniert – herculanodavi