Swing Sichtbaren teil eines JTextPane herausbekommen (mit JScrollPane)

Purgator

Aktives Mitglied
Aloha,
ich wollte gerne eine Möglichkeit haben, mit der ich in einem Programm mitloggen kann welcher Teil eines JTextPane's gerade für den Nutzer sichtbar ist.
Wenn er die JScrollPane (welche das JTextPane enthält) dann verschiebt ist ja ein neuer Teil sichtbar.
Dazu habe ich sogar schon ein tolle Lösung gefunden gehabt:
Java:
private static void viewVisibleText() {
		int offSet = 0;
		int end = 0;
		try {
			JViewport viewPort = scrollPane.getViewport();
			offSet = textPane.viewToModel(viewPort.getViewRect().getLocation());
			int x = (int) viewPort.getViewRect().getWidth();
			int y = (int) viewPort.getViewRect().getLocation().getY()
					+ (int) viewPort.getVisibleRect().getHeight();
			if (y > textPane.getHeight()) {
				y = textPane.getHeight();
			}
			Point endPoint = new Point(x, y);
			end = textPane.viewToModel(endPoint);
			System.out.println("offSet: " + offSet + "- end: " + end +"- end-offSet: " + (end-offSet));
			try {
				System.out.println(textPane.getText(offSet, end - offSet));				
			} catch(BadLocationException ble) {
				System.out.println("feheler...");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
(bis auf den try-catch Block um das syso hatte ich das so übernommen).
Leider kommt bei mir nun wenn ich das Programm starte immer die BadLocationException (nur einmal am anfang, ansonsten funktioniert es wie gewollt), was daran liegt, dass textPane.viewToModel(...) am Anfang -1 zurück gibt.
Dies soll ja nur passieren, wenn die Komponente noch keine positive Größe hat.
Genau dies kann ich aber nicht nachvollziehen. Ich setze den Listener ganz zum Schluss, d.h. die ganze GUI initialisierung passiert vorher.

Hier der gesamte Quelltext (da er nicht so lang ist und als ausführbares Prog evtl. hilfreich ist):

Java:
public class MainFrame extends JFrame {	

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainFrame frame = new MainFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public MainFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		JPanel contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		JTextPane textPane = new JTextPane();		
		textPane.setText("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28");		
		JScrollPane scrollPane = new JScrollPane(textPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		contentPane.add(scrollPane, BorderLayout.CENTER);
		textPane.setCaretPosition(0);
		
		ScrollLogger.setScrollLogger(scrollPane, textPane);
	}
}
Java:
public class ScrollLogger {

	private static JScrollPane scrollPane;
	private static JTextPane textPane;

	public static void setScrollLogger(JScrollPane sp, JTextPane tp) {
		scrollPane = sp;
		textPane = tp;

		scrollPane.getVerticalScrollBar().addAdjustmentListener(
				new AdjustmentListener() {
					public void adjustmentValueChanged(AdjustmentEvent arg0) {
						viewVisibleText();
						System.out.println("_____________________________");
					}
				});
	}

	private static void viewVisibleText() {
		int offSet = 0;
		int end = 0;
		try {
			JViewport viewPort = scrollPane.getViewport();
			offSet = textPane.viewToModel(viewPort.getViewRect().getLocation());
			int x = (int) viewPort.getViewRect().getWidth();
			int y = (int) viewPort.getViewRect().getLocation().getY()
					+ (int) viewPort.getVisibleRect().getHeight();
			if (y > textPane.getHeight()) {
				y = textPane.getHeight();
			}
			Point endPoint = new Point(x, y);
			end = textPane.viewToModel(endPoint);
			try {
				System.out.println(textPane.getText(offSet, end - offSet));
			} catch (BadLocationException ble) {
				System.out.println("feheler...");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 

hansmueller

Bekanntes Mitglied
Hallo,

Hast du es schon mal mit einem .doLayout() vor deinem ScrollLogger probiert?

Swing ist nicht Threadsicher. D. h. die ganzen Swing-Sachen laufen in einen eigenen Thread parallel zu dem Thread von deinem Programm ab. Aber nicht synchronisiert.
Evtl. mußt du den ScrollLogger in einem .invokeandwait() ablaufen lassen.

Schau dir mal diesen Link an:
Lesson: Concurrency in Swing (The Java™ Tutorials > Creating a GUI With JFC/Swing)


MfG
hansmueller
 

Purgator

Aktives Mitglied
Aloha,
du scheinst tatsächlich recht zu haben.
Ich habe zu Testzwecken den code in der Main nur leicht abgeändert:
Java:
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainFrame frame = new MainFrame();
					frame.setVisible(true);
					ScrollLogger.setScrollLogger(scrollPane, textPane);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
und schon kommt der Fehler nicht mehr.
Ich muss zwar nochmal genau durchlesen wie das ganze zusammenhängt um das so hinzubauen wie ich es genau haben will, aber prinzipiell scheinst du mit dem nicht-threadsicheren-Swing richtig gelegen zu haben.

Danke dir!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Nur den sichtbaren Bereich eines TextPane mit Inhalt darstellem AWT, Swing, JavaFX & SWT 0
DEvent Swing JTextField Anzahl an sichtbaren Zeichen AWT, Swing, JavaFX & SWT 4
R JTable nur sichtbaren Bereich laden AWT, Swing, JavaFX & SWT 12
L Koordinate im sichtbaren Bereich AWT, Swing, JavaFX & SWT 5
D JTable Viewport - Ausgabe der sichtbaren Spalten AWT, Swing, JavaFX & SWT 2
CptK Wieso wird nur ein Teil meiner Buttons angezeigt? AWT, Swing, JavaFX & SWT 1
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
kodela Teil eines Panels als Graphik speichern AWT, Swing, JavaFX & SWT 3
G Welcher Teil der Java Standard Edition API ist für das Zeichnen von einfachen Grafiken gedacht? AWT, Swing, JavaFX & SWT 3
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
N JComboBox schon zum Teil aufgeklappt AWT, Swing, JavaFX & SWT 7
S Ich brauche eine Idee: Animation mit teil eines Bildes AWT, Swing, JavaFX & SWT 16
S bestimmten Teil im jTexfield ändern AWT, Swing, JavaFX & SWT 2
aze Layout auf Teil eines Panels anwenden AWT, Swing, JavaFX & SWT 5
I JFrame Applet-Anmerkung entfernen ? - Teil 2 AWT, Swing, JavaFX & SWT 5
S FAQ und JTable Tutorial.Teil.4 Punkt 5 wichtige Bemerkung AWT, Swing, JavaFX & SWT 2
W netbeans projekt in Eclipse importieren -gui teil geht nicht AWT, Swing, JavaFX & SWT 5
G Font nur für einen Teil String im JTextArea AWT, Swing, JavaFX & SWT 5
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
D LookAndFeel Überschreiben eines UIDelegate AWT, Swing, JavaFX & SWT 0
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
D TAB Taste innerhalb eines JSpinner AWT, Swing, JavaFX & SWT 2
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
F Swing Rotation eines Bildes mit beliebigen Koordinaten um den Mittelpunkt AWT, Swing, JavaFX & SWT 3
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
V JavaFX Teile eines Images Transparent machen AWT, Swing, JavaFX & SWT 4
I JavaFX Langes drücken eines Buttons AWT, Swing, JavaFX & SWT 4
B Swing Wie Witdh und Height eines GuiElements bekommen AWT, Swing, JavaFX & SWT 5
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
K Swing Inhalt eines JPanels lesen AWT, Swing, JavaFX & SWT 3
T Nur bestimmte Bereiche eines Fotos bearbeiten AWT, Swing, JavaFX & SWT 0
J Swing Erstellung eines User Interface AWT, Swing, JavaFX & SWT 2
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
O Swing Aufbau eines JFrames AWT, Swing, JavaFX & SWT 2
A JavaFX Hilfe beim Design eines Quiz AWT, Swing, JavaFX & SWT 2
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
javampir Swing Wanderung eines JFrames AWT, Swing, JavaFX & SWT 7
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
I Erstellung eines kleinen Programmes AWT, Swing, JavaFX & SWT 8
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
T Swing Einzelne Teile eines Textes färben? AWT, Swing, JavaFX & SWT 10
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
HaukeG JavaFX JavaFX Resize und DragAndDrop eines Pane AWT, Swing, JavaFX & SWT 4
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
J Denkfehler bei Aktualisierung eines GUI AWT, Swing, JavaFX & SWT 4
J Logikfehler im erstellen eines GUI AWT, Swing, JavaFX & SWT 3
F JTabbedPane mit Button zum Hinzufügen eines neuen Tabs AWT, Swing, JavaFX & SWT 6
B Event Handling Mausbewegung auch außerhalb eines JFrames registrieren AWT, Swing, JavaFX & SWT 2
U Swing Beim Bedienen eines Buttons JFrame schließen AWT, Swing, JavaFX & SWT 2
A Fehler bei erstellen eines JTextFields AWT, Swing, JavaFX & SWT 2
S Bestimmten Bereich eines Bildes im JFrame mit Scrollpane anzeigen AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben