Swing JTextPane + Scrollbar = Fragen

markus99

Bekanntes Mitglied
Hallo!

Ich hatte vorher eine JTextArea, möchte aber gerne individuell Einträge mit Farben versehen (oder auch fett darstellen) - also bin ich auf JTextpane gewechselt.

Seitdem funktioniert einiges nicht mehr.
Unter Anderem autoscroll verweigert den Dienst, egal ob ich dieses auf die JTextPane oder die JScrollBar anwende.


Die JTextPane ist also immer so breit (mit Scrollbalken) wie der längste zusammenhängende String.
Gibt es da direkt eine nutzbare Methode um dies zu unterbinden?

Sorry für diese wirklich "einfache" Frage, mich fuchst es gerade ziemlich :)
 

xehpuk

Top Contributor
Hey,

die JTextPane sollte automatisch scrollen, wenn das Document im EDT bearbeitet wird. Dazu schrieb ich kurz [post=838388]hier[/post] etwas.

Das mit der Breite ist wieder ein anderes Problem, das [thread=128457]ich bisher auch noch nicht lösen konnte[/thread].
 

markus99

Bekanntes Mitglied
Und wie hast du dein Problem "temporär" gelöst?
Ich kann mir höchstens vorstellen jede Zeile auszulesen und nach Relevanz von Zeichenlängen ("_", ".", "M", "i", ....) eine ungefähre Breite zu erahnen und diese mit einer neuen Zeile zu unterbrechen.

Das ist nicht nur "nicht sauber", das ist richtig dreckig.
Aber wenn es nicht anders funktioniert ...
 

markus99

Bekanntes Mitglied
Na gut, eine Idee hab ich noch.
Ich versuche irgendwie HTML mit ins Spiel zu bringen, das wäre natürlich auch eine sehr einfache Lösung.

Bei den ersten Feldversuchen regnet es allerdings schon errors - und die Scrollpane ist immer noch verkrüppelt ...
Ich sehe mich nach alternativen Klassen um, das erste mal. Java ist wirklich keine Schönheit!
 

markus99

Bekanntes Mitglied
Editieren ist leider nicht mehr möglich - und über HTML funktioniert das nicht mit dem automatisierten Zeilenumbruch, also den LineWraps. Ich werde wohl mit JTextArea weitermachen.

Neues Poblem:

Ich füge bei jeder Zeilenausgabe ein "> " an.
Nun möchte ich gerne, dass wenn eine Zeile zu lange ist und sie gesplittet wird, dass die nächste Zeile versetzt beginnt. Gibt es evtl. eine Abfrageoption ob ein String den LineWrap in Anspruch nimmt - und wo genau er dann gebrochen wird? Ich möchte eine art ZeilenEinzug realisieren, damit das Ganze wenigstens ein bisschen ansehlicher wird :)

Grüße,
Markus
 

xehpuk

Top Contributor
Ich sehe mich nach alternativen Klassen um, das erste mal. Java ist wirklich keine Schönheit!
Ich denke, in die Entwicklung von Swing wurde schon so einiger Hirnschmalz reingesteckt. Die Architektur ist eigentlich ziemlich gut, bei so Komponenten wie JTable und JTextPane dafür aber umso komplizierter zu verstehen.
Das Problem ist meiner Meinung nach, dass es zu wenig tiefgehende Literatur dazu gibt.

Das mit dem Einzug ist meines Wissens nicht mit der JTextArea möglich. Mit der JTextPane ist es jedenfalls recht simpel. Die Methode dafür ist StyledDocument#setParagraphAttributes(int, int, AttributeSet, boolean):
Java:
import java.awt.Dimension;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.*;

public class ParagraphTest {
	public static void main(String[] args) {
		final String loremIpsum = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
			+ "sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, "
			+ "sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. "
			+ "Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";
		final StringBuilder sb = new StringBuilder(loremIpsum.length() * 2 + 18);
		sb.append("Anfang.");
		sb.append('\n');
		sb.append(loremIpsum);
		sb.append('\n');
		sb.append(loremIpsum);
		sb.append('\n');
		sb.append("Ende. :)");
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				try {
					final JFrame frame = new JFrame("ParagraphTest");
					final JTextPane tp = new JTextPane();
					tp.setPreferredSize(new Dimension(500, 250));
					final MutableAttributeSet a = new SimpleAttributeSet();
					final StyledDocument d = (StyledDocument) tp.getDocument();
					StyleConstants.setFirstLineIndent(a, -20);
					StyleConstants.setLeftIndent(a, 25);
					d.setParagraphAttributes(0, d.getLength(), a, true);
					d.insertString(0, sb.toString(), null);
					frame.setContentPane(new JScrollPane(tp));
					frame.pack();
					frame.setLocationRelativeTo(null);
					frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
					frame.setVisible(true);
				} catch (BadLocationException e) {
					e.printStackTrace();
				}
			}
		});
	}
}
 

