Viewport der JScrollPane gibt falsche Höhe zurück

darkmagic2002

Mitglied
Heyhey,
für die Nutzungsbedingungen brauche ich einen Text, darunter ein Kontrollkästchen, das erst aktiviert werden kann, wenn man den Text ganz heruntergescrollt hat:
Ich habe ein(e)
  • JCheckBox-Objekt
  • JEditorPane auf einer JScrollPane

Java:
JEditorPane jep = new JEditorPane("<html>dies ist ein HTML-Text</html>");
JScrollPane sp = new JScrollPane(jep);
//Kontrollkästchen

//dem Viewport des JScrollPane-Objekts ChangeListener hinzufügen

//wird aufgerufen beim Scrollen
public void stateChanged(ChangeEvent e)
{
	if (sp.getViewport().getViewPosition().y >=
				sp.getHeight())
	{
		//Kontrollkästchen aktivieren
	}
}

Jedoch gibt
Java:
sp.getHeight()
nicht die maximale Größe zurück sondern irgendeinen meist kleineren Wert. Dass bewirkt hier, dass das CheckBox-Objekt zu früh aktiviert wird.

Mögliche Lösungen:
  • Ich teste die Maximalposition mit
Java:
sp.getViewport().getViewPosition().y
wenn ich ganz heruntergescrollt habe und übernehme das ins Programm als festen Wert, den muss ich allerdings bei Änderungen und für jede Sprache neu angeben, da sich die Textlänge geringfügig ändert.

  • Ich lasse zur Laufzeit den Scrollbalken ganz nach unten setzen, dann den Wert erfragen und ihn dann wieder ganz nach oben setzen; ich weiß allerdings nicht, wie das geht.

Hatte jemand das Problem schon einmal oder weiß jemand eine Lösung oder einen Vorschlag.
Für jede Hilfe wäre ich dankbar. Denn der erstgenannte Lösungsvorschlag ist ziemlich umständlich.

MfG,
kevin
 
Hallo,

ich habe vor kurzer Zeit ein ähnliches Problem gelöst.
Abhilfe schafft der AdjustmentListener.
Dieser AdjustmentListener wird dem Vertikalen Scrollbalken vom JScrollPane zugeordnet.

Code:
scrollpane.getVerticalScrollBar() //Referenz auf den Vertikalen Scrollbalken

Die Methode für den Listener:
Code:
public void adjustmentValueChanged(AdjustmentEvent ae) {
     //TODO: was soll passieren? *
}

* In deinem Fall brauchst du: (siehe http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JScrollBar.html)
Code:
getMaximum() //Länge des Scrollbalkens
getValue() //Momentane Position (glaube von der Oberkante des Schiebers)
getVisibleAmount() //(glaube das ist die Länge des Schiebers)

getValue() in unterster Position ergibt mit getVisibleAmount() zusammen getMaximum().

Du kannst es dann einfach mittels if() abfragen und dort den Status von deiner Checkbox ändern.
 
Zuletzt bearbeitet:
Hallo noch einmal,
haha! Jetzt darf ich eine fröhliche Botschaft überbringen: Es klappt auf Anhieb!!
Vielen Dank! Besser hätte die Antwort nicht sein können..
Lg,
kevin
 

Neue Beiträge

Zurück