Event Handling vertical ValueProperty() alter Wert gleich neuer Wert

mirisbowring

Bekanntes Mitglied
Abend,

ich möchte im Prinzip einen ScrollListener bauen, der je nachdem, ob man nach oben oder unten scrollt, ein Event auslöst.
Als erstes hatte ich den ScrollPane.setOnScroll() verwendet, allerdings hat der erst eingesetzt, wenn man ganz ans untere/obere Ende gescrollt hat.
Deshalb verwende ich nun die vvalueProperty()...
Java:
final double previous=1.0;
                scrollPane.vvalueProperty().addListener((o,oldVal,newVal)->{
                    if((contentContainer.getHeight()-Main.getStage().getHeight())>110){
                        if(oldVal.doubleValue()>previous){
                            //doSomething
                        }else{
                            //doSomething
                        }                      
                    }
                        System.out.println(oldVal.doubleValue());
                        System.out.println(newVal.doubleValue());
                    previous = oldVal.doubleValue();
                });
Hier habe ich nun festgestellt, dass oldVal und newVal immer genau dieselben werte haben.
in der ersten if-clause frage ich lediglich die Differenz zwischen 2 Elementen ab (was auch einwandfrei funktioniert).
In der zweiten if-clause wollte ich ursprünglich folgendes verwenden:
Java:
if(oldVal < newVal)
Da oldVal und newVal allerdings immer den selben Wert haben, wird sich diese Bedingung nie erfüllen.
Also habe ich außerhalb ein double erstellt (previous), der den Wert vom vorherigen Event "speichern" soll (um in der zweiten if wieder verglichen werden zu können).
Hier habe ich nun das Problem, dass der Wert Final sein muss, ihm dann aber kein neuer Wert mehr zugewiesen werden kann.

Nun die Fragen:
1. Warum sind die beiden Werte (old und new) identisch?
2. gibt es ein workaround für mein Problem? (das allmächtige google konnte mir bisher nicht helfen, bzw. war ich nicht in der Lage es richtig zu nutzen :D)

Gruß
mirisbowring
 

HarleyDavidson

Bekanntes Mitglied
Servus!
Was du benötigst ist ein AdjustmentListener auf der VerticalScrollBar:
Java:
JScrollPane scrollPane = new JScrollPane();
jScrollPane.getVerticalScrollBar().addAdjustmentListener( new AdjustmentListener()
{

    @Override
    public void adjustmentValueChanged( AdjustmentEvent e )
    {
        //hoch scrollen >> Wert wird kleiner
        //runter scrollen >> Wert wird größer
        System.out.println( e.getValue() );
    }
});
Wenn du dir den letzten Wert speicherst und dann vergleichst, kannst du feststellen, ob der Benutzer gerade hoch oder runter scrollt.
 

mirisbowring

Bekanntes Mitglied
Das habe ich in Swing damals auch so gemacht, aber jetzt nutze ich ja das javafx scrollPane, und das hat andere Funktionen :)

PS: hätte ich oben erwähnen sollen :/
 

Jardcore

Top Contributor
final double previous=1.0;
Du weißt was final bedeutet? :)

Bin nicht mehr ganz in JavaFx drin, aber könnte der Ansatz dir helfen? .. ohne lamdas
Java:
scrollPane.vvalueProperty().addListener(new ChangeListener<Number>() {
     private double oldValue = 0;
     @Override
     public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue)
              // hier nochmal deine Logik aber mit dem oldValue der anonym Klasse
     }
});
 

mirisbowring

Bekanntes Mitglied
Du weißt was final bedeutet? :)
Jup das weiß ich...
Allerdings hatte ich das Problem, dass ´die eine Zeile von meinem Custom Code einen Final Wert verlangt hat (frag mich nicht warum, ich habe lediglich den compile error gelesen), somit aber eine andere Codezeile Probleme hatte^^

Nachdem ich mein JDK neu installiert habe (hatte alle möglichen Versionen auf dem Rechner) funktionieren die Lambdas auch wieder wie sie sollen :D

also der oldVal ist nun der alte und der newVal der neue Wert -> Das Problem ist also gelöst


Danke für eure Hilfsbereitschaft :)
 

Ähnliche Java Themen

Neue Themen


Oben