markus99

Bekanntes Mitglied
Wie ist nur möglich dass es für die JTextPane nichts dieselben wichtigen Grundfunktionen wie für die JTextArea gibt?
Ich bekomme mit der JTextPane + Scrollbar kein brauchbares Ergebnis, die JScrollBar lässt die JTextPane glauben dass mehr Platz da ist - wie eben da ist. Und somit entsteht diese hässliche "Überlänge".

Aber einen Lichtblick habe ich erfahren.
Als ich frustriert nach optischen Verbesserungen suchte, fand ich eine Implementierung für eine wunderschöne AERO-Java GUI.
Diesbezüglich wird es sicher auch noch Fragen meinerseits geben, bis dato. konnte ich noch keine Objekte darauf erstellen (JMenuBar, ...), aber wird schon noch.

Ich bin gerade wirklich müde. Morgen hänge ich dann ein Bild meines vorherigen Problems mit der JTextPane an.

Edit: Sorry, ich danke dir für deinen Beispielcode! Glaube das ist sogar schon meine Lösung, morgen in der Uni hau ich mich sofort ran, aber erstmal brauch ich ne Mütze Schlaf :)
 
Zuletzt bearbeitet:

markus99

Bekanntes Mitglied
Ich möchte mich erst mal herzlichst für eure Beiträge bedanken!
Dabei bin ich mir sicher dass die Lösung bereits genannt wurde, ich sehe mich nur noch nicht in der Lage diese umzusetzen.

JEditorPane "list" (+ JScrollPane "listitem")

wltf3wmp.png


Der horizontale Scrollbalken muss ins Nirvana geschossen - und das Line Wrapping 25px früher durchgeführt werden.
Dabei wird setSize/setPreferedSize leider komplett ignoriert.

Meintet ihr dass ich die JRE/JDK Dateien direkt bearbeiten soll?
 

GUI-Programmer

Top Contributor
Zur Information: Automatisches LineWrapping erfolgt immer nur dann, wenn der Text auch genügend Leerzeichen enthält, sprich wenn du einen String hast wie TestStringTestStringTestStringTestStringTestStringTestStringTestStringTestStringTestStringTestStringTestStringTestStringTestStringTestStringTestStringTestStringTestString
dann wird natürlich entweder garnicht oder beliebig umgebrochen. Und sowas wie Silbentrennung gibts glaub ich überhaupt nicht.
 

markus99

Bekanntes Mitglied
Wieso wird das LineWrapping dann immer genau an der selben Stelle (aber zu weit außen) durchgeführt?

Hier noch ein Beispiel mit vielen Leerzeichen, dasselbe Resultat.

Edit:
Da ich noch Anfänger bin (wie du ja weißt) poste ich gleich den Code.

4j5gpagd.png
 

GUI-Programmer

Top Contributor
Was für eine Textkomponente bzw. welche von den erwähnten Methoden benutzt du? Zeig doch bitte mal etwas Code. Sonst wäre da nur Raten angesagt.
 

markus99

Bekanntes Mitglied
Für das JEditorPane Element:
Java:
import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.border.MatteBorder;


public class MainDialogList
{
	JEditorPane list = new JEditorPane();
	JScrollPane listitem = new JScrollPane(list);

	public MainDialogList()
	{
		int xw = (MainDialogDetails.mainDisplayWidth) - (MainDialogDetails.mainDisplayWidth - 25);
		int yw = (MainDialogDetails.mainDisplayHeight) - (MainDialogDetails.mainDisplayHeight - 50);
		int wi = MainDialogDetails.mainDisplayWidth-50;
		int he = 300;
		
		//list.setMaximumSize(new Dimension(wi-25, he)); //kein effekt
		listitem.setBounds(xw, yw, wi, he);
		
		MatteBorder matteborder =  BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK);
		listitem.setBorder(matteborder);
	}
	
	public void addLine(String input)
	{
		String newline = "\n →  ";
		list.setText(list.getText() + newline + input);
		list.setCaretPosition(list.getText().length());
	}
}

In der Hauptklasse erstelle ich dann ein Element dieser Klasse "maindialoglist" und füge über dieses Element die eigentliche Liste hinzu: maindialog.add(maindialoglist.listitem);
Wobei listitem auf die JScrollPane(listitem) verweist, welche als Parent für JEditorPane(list) erstellt wird.
 

markus99

