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:
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) {
}
}
}