Viewport und hyperlinkUpdate

  • Themenstarter Themenstarter Eichmeister
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
E

Eichmeister

Gast
Hallo. Hilfe!

In meiner Funktion hyperlinkUpdate(HyperlinkEvent he) steht folgendes:

Code:
textFenster.viewPosition = scrollPane.getViewport().getViewPosition());
textFenster.setText(erstelleNeuenHTMLText());
scrollPane.getViewport().setViewPosition(textFenster.viewPosition);

Der Code soll folgendes machen:
1. Speichere die Position des Bildausschnittes.
2. Füge einen neuen Text ein (es ist derselbe Text, jedoch sind da ein paar Zeichen unterstrichen, also fast der selbe Text). Nach dem Einfügen scrollt die scrollPane automatisch zum Schluss des Textes.
3. Da der Nutzer jedoch nichts vom Austauschprozess merken soll, scrolle bitte wieder zurück zur vorher gespeicherten Position.

Leider funktioniert das nicht. Nach der Eventverarbeitung ist der Textausschnitt trotzdem am Schluss.
Ich habe die Funktion einmal ganz am Ende angehalten und musste feststellen, dass KEINER der obigen Befehle ausgeführt wurde. Ich habe ein repaint() eingefügt, aber das wird auch nicht ausgeführt.

Weiß jemand Rat?

Grüße, van.
 
Ich lasse mir alle paar Befehle auch durch
TG_println("viewPos nach Unterstreichen: " + scrollPane.getViewport().getViewPosition());
die Position in einer Statusleiste ausgeben (und zusätzlich in der Konsole). Das wird auch tatsächlich gemacht.
Als letztes steht sogar die Position da, an die es auch soll. Jedoch entspricht das nicht der Wahrheit.
Es ist tatsächlich so, dass die println-Anweisungen ausgeführt werden, setText() und setViewPosition() jedoch nicht. Oder eben erst, nachdem alles andere in der hyperlinkUpdate() abgearbeitet ist.
 
Kannst du evtl. mal etwas mehr von deiner textfenster-Klasse schreiben - bzw. über das Objekt.
 
Gerne.

Code:
public class TextFenster extends JEditorPane implements Scrollable{
	
	public String text;
	
	/**
	 * Wann immer ein HyperlinkEvent eintritt, verschiebt sich die ViewPortPosition.
	 * Mir war nicht möglich, herauszufinden, wann dies geschieht und es in der
	 * Ereignisbehandlung wiederherzustellen. 
	 * Die ViewPortPosition-Verschiebung muss irgendwann zwischen den Ereignissen passieren, vielleicht
	 * bei einem verspäteten repaint().
	 * Also speichern wir die Position einfach fleißig mit und aktualisieren sie ständig.
	 */
	public Point viewPosition;
	
	TextFenster() {
		setEditable(false);
		setMinimumSize(new Dimension(500,768));
		setContentType("text/html");
		viewPosition = new Point();
	}

}

Gepackt ist das Ding in eine JScrollPane.
 
Vielleicht gibt's Probleme mit deiner viewPosition-Variable.

Versuch's doch mal so:
Code:
Point pos = scrollPane.getViewport().getViewPosition());
System.out.println(scrollPane.getViewport().getViewPosition());
textFenster.setText(erstelleNeuenHTMLText());
System.out.println(scrollPane.getViewport().getViewPosition());
scrollPane.getViewport().setViewPosition(pos);
System.out.println(scrollPane.getViewport().getViewPosition());

Und poste dann die 3 Werte
 
java.awt.Point[x=0,y=819]
java.awt.Point[x=0,y=819]
java.awt.Point[x=0,y=819]

Doch dieser Textausschnitt wird nicht gezeigt, sondern java.awt.Point[x=0,y=969], wie die Abfrage des nächsten Events zeigt.

Zur Information: Der Text im textFenster enthält Hyperlinks. Beim mouseover, also "ENTERED"-hyperlinkEvent, sollen ein paar Zeichen im Text unterstrichen dargestellt werden. Dies geschieht durch
Code:
textFenster.setText(unterstreicheZeichenEx(..));
Beim "EXITED" soll dann wieder der ursprüngliche Text ohne Unterstreichung angezeigt werden, also
Code:
textFenster.setText(erstelleNeuenHTMLText());

Die gesamte Funktion sieht bei mir so aus:

Code:
public void hyperlinkUpdate(HyperlinkEvent he)
	{
		TG_println(he.getEventType().toString());
		
		//Nun wird aufgeteilt, in welchem der vielen Fenster das Ereignis stattfand.
		//Jedes Fenster hat seine eigene Fallunterscheidung für ENTERED, ACTIVATED und EXITED.
		
		if(he.getSource().equals(textFenster))
		{
			if(he.getEventType().toString() == "ACTIVATED")
			{
				TG_println("Neue ViewportPosition: " + textFenster.viewPosition);
				
				long index = Long.valueOf(he.getDescription());
				TG_println("Auf Link #" + index + " geklickt!");
				
				kommentarFenster.aktuellerKommentar.x = sucheNachTimestamp(index);
				kommentarFenster.aktuellerKommentar.y = 0;
				zeigeKommentare(kommentarFenster.aktuellerKommentar.x);	
				
			}
			else if(he.getEventType().toString() == "ENTERED")
			{
				
				textFenster.viewPosition = scrollPane.getViewport().getViewPosition();
				TG_println("Neue ViewportPosition: " + scrollPane.getViewport().getViewPosition());
				
				long index = Long.valueOf(he.getDescription());
				kommentarFenster.aktuellerKommentar.x = sucheNachTimestamp(index);
				kommentarFenster.aktuellerKommentar.y = 0;
				
				textFenster.setToolTipText("" + kommentarVector.get(kommentarFenster.aktuellerKommentar.x).size() + " Kommentar(e)");
				
				textFenster.setText(unterstreicheZeichenEx(kommentarVector.get(kommentarFenster.aktuellerKommentar.x).get(0).start, kommentarVector.get(kommentarFenster.aktuellerKommentar.x).get(0).end));
				TG_println("viewPos nach Unterstreichen: " + scrollPane.getViewport().getViewPosition());
				scrollPane.getViewport().setViewPosition(textFenster.viewPosition);
				TG_println("viewPos nach Unterstreichen: " + scrollPane.getViewport().getViewPosition());
				
			}
			else if(he.getEventType().toString() == "EXITED")
			{			
				textFenster.setText(erstelleNeuenHTMLText());
				TG_println("Neue ViewportPosition: " + scrollPane.getViewport().getViewPosition());
			}
			
			
			TG_println("Neue ViewportPosition NACH Eventverarbeitung: " + scrollPane.getViewport().getViewPosition());
			
		}
		else if(he.getSource().equals(kommentarFenster))
		{
			//hier nicht von Interesse.
		}
	}

Aber tausend Dank schonmal fürs Interesse und die Bemühung!
 
Hmm, da scheint eine andere Methode/ein anderes Event die ViewPosition zu ändern.

Du kannst ja mal einen Breakpoint an den Anfang der Methode setzen und dann nachsehen, was so passiert.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben