Viewport und hyperlinkUpdate

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.
 
G

Guest

Gast
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.
 

Ariol

Top Contributor
Kannst du evtl. mal etwas mehr von deiner textfenster-Klasse schreiben - bzw. über das Objekt.
 
G

Guest

Gast
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.
 

Ariol

Top Contributor
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
 
G

Guest

Gast
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!
 

Ariol

Top Contributor
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.

Ähnliche Java Themen


Oben