Bekanntes Mitglied
So, ich habe nun folgendes gemacht:
Die horizontale Scrollbar manuell deaktiviert
listitem.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_NEVER);

- sowie den selbst eingefügen Zeilenumbruch (nach jedem neuen Input) auf den Zeilenumbruch "\n" selbst reduziert.

Ergebnis: Die Länge ist nur noch minimal abgeschnitten:

9vadzywt.png



Edit: Des Rätsels Lösung:

JScrollPane listitem = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

Scrollbar-Policies müssen bereits bei der Initialisierung gesetzt werden, später wird daruch alles verfälscht/verschoben. Ich könnte mir in meine 4 Buchstaben beißen. Vielen Dank für eure Hilfe!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Swing JTextPane hat unästhetisches Scrollbar AWT, Swing, JavaFX & SWT 3
M JTextPane mit ScrollBar AWT, Swing, JavaFX & SWT 5
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
J Swing JTextpane aktuallisiert nicht den setText? AWT, Swing, JavaFX & SWT 9
M Strings im JTextPane vergleichen und mit StyledDocument formatieren AWT, Swing, JavaFX & SWT 3
X JTextPane automatischer Zeilenumbruch IM Wort AWT, Swing, JavaFX & SWT 2
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
D Swing Breite einer HTML Tabelle in einer JTextPane AWT, Swing, JavaFX & SWT 6
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
S Swing JtextPane sau langsam AWT, Swing, JavaFX & SWT 15
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
S Swing Style Attribute aus JTextPane kopieren AWT, Swing, JavaFX & SWT 1
E JTextPane Focus AWT, Swing, JavaFX & SWT 1
TheJavaKid JTextPane: komplexe Formatierung (links) AWT, Swing, JavaFX & SWT 2
B Swing JTextPane - Einfärbungen auf "default" AWT, Swing, JavaFX & SWT 2
A Swing Einrücken mehrerer Zeilen per Tab in einem JTextPane/JTextArea AWT, Swing, JavaFX & SWT 3
T JtextPane Zeile aktualisieren AWT, Swing, JavaFX & SWT 3
T Hintergrundbild in JTextPane fixieren AWT, Swing, JavaFX & SWT 2
M Swing JTextPane frisst Anführungszeichen AWT, Swing, JavaFX & SWT 2
R Swing Renderproblem bei HTML in einer JTextPane AWT, Swing, JavaFX & SWT 12
N Swing JTextPane zur Anzeige von HTML AWT, Swing, JavaFX & SWT 2
E Swing jTextPane Text datei anzeigen AWT, Swing, JavaFX & SWT 7
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
Tobse Swing [JTextPane] Farbliche Hervorhebung AWT, Swing, JavaFX & SWT 9
X Swing JTextPane bei Größenänderung Formatierung behalten AWT, Swing, JavaFX & SWT 11
0 JTextPane copy/paste trotz editable(false) ? AWT, Swing, JavaFX & SWT 10
T Swing JTextPane Tastatureingabe abfangen AWT, Swing, JavaFX & SWT 4
B Durchsichtiges JScroll und JTextPane AWT, Swing, JavaFX & SWT 4
xehpuk Swing JTextPane in JScrollPane wird nicht ordentlich neugezeichnet AWT, Swing, JavaFX & SWT 3
S Swing JTextPane append formatprobleme AWT, Swing, JavaFX & SWT 5
C JTextPane / JEditorPane ohne Keywords farbig machen AWT, Swing, JavaFX & SWT 4
C Zeilenumbruch von JTextPane wird nicht erkannt AWT, Swing, JavaFX & SWT 2
S JEditorPane oder JTextPane? AWT, Swing, JavaFX & SWT 2
P Aktuelle Zeile in JTextPane farblich hervorheben AWT, Swing, JavaFX & SWT 3
J JTextPane Background setzen AWT, Swing, JavaFX & SWT 6
T Text in JTextPane vertikal (!) zentrieren AWT, Swing, JavaFX & SWT 4
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
M JTextPane - bewegungsloses Hintergrundsbild (Duplikat) AWT, Swing, JavaFX & SWT 2
B JTextPane formatierten Inhalt speichern AWT, Swing, JavaFX & SWT 2
E JTextPane setText ignoriert \n AWT, Swing, JavaFX & SWT 6
P Swing Sichtbaren teil eines JTextPane herausbekommen (mit JScrollPane) AWT, Swing, JavaFX & SWT 2
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
T Zeichen zählen JTextPane AWT, Swing, JavaFX & SWT 4
K Swing JTextPane Formatierungen SyntaxHighlighting AWT, Swing, JavaFX & SWT 11
F Mit TAB JTextPane wechseln AWT, Swing, JavaFX & SWT 5
J JSlider auf JTextPane? AWT, Swing, JavaFX & SWT 2
S Buchstabenpositionen in JTextPane erhalten..? AWT, Swing, JavaFX & SWT 5
I JTextPane und Hyperlink (ohne JEditorPane) AWT, Swing, JavaFX & SWT 5
T Swing JTextArea, JTextPane, JEditorPane...Unterschied?! AWT, Swing, JavaFX & SWT 3
A Swing JTextPane sehr langsam AWT, Swing, JavaFX & SWT 6
P Drucken von Jtextpane mit Seitenangabe AWT, Swing, JavaFX & SWT 1
M Swing JTextPane mit JScrollPane soll aussehen wie JLabel AWT, Swing, JavaFX & SWT 3
A JTextPane: Text hinzufügen AWT, Swing, JavaFX & SWT 9
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
K Swing jTextPane zeilenumbruch AWT, Swing, JavaFX & SWT 2
Stillmatic JTextPane langsam? AWT, Swing, JavaFX & SWT 5
E Swing JTextPane linewrap AWT, Swing, JavaFX & SWT 4
M Swing [JTextPane] Cursor lässt sich nicht mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 3
T Swing xml in JTextPane mit EditorKit, StyledDocument & co. AWT, Swing, JavaFX & SWT 3
M Cursor setzen im JTextPane AWT, Swing, JavaFX & SWT 3
M Formatierungsfehler JTextPane WARUM ?? AWT, Swing, JavaFX & SWT 4
JavaKaffee Array auslesen in jTextPane? AWT, Swing, JavaFX & SWT 9
E JTextPane Bold Italic und Co AWT, Swing, JavaFX & SWT 6
M JTextPane Ende des Feldes AWT, Swing, JavaFX & SWT 4
D JTextPane - Text andersfarbig unterstreichen AWT, Swing, JavaFX & SWT 7
P Probleme mit JTextpane AWT, Swing, JavaFX & SWT 7
M Größe von JTextPane manuell bei Bedarf anpassen AWT, Swing, JavaFX & SWT 6
bugmenot JTextPane String stimmt nicht mit übergebenem String überein AWT, Swing, JavaFX & SWT 9
C JTextPane <br oder <p> statt \n AWT, Swing, JavaFX & SWT 2
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
G JTextPane durchsichtig? AWT, Swing, JavaFX & SWT 6
GilbertGrape Fehler bei HTML in JTextPane AWT, Swing, JavaFX & SWT 2
S JTextPane: Probem mit AlignmentAction AWT, Swing, JavaFX & SWT 3
J Problem mit JTextPane & JScrollPane (horizontal) AWT, Swing, JavaFX & SWT 3
B JTextPane und Image importieren in HTML String. AWT, Swing, JavaFX & SWT 2
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
J Html in JTextPane anzeigen? AWT, Swing, JavaFX & SWT 2
Steev JTextPane mit Textformatierung funktioniert nicht AWT, Swing, JavaFX & SWT 5
S JTextPane - markierten Text Formatieren AWT, Swing, JavaFX & SWT 11
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
M Makierten Text in JTextPane zentrieren AWT, Swing, JavaFX & SWT 2
F JTextPane aktive Zeile AWT, Swing, JavaFX & SWT 2
G insert & JTextPane AWT, Swing, JavaFX & SWT 4
J JTextPane bekommt keinen Focus! AWT, Swing, JavaFX & SWT 3
S Farben eienr JTextPane dynamisch zuweisen AWT, Swing, JavaFX & SWT 2
R JTextPane scrollen vermeiden AWT, Swing, JavaFX & SWT 2
B Feste Breite einer JTextPane, die HTML anzeigt AWT, Swing, JavaFX & SWT 8
A JScrollPane in JTextPane AWT, Swing, JavaFX & SWT 2
B Swing Logging: Ein/Ausblenden eines scrollenden JTextPane AWT, Swing, JavaFX & SWT 2
F Java JTextPane AWT, Swing, JavaFX & SWT 13
Saxony JTextPane - letzte Zeile löschen AWT, Swing, JavaFX & SWT 4
TheJavaKid LineWrap & WrapStyleWord in JTextPane AWT, Swing, JavaFX & SWT 3
G Zeilenabstand bei HTML-Texten in JLabel/JTextPane AWT, Swing, JavaFX & SWT 7
O Swing Xml highlightning mit JTextPane und Regular expressions AWT, Swing, JavaFX & SWT 5
J JTextPane Alignment AWT, Swing, JavaFX & SWT 6
Y entfernten String einer JTextPane per DocumentListener AWT, Swing, JavaFX & SWT 5
B Ein großes JTextPane komplett drucken AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben