JTextArea Minimap

Ich suche seit einiger Zeit nach einer Art Minimap, die sich hier rechts im Bild befindet:

Habt ihr ne Idee wie man sowas machen koennte?

Diese Minimap zeigt eigentlich den Inhalt der Area live im Kleinformat an, es ist ebenfalls der sichtibare Bereich gekennzeichnet und falls man irgendwo hinklickt dann sollte man in der Area auch nach dort springen…

Es waere nett wenn jmd den Titel in Minimap aendern koennte :smiley:

grundsätzlich ist das mit bekannten Mitteln aufgebaut,
Platz einer JTextArea festlegen, Schriftgröße, Inhalt (entweder alles oder tricksen, dynamisch nachladen (*) je nach Anzeigebereich, aber hier wohl unnötig)

Listener auf ScrollBar oder was sich da anbietet, von Selektion aus notfalls durch Probieren ausgerechnet, was exakt gerade angezeigt wird,
diesen Text in den großen Bereich anzeigen (* fast dieselbe Aufgabe wie oben)

viel Kleinarbeit, wenn fertig zu kopieren wäre das natürlich besser, aber da kann ich nichts nennen und auch nix zu suchen ;(

edit: oder gehört die ScrollBar zur großen TextArea? na kann man wohl so oder so bauen,
wenn sich die ScrollBar bewegt, dann tut sich in beiden Teilen was,

in eine große JTextArea rechts noch zusätzlich etwas einfügen scheint mir unnötig schwer,
lieber die ScrollBar zur rechnten kleinen Area und die große Fläche separat befüllen,
geht aber mit einfachen Mitteln wohl nur zeilenweise, kein sanftes Scrollen…

Ich habe jetzt zum Beispiel keine Ahnung wie ich die Schrift auf dieser Minimap erzeugen sollte und dann auch in den richtigen Farben…

Hm… so ganz hab’ ich SlaterBs Hinweise nicht verstanden. Aber ich glaube, mein erster Ansatz wäre ein anderer gewesen: Ich würde das ganze nicht als eigene TextArea mit kleinem Font oder so machen, sondern schlicht eine (oder sogar DIE!) vorhandene TextArea in ein passend skalierte Graphics2D eines Bildes reinmalen. Tatsächlich mache ich sowas ähnliches schon in einem Programm das ich gerade bastle, und es liegt schon in meiner Todo-Liste, das für allgemeine Components zu machen (und nicht nur für die spezielle, die ich gerade verwende). (Vielleicht bastel’ ich da morgen gleich mal weiter, aber das ist kein Versprechen)

An sowas habe ich auch gedacht, naemlich irgendwie die TextArea klein zu skalieren und dann einfach das Bild einer Komponenten hinzufuegen, nur hab ich keibe Ahnung wie ^^ ansaetze gerne willkommen ;D

den Text darstellen musst du doch so oder so,
das Problem hat man doch schon ganz ohne die kleine Laufleiste,

generell die Schriftgröße runter setzen sollte danach dann nicht mehr die Schwierigkeit sein…

Also die große Textarea dürfte ja in vollem Umfang in einer Scrollpane sein. Von daher sollte es genügen, wenn man sie in ein BufferedImage rendert und skaliert in einen anderen Panel zeichnet. Die Texarea selbst rendert man, indem man ihre “paintComponent()”-Methode mit dem Graphicsobjekt des BIs aufruft. Das Problem dabei ist jetzt, dass die TextArea 2 mal gerendert wird (1 mal ins BI und das 2. mal für die Anzeige). Dagene hilfts, wenn man die TextArea nur “virtuell” instanziert, sie einmal in ein BI rendert und dieses BI einmal in 100% in einem Panel im ScrollPane und das andere mal verkleinert in einem Panel daneben anzeigt. So bekäme man auch jedes Syntax highlighting mit verkleinert.

Ah ok. Danke Spacerat :smiley:

@SlaterB : Wie gesagt, mir ist nicht ganz klar, welchen Ansatz du verfolgen würdest, aber… die Schritgröße runtersetzen ist so eine Sache. Man kann zumindest sicher sein, dass es nicht funktionieren wird, wenn man versucht, das als “normale JTextArea mit sehr kleinem Text” umzusetzen. Fonts sind immer kacke. Insbesondere sind sie nicht stufenlos skalierbar (und inwieweit die Skalierung eines Fonts über seine size “linear” ist, bezüglich Höhe oder Breite), ist nochmal was anderes.

[QUOTE=Marco13]Insbesondere sind sie nicht stufenlos skalierbar (und inwieweit die Skalierung eines Fonts über seine size “linear” ist, bezüglich Höhe oder Breite), ist nochmal was anderes.[/QUOTE]Äehm… Fonts sind “relativ” stufenlos skalierbar, TTFs zumindest. Leider kann man unterhalb der Schriftgrösse 10 (also 10 Pixel hoch) nicht mehr viel erkennen, weil da streiken dann auch sämtliche programmgesteuerten Skalierungsmassnahmen (an denen beis ich mir grad die Zähne aus XD). Allerdings halte ich die schlichte Skalierung der Schriftgröße angesichts des Highlightings für höchst unkomfortabel, aber ich denke mal, da sind wir uns einig.

Mit deiner Aussage liegst du „relativ“ richtig :wink: Das bringt aber nichts. Wenn man einen Text hat, der mit Fontgröße 50 genau 500 Pixel breit ist, dann wird der mit Fontgröße 10 mit Sicherheit nicht 100 Pixel breit sein. Tatsächlich ist es sogar so, dass das Zeichnen des Textes mit der Fontgröße und ggf. einer Skalierung zusammenhängt. Wenn man ein Graphics-Objekt hat, in dem ein Rectangle mit einem Text drin gezeichnet wird (und der Text passt genau ins Rectangle), und man skaliert dann das Graphics mit g.scale(0.1, 0.1) und führt danach die gleiche Zeichenoperation durch, dann kann es gut sein, dass in dieser skaliert gezeichneten Variante der Text über das Rectangle hinausragt. Ich bleibe bei meinem Mantra: Fonts sind immer kacke.

*** Edit ***

Habe mal ein bißchen an diesem Overview-Teil gebastelt, allerdings sind die Anforderungen in meinem Fall teilweise schon SEHR anders, als hier, deswegen weiß ich nicht, ob da irgendwas sinnvolles rauskommt.

(Und nebenbei: Das einigermaßen effizient UND schön zu machen ist gar nicht sooo trivial…)

Unabhängig davon irritiert mich der Screenshot etwas: Sind Scrollbalken nicht (zumindest seit Mitte der 90er) praktisch immer proportional? D.h. der Scrollbalken-Knopf sollte doch eigentlich immer genau so groß sein, wie der grau hinterlegte Bereich?

wozu sich so sehr über die Font aufregen? vielleicht kann man es im Screenshot genauer erkennen, ich nicht,
allgemein ist aber doch gar nicht gesagt wie große und kleine Sicht aussehen sollen,

warum sollte ein skaliertes Bild, oder was auch immer, besser sein als das was man von Texteditor bei bestimmter Zoom-Stufe bekannt ist,

der große Text muss auf jeden Fall richtiger Text sein, darin will man ja editieren,
die kleine Laufleiste von oben bis unten viele tausend Pixel als Bild, oder mehrere Ausschnitte einzeln oder bei jedem Scrollen neue Bilder rendern?
das erscheint mir unnötig,
warum nicht einfach den normalen Text mit kleinerer Schriftart?

Monospace-Schriftart macht es vielleicht leichter als allgemein,
ob es schwerwiegende Probleme gibt sieht man bei der Umsetzung, vielleicht diese Erfahrung schon genannt

[QUOTE=SlaterB]…warum sollte ein skaliertes Bild, oder was auch immer, besser sein als das was man von Texteditor bei bestimmter Zoom-Stufe bekannt ist…[/QUOTE]Weil in einem Bild nicht nur der Font als solches skaliert ist, sondern auch sämtliche Farben evtl vorhandener HighLights vorhanden sind. :wink:
Lesbar muss der Text im Preview ja nicht unbedingt bleiben.

Naja, man kann drüber streiten, wie “wichtig” bestimmte Dinge sind, oder welcher Ansatz jeweils der sinnvollste ist.

Ich habe gerade nochmal probiert, wie das mit einem verkleinerten Font aussehen würde. Und es könnte sogar gar nicht so schlecht sein. Wie man die Fontgröße für die Übersicht bestimmten soll, damit sie immer alles anzeigt, weiß ich aber nicht. Und wie man den Inhalt (inklusive Highlighting) übertragen kann, muss man sich auch überlegen (vielleicht können die beiden TextAreas aber einfach das gleiche Document als Model haben, das würde schon einiges einfacher machen). Aber letztendlich hat man dann eine zweite TextArea. Man kann da reinklicken und darin rumeditieren. Das müßte man schonmal irgendwie verhindern. Dann gibt es Dinge, die nur schwer übertragen werden können - z.B. wenn Textblöcke markiert sind.

Und vorbehaltlich (!) der Frage, ob dieses allgemeine Ziel für die in diesem Thread gestellten Anforderungen den geeignetsten Ansatz subsumiert: Letztendlich ging es MIR bei dem, was ich ursprünglich mal vorhatte, nicht nur im eine TextArea, sondern um beliebige Components. Und wenn man das versucht, können eben … seltsame Effekte auftreten. Im Anhang zwei Bilder von eine TextArea, die einmal normal dargestellt wird, und einmal in ein Bild mit skalierendem Graphics2D reingezeichnet wird. Die beiden unterscheiden sich nur minimal im Skalierungsfaktor. Und man sieht, dass das in beiden Fällen sch…lecht aussieht.

Dort stellen sich dann aber andere, ebenso interessante und schwierige Fragen: Wie skaliert man das Bild vernünftig? Das Bild ist riesig. Bei einfachem skalieren frißt das schlechte Sampling die Hälfte der Information weg, und “gutes” skalieren (Area Averaging) ist schrecklich unperformant. Und … wie kriegt man mit, dass die Vorschau neu gezeichnet werden muss? Das geht ganz konsequent nur mit einem eigenen RepaintManager (und damit sieht man in der Übersicht sogar den blinkenden Cursor - yeah…).

Aber @groggy : Vielleicht möchtest du doch versuchen, eine der anderen hier angedeuteten Lösungen (d.h. TextArea mit kleinerem Font) zu verwenden. So, wie ich das im Moment versuche, ist nicht klar, ob da etwas für diesen Anwendungsfall geeignetes rauskommt…

Muss man im Preview denn unbedingt was lesen können?

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class JPreviewPane extends JComponent {
	private static final long serialVersionUID = 6066837320386243457L;

	private boolean managerSet;
	private JEditorPane textArea;
	private JScrollPane mainView;
	private Preview preview;
	private BufferedImage buffer;

	public JPreviewPane() {
		textArea = new InternalEditorPane();
		init();
	}

	public JPreviewPane(String type, String text) {
		textArea = new InternalEditorPane(type, text);
		init();
	}

	public JPreviewPane(String url) throws IOException {
		textArea = new InternalEditorPane(url);
		init();
	}

	public JPreviewPane(URL initialPage) throws IOException {
		textArea = new InternalEditorPane(initialPage);
		init();
	}

	private void init() {
		mainView = new JScrollPane(textArea);
		preview = new Preview();
		super.setLayout(new BorderLayout());
		super.addImpl(mainView, BorderLayout.CENTER, 0);
		super.addImpl(preview, BorderLayout.EAST, 1);
		textArea.addComponentListener(new ComponentAdapter() {
			@Override
			public void componentResized(ComponentEvent e) {
				buffer = new BufferedImage(textArea.getWidth(), textArea.getHeight(), BufferedImage.TYPE_INT_ARGB);
				Graphics g = buffer.getGraphics();
				textArea.paint(g);
				g.dispose();
			}
		});
		addComponentListener(new ComponentAdapter() {
			@Override
			public void componentResized(ComponentEvent e) {
				int w = getWidth();
				int h = getHeight();
				int w2 = (int) (w * 0.2);
				w -= w2;
				mainView.setBounds(0, 0, w, h);
				preview.setBounds(w, 0, w2, h);
			}
		});
		textArea.getDocument().addDocumentListener(new DocumentListener() {
			@Override
			public void removeUpdate(DocumentEvent e) {
				if(buffer != null) {
					Graphics g = buffer.getGraphics();
					textArea.paint(g);
					g.dispose();
					repaint();
				}
			}
			
			@Override
			public void insertUpdate(DocumentEvent e) {
				if(buffer != null) {
					Graphics g = buffer.getGraphics();
					textArea.paint(g);
					g.dispose();
					repaint();
				}
			}
			
			@Override
			public void changedUpdate(DocumentEvent e) {
				if(buffer != null) {
					Graphics g = buffer.getGraphics();
					textArea.paint(g);
					g.dispose();
					repaint();
				}
			}
		});
		textArea.addCaretListener(new CaretListener() {
			@Override
			public void caretUpdate(CaretEvent e) {
				if(buffer != null) {
					Graphics g = buffer.getGraphics();
					textArea.paint(g);
					g.dispose();
					repaint();
				}
			}
		});
	}

	@Override
	public void setLayout(LayoutManager mgr) {
		if(!managerSet) {
			super.setLayout(mgr);
			managerSet = true;
		}
		throw new UnsupportedOperationException();
	}

	@Override
	protected void addImpl(Component comp, Object constraints, int index) {
		throw new UnsupportedOperationException();
	}

	private class Preview extends JComponent {
		private static final long serialVersionUID = 7153881342047091231L;

		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(buffer, 0, 0, getWidth(), getHeight(), this);
		}
	}

	private class InternalEditorPane extends JEditorPane {
		private static final long serialVersionUID = 2055647305778044570L;

		public InternalEditorPane() {
			super();
		}

		public InternalEditorPane(String type, String text) {
			super(type, text);
		}

		public InternalEditorPane(String url) throws IOException {
			super(url);
		}

		public InternalEditorPane(URL initialPage) throws IOException {
			super(initialPage);
		}
	}

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				JFrame f = new JFrame();
				try {
					f.add(new JPreviewPane("http://www.byte-welt.de"));
				} catch(IOException e) {
					f.add(new JPreviewPane());
				}
				f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				f.pack();
				f.setVisible(true);
			}
		});
	}
}```So gehts zwar mit der TextArea auch, aber ich hab' das mal mit 'nem uns bekannten Dokument und 'ner JEditorPane realisiert um zu demonstrieren, wie ich das meine (wegen dem Highlighting usw)... Leider ist diese Variante noch sehr unperformant, zumindest bei dem uns bekannten Dokument.

Sorry, konnte leider nicht antworten. Also die Preview muss/soll nicht lesbar sein. Sie soll eine Uebersicht des Dokuments geben(dessen Struktur, Einrückungen und sowas).

Das letzte wirft bei mir direkt mehrfach eine…

Lange Exception
[spoiler]


Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: offset out of bounds
	at java.text.RuleBasedBreakIterator.checkOffset(Unknown Source)
	at java.text.RuleBasedBreakIterator.preceding(Unknown Source)
	at javax.swing.text.GlyphView.getBreakSpot(Unknown Source)
	at javax.swing.text.GlyphView.getBreakWeight(Unknown Source)
	at javax.swing.text.html.InlineView.getBreakWeight(Unknown Source)
	at javax.swing.text.FlowView$LogicalView.getPreferredSpan(Unknown Source)
	at javax.swing.text.FlowView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.ParagraphView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.ParagraphView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.ParagraphView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.setSpanOnAxis(Unknown Source)
	at javax.swing.text.BoxView.layout(Unknown Source)
	at javax.swing.text.BoxView.setSize(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI$RootView.paint(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI.paintSafely(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI.paint(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI.update(Unknown Source)
	at javax.swing.JComponent.paintComponent(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JViewport.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintToOffscreen(Unknown Source)
	at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
	at javax.swing.RepaintManager.paint(Unknown Source)
	at javax.swing.JComponent._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(Unknown Source)
	at javax.swing.RepaintManager$3.run(Unknown Source)
	at javax.swing.RepaintManager$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.access$1000(Unknown Source)
	at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

[/spoiler]

aber vielleicht hab’ ich ja was übersehen…

[QUOTE=Marco13]Das letzte wirft bei mir direkt mehrfach eine…

Lange Exception
[spoiler]


Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: offset out of bounds
	at java.text.RuleBasedBreakIterator.checkOffset(Unknown Source)
	at java.text.RuleBasedBreakIterator.preceding(Unknown Source)
	at javax.swing.text.GlyphView.getBreakSpot(Unknown Source)
	at javax.swing.text.GlyphView.getBreakWeight(Unknown Source)
	at javax.swing.text.html.InlineView.getBreakWeight(Unknown Source)
	at javax.swing.text.FlowView$LogicalView.getPreferredSpan(Unknown Source)
	at javax.swing.text.FlowView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.ParagraphView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.ParagraphView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.ParagraphView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
	at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
	at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
	at javax.swing.text.BoxView.checkRequests(Unknown Source)
	at javax.swing.text.BoxView.setSpanOnAxis(Unknown Source)
	at javax.swing.text.BoxView.layout(Unknown Source)
	at javax.swing.text.BoxView.setSize(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI$RootView.paint(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI.paintSafely(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI.paint(Unknown Source)
	at javax.swing.plaf.basic.BasicTextUI.update(Unknown Source)
	at javax.swing.JComponent.paintComponent(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JViewport.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintToOffscreen(Unknown Source)
	at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
	at javax.swing.RepaintManager.paint(Unknown Source)
	at javax.swing.JComponent._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(Unknown Source)
	at javax.swing.RepaintManager$3.run(Unknown Source)
	at javax.swing.RepaintManager$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.access$1000(Unknown Source)
	at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

[/spoiler]

aber vielleicht hab’ ich ja was übersehen…[/QUOTE]Und ich wundere mich schon, warum bei mir manchmal gar nichts angezeigt wird… Hab aber keinen Plan, was man da machen kann, manchmal braucht halt das Laden der Seite zu lange und der initiale PaintEvent ist längst durch… möglicherweise fehlt da noch der ein oder andere Listener oder so, zumindest wird manchmal die JEditorPane nicht geupdatet und damit auch die Preview nicht. Naja… Hauptsache, das Prinzip ist klar.