Swing JTextPane linewrap

Status
Nicht offen für weitere Antworten.

Enigma228

Bekanntes Mitglied
Ich versuche über den DocumentListener zu prüfen, ob in der Zeile mehr als 20 Zeichen pro Zeile eingeben werden und versuche so einen automatischen Zeilenumbruch zu erzeugen.
ich teile den Text des JTextPanes in ein StringArray als Trenner das \n.
diese Teile prüfe ich dann auf Länge und wenn mehr als zwanzig Zeichen nehme ich das letzte Leerzeichen und ersetze es durch ein \n und schiebe den Rest in das nächste Teilstück wo wiederum geprüft wird..
soweit funktioniert es auch aber wenn ich dann den korrekt zusammengefügten String wieder in das Textpane einfügen möchte (über tp_text.setText(all);) erscheint folgender Fehler:
"Exception in thread "main" java.lang.IllegalStateException: Attempt to mutate in notification"

Wie kann ich den korrigierten Text wieder in das TextPane einfügen?
Gibt es bessere oder kürzere Lösungen.
bei einer Suche bin ich über setContentType() gestolpert aber das hilft mir nicht da ich ja zur Echzeit das ganze prüfe..

Meine Klasse:

Java:
package view;

import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.Element;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.text.StyledEditorKit;

public class MyFrame extends JFrame implements ActionListener{

	private JTextPane tp_text;
	private JScrollPane sp_text;
	private JToggleButton b_bold, b_italic, b_underline;
	private JComboBox cb_size;
	private AbstractDocument doc;
	private SimpleAttributeSet attr;
		
	public MyFrame(String title) throws HeadlessException {
		this.setLayout(null);
		this.setTitle(title);
		this.setBounds(100, 100, 600, 400);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		try {
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
		} catch(Exception e) {
		    System.out.println("Error setting native LAF: " + e);
		}
				
		// Buttons für die Textmanipulation
                b_bold = new JToggleButton(new StyledEditorKit.BoldAction());
		b_bold.setText("<HTML><B>F</B></HTML>");
		b_bold.setBounds(10, 10, 30, 25);
		b_bold.setFocusable(false);
		b_italic = new JToggleButton(new StyledEditorKit.ItalicAction());
		b_italic.setText("<HTML><I>k</I></HTML>");
		b_italic.setBounds(50, 10, 30, 25);
		b_italic.setFocusable(false);
		b_underline = new JToggleButton(new StyledEditorKit.UnderlineAction());
		b_underline.setText("<HTML><U>u</U></HTML>");
		b_underline.setBounds(90, 10, 30, 25);
		b_underline.setFocusable(false);
		
		// JTextPane als Eingabefeld
		tp_text = new JTextPane();
		tp_text.addCaretListener(new MyCaretListener());
		tp_text.getDocument().addDocumentListener(new MyDocumentListener());
		
			// Voreinstellung für JTextPane
		attr = new SimpleAttributeSet();
		StyleConstants.setFontSize(attr, 12);
		
			// Document festlegen	
		if(tp_text.getStyledDocument() instanceof AbstractDocument){
			doc = (AbstractDocument)tp_text.getStyledDocument();
			doc.setDocumentFilter(new DocumentFilter());
		}
			// Einfügen eines Starttextes
		try {
			doc.insertString(0, "Heute ist ein guter Tag,\num ein wenig mehr als nur Spass zu haben", attr);
		} catch (BadLocationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			// Scrollpane für das JTextPane
		sp_text = new JScrollPane(tp_text);
		sp_text.setBounds(50,50,400,300);
		
		// ComboBox für die Schriftgrösse
		Vector<Integer> sizes = new Vector<Integer>();
		for (int i= 8; i<49;i++){
			sizes.add(i);
		}
		
		cb_size = new JComboBox(sizes);
		cb_size.setSelectedIndex((tp_text.getFont().getSize())-8);
		cb_size.setBounds(130, 10, 50, 25);
		cb_size.addActionListener(this);
		cb_size.setActionCommand("size");
		
		this.add(sp_text);
		this.add(b_bold);
		this.add(b_italic);
		this.add(b_underline);
		this.add(cb_size);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		if(e.getActionCommand().equalsIgnoreCase("size")){
			StyledDocument ds_doc = tp_text.getStyledDocument();
			int length = tp_text.getSelectionEnd() - tp_text.getSelectionStart();
			JComboBox cb = (JComboBox)e.getSource();
	        int size = (Integer)cb.getSelectedItem();
	        SimpleAttributeSet sas = new SimpleAttributeSet();
			StyleConstants.setFontSize(sas, size);
			ds_doc.setCharacterAttributes(tp_text.getSelectionStart(), length, sas, false);
		}
	}
	// innere Klasse CaretListener
	private class MyCaretListener implements CaretListener{

		@Override
		public void caretUpdate(CaretEvent e) {
			System.out.println(e.getDot());
			StyledDocument doc = tp_text.getStyledDocument();
			int pos0= e.getDot();
			if(pos0>0)pos0--;
			Element element = doc.getCharacterElement(pos0);
			if(StyleConstants.isItalic(element.getAttributes())){
				b_italic.setSelected(true);
			}else b_italic.setSelected(false);
			if(StyleConstants.isBold(element.getAttributes())){
				b_bold.setSelected(true);
			}else b_bold.setSelected(false);
			if(StyleConstants.isUnderline(element.getAttributes())){
				b_underline.setSelected(true);
			}else b_underline.setSelected(false);
			
			cb_size.setSelectedIndex(StyleConstants.getFontSize(element.getAttributes())-8);
		}
	}
	// innere Klasse DokumentListener
	private class MyDocumentListener implements DocumentListener{

		@Override
		public void changedUpdate(DocumentEvent e) {
		}

		@Override
		public void insertUpdate(DocumentEvent e) {
			String lineSeparator = System.getProperty("line.separator");
			String text = tp_text.getText();
			String[]temp = text.split(lineSeparator);
			String last = "", all = "", first ="";
			System.out.println("Temp-Teile: "+temp.length);
			for (int i=0; i<temp.length;i++){
				System.out.println("temp["+i+"]: "+temp[i]);
				System.out.println("temp["+i+"]Länge: "+temp[i].length());
				if(temp[i].length()>20){
					
					int col = temp[i].indexOf(" ", 15);
					first=temp[i].substring(0, col)+lineSeparator;
					System.out.println("first: "+first + " Länge: "+first.length());
					last = temp[i].substring(col+1)+" ";
					System.out.println("last: "+last);
					temp[i]= first;
					all+=first+lineSeparator;
					System.out.println("all: "+all);
					first = "";
					if((i+1)<temp.length){
						temp[i+1]= last+ temp[i+1];
						last = "";
					}
				}
				System.out.println("if_schleife beendet");
			}
			System.out.println("for_schleife beendet");
			if(!last.equals(""))all+=last;
			System.out.println("End-All"+all);
			//tp_text.setText(all);
		}

		@Override
		public void removeUpdate(DocumentEvent e) {
		}
		
	}
}
 

KrokoDiehl

Top Contributor
Hallo.
Ich hatte mal ein ähnliches/gleiches Problem und habe es nur über ein EditorKit geschafft, Zeilen nach einer bestimmten Länge automatisch umzubrechen. Dafür funktioniert das super. Hier ist der Link zum Thread hier im Forum. Meine Lösung ist ganz unten.

Sauberer hätte ich es auch mit einem eigenen Dokumenttyp gefunden, aber das wurde mir zu komlex, da man auf so vielfältige Weise editieren kann (Copy&Paste, Selektionen löschen, ...).

Ich habe aber mit einer JEditorPane gearbeitet, ad hoc weiß ich daher nicht, ob es bei dir direkt so tut.
 

Enigma228

Bekanntes Mitglied
ich schau mir das mal an...
Hast du vielleicht eine Idee warum er diese Fehlermeldung bringt? normalerweise kann man doch aus einer inneren Klasse auf fast alle Elemente der äusseren Klasse zugreifen oder?
der Fehler wird immer ausgelöst wenn ich den korrekten String in das Textpane einfügen möchte..
weder :
Java:
doc.insertString(0, all, tp_text.getCharacterAttributes());
noch das:
Java:
tp_text.setText(all);
funktionieren..
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Also sicher weiß ich es nicht, weil ich so einen Fehler noch nicht hatte, aber ich vermute stark, dass es an der Stelle des Aufrufes liegt:
Du willst den neuen Text ja in der Listenermethode
Code:
insertUpdate(DocumentEvent)
ausführen und wenn du dort abermals
Code:
setText()
oder dergleichen machst, würde das Document abermals ein insertUpdate-Event feuern ... sprich es wird eine Endlosschleife. Vielleicht ist dieser Fall intern bereits abgefangen, dadurch dass der schreibende Zugriff auf das Dokument während der Ereignisbehandlung gesperrt ist.
Ob es genau so ist... keine Ahnung, aber es sieht zumindest nach etwas derartigem aus.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
TheJavaKid LineWrap & WrapStyleWord in JTextPane AWT, Swing, JavaFX & SWT 3
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
M Swing JTextPane + Scrollbar = Fragen AWT, Swing, JavaFX & SWT 15
H Swing JTextPane hat unästhetisches Scrollbar AWT, Swing, JavaFX & SWT 3
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
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
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
7 Latex/MathML Code in JTextPane AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben