JTextArea & Zeichenbegrenzung

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ich möchte in einem JTextArea eine Zeichenbegrenzung, die automatisch weitere Eingaben löscht. Ein Label zeigt an, wieviel Zeichen noch übrig sind. Das mit dem Label funktioniert wunderbar, nur die JTextArea macht mir Probleme. Hab 3 verschiedene Sachen probiert, funktioniert aber nicht

Code:
public class ZeichenBegrenzen
{
	private Integer max = 9;  //Anzahl der Zeichen maximal
	
	
	private JTextArea textarea_zeichen;
	private JLabel label_zeichen;
	
	// Modelle
	private DefaultStyledDocument document_zeichen = new DefaultStyledDocument();
	
	// Gui
	
	
	public void zeichenbegrenzen()
	{
		JFrame frame = new JFrame();
		JPanel panel = new JPanel();
		
		textarea_zeichen = new JTextArea(10, 10);
 //    textarea_lead = new JTextArea(document_zeichen, "", 10, 10);  // Hier habe ich es mit document probiert
		panel.add(textarea_zeichen);
		JLabel label_lzeichen = new JLabel("Noch Zeichen: ");
		panel.add(label_lzeichen);
		label_zeichen = new JLabel(max.toString());
		panel.add(label_zeichen);
		
		// Listener auf Areatext
		textarea_zeichen.getDocument().addDocumentListener(new DocumentListener()
		{
			@Override
			public void changedUpdate(DocumentEvent e){}
                       
        // Ändert Label, wenn was gelöscht wird, ansonsten passiert hier nichts
        @Override
			public void removeUpdate(DocumentEvent e)
			{
				int zeichen = textarea_zeichen.getText().length();
				Integer zeichen_uebrig = max - zeichen;
				label_zeichen.setText(zeichen_uebrig.toString());
			}
			
          // Wenn was hinzugefügt wird
			@Override
			public void insertUpdate(DocumentEvent e)
			{
              // Hier wird wieder nur das Label geändert, das gleiche wie oben
				int zeichen = textarea_zeichen.getText().length();
				Integer zeichen_uebrig = max - zeichen;
				label_zeichen.setText(zeichen_uebrig.toString());

            // hier wird die Zeichenbegrenzung erreicht
				if (zeichen > max)

				{
               // Version 1 mit substring
               String string = textarea_zeichen.getText();
					string = string.substring(0, max);
					textarea_zeichen.removeAll();  // Anzeige bleibt trotzdem unverändert, warum?
					textarea_zeichen.setText(string);
               // Der String selber wird gekürzt, Fehlermeldung gibts bei .setText
                                        

               /*
               // Version 2 mit StringBuffer
               StringBuffer sb = new StringBuffer(textarea_zeichen.getText());
			      sb.delete(max, sb.length()+1);
			      textarea_zeichen.removeAll();  // Anzeige bleibt trotzdem unverändert, warum?
			      textarea_zeichen.setText(sb.toString());
               // Gleiches Problem wie bei Version 1, String selber wird korrekt gekürzt aber .setText will nicht
               */


			      /* 
              //  Version 3, hier habe ich es mit document probiert, keine Ahnung ob das so überhaupt funktionieren würde
					String inhalt;
					try
					{
						inhalt = document_zeichen.getText(0, max);
					}
					catch (BadLocationException e1)
					{
						inhalt = "";
						System.out.println("Fehler: " + e1.getMessage());
					}

					try 
					{
						document_zeichen.remove(0, document_zeichen.getLength());
					} catch (BadLocationException e1)
					{
						System.out.println("Fehler: " + e1.getMessage());
					}

					try 
					{
						document_zeichen.insertString(0, inhalt, null);
					} catch (BadLocationException e1)
					{
						System.out.println("Fehler: " + e1.getMessage());
					}
               // Hier gibts die Fehlermeldung bei document_zeichen.remove
				  */ 
					
				}
			}
		});
		
		
		frame.add(panel);
        frame.setVisible(true);
		
	}
	
}
 
S

SlaterB

Gast
removeAll() bezieht sich allgemein auf SubKomponenten in einem Container, hat nichts mit dem Text der JTextArea zu tun

hier eine anscheinend funktionierende einfache Variante ohne Exception:

final String fs = ..;
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
textarea_zeichen.setText(fs);
}
});
 

Ebenius

Top Contributor
Probier mal so was:
Code:
textarea_zeichen.setDocument(new PlainDocument() {

  @Override
  public void insertString(int offs, String str, AttributeSet a)
        throws BadLocationException {
    final int newLength = getLength() + str.length();
    if (newLength > max) {
      str = str.substring(0, newLength - max - 1);
    }
    super.insertString(offs, str, a);
  }
});

// Listener auf Areatext
textarea_zeichen.getDocument().addDocumentListener(
      new DocumentListener() {

        @Override
        public void changedUpdate(DocumentEvent e) {}

        // Ändert Label, wenn was gelöscht wird, ansonsten passiert hier
        // nichts
        @Override
        public void removeUpdate(DocumentEvent e) {
          int zeichen = textarea_zeichen.getText().length();
          Integer zeichen_uebrig = max - zeichen;
          label_zeichen.setText(zeichen_uebrig.toString());
        }

        // Wenn was hinzugefügt wird
        @Override
        public void insertUpdate(DocumentEvent e) {
          // Hier wird wieder nur das Label geändert, das gleiche wie oben
          int zeichen = textarea_zeichen.getText().length();
          Integer zeichen_uebrig = max - zeichen;
          label_zeichen.setText(zeichen_uebrig.toString());
        }
      });
Ich hab "max" umdeklariert. Nicht mehr "Integer" sondern "int" und dann mit Integer.toString(int) ausgegeben. Weil's besser ist.
 
G

Guest

Gast
So funktionierts, danke :)

Aber wie kommt man denn drauf, daß man PlainDocument dafür benutzen kann? Bin nur neugierig.
 

Ebenius

Top Contributor
Anonymous hat gesagt.:
Aber wie kommt man denn drauf, daß man PlainDocument dafür benutzen kann? Bin nur neugierig.
Die Längenbeschränkung des Textes obliegt offensichtlich dem Modell. Wer sonst sollte dafür zuständig sein? PlainDocument ist nur eine Document-Implementierung mit der man das machen kann. Genauso kannst Du auch von DefaultStyledDocument ableiten; ich glaube, Du musst ─ außer dem Klassennamen ─ nichtmal was an meinem Code ändern. PlainDocument ist die typische Document-Implementierung für einfache Textfelder, also für alle, die nur einen Font in einer Farbe und Größe nutzen, keine Bilder in den Text einbetten, etc.

PS: Zum Code oben sei gesagt, dass ein Document niemals Methoden der Textkomponente aufruft. Ganz besonders nicht setText(String), da setText(String) nichts anderes macht, als das Document (also das Modell) zu aktualisieren.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JTextArea getText() Java Basics - Anfänger-Themen 1
A JTextArea entfernen und durch neuen Text ersetzen Java Basics - Anfänger-Themen 8
C Threads jTextArea Ausgabeproblem Java Basics - Anfänger-Themen 3
jaleda100 JTextArea Zeile einfügen Java Basics - Anfänger-Themen 1
Bluedaishi Datum in Jtextarea füllen Java Basics - Anfänger-Themen 5
V System.out.println zu JTextArea Java Basics - Anfänger-Themen 6
T JTextarea in txt datei speichern Java Basics - Anfänger-Themen 3
snipesss JTextArea wird nicht angezeigt Java Basics - Anfänger-Themen 3
R JTextArea final Status ändern Java Basics - Anfänger-Themen 11
T Klassen JTextArea und TextArea Java Basics - Anfänger-Themen 8
J JTextArea visible ohne Text Java Basics - Anfänger-Themen 3
D system.out.println >> JTextArea Java Basics - Anfänger-Themen 1
O JTextPane / JtextArea Zeilenabstand entfernen Java Basics - Anfänger-Themen 1
J Methoden JTextArea auslesen und in JTextfield ausgeben Java Basics - Anfänger-Themen 13
G Inhalt einer JTextArea wird nicht dargestellt Java Basics - Anfänger-Themen 8
G Klassen Richtig auf jTextArea aus anderer Klasse zugreifen? Java Basics - Anfänger-Themen 3
O JTextArea: Wo wird der Text gespeichert? Wie kann man es verhindern? Java Basics - Anfänger-Themen 4
M Farbiger Text in JTextArea Java Basics - Anfänger-Themen 5
H Input/Output JTextArea einzelne Zeile auslesen Java Basics - Anfänger-Themen 6
M Refresh JTextArea Java Basics - Anfänger-Themen 12
X Methode in JTextArea anzeigen lassen Java Basics - Anfänger-Themen 18
C JScrollPane + JTextArea scrollt nicht Java Basics - Anfänger-Themen 2
M Zeilenumbruch in JTextarea Java Basics - Anfänger-Themen 4
A String aus anderer Klasse in JTextArea einfügen Java Basics - Anfänger-Themen 7
Q jTextArea maximale Textlänge Java Basics - Anfänger-Themen 3
Q jTextArea Zeilenendzeichen Java Basics - Anfänger-Themen 4
G JTextArea: nur bestimmte Zeilen anders formatieren Java Basics - Anfänger-Themen 7
L Socket in JTextArea Java Basics - Anfänger-Themen 9
F JTextArea in .txt speichern Java Basics - Anfänger-Themen 13
E JTextArea beim Schreiben automatisch vergrößern Java Basics - Anfänger-Themen 7
F jTextArea Java Basics - Anfänger-Themen 3
D JTextArea Absätze von datei.txt übernehmen Java Basics - Anfänger-Themen 7
B Werte aus JTextArea in einem String Array ablegen Java Basics - Anfänger-Themen 4
N leere JTextArea wird nicht angezeigt - TextArea aber schon? Java Basics - Anfänger-Themen 5
B Werte der Variable aus Klasse JTextArea in einer Datei der Klasse RandomAcessFile speichern Java Basics - Anfänger-Themen 10
S JTextArea mit LineWrap true viel zu groß! Java Basics - Anfänger-Themen 2
D Object auf JTextpane / jTextArea casten? Java Basics - Anfänger-Themen 3
N ein Array auf eine JTextArea ausgeben Java Basics - Anfänger-Themen 2
B JTextArea Farbe und Schrift aendern Java Basics - Anfänger-Themen 2
R JTextArea append Java Basics - Anfänger-Themen 2
c_sidi90 jTextarea kein Zeilenumbruch erlauben Java Basics - Anfänger-Themen 4
M JTextArea Zeichen Beschränken Java Basics - Anfänger-Themen 11
R JScrollPane in JTextArea benutzen Java Basics - Anfänger-Themen 10
N Dateiinhalt zu jTextArea hinzufügen Java Basics - Anfänger-Themen 2
StrikeTom JTextArea mit txt-dateiinhalt füllen Java Basics - Anfänger-Themen 11
StrikeTom Quelltext einer Internetseite auf JTextArea anzeigen Java Basics - Anfänger-Themen 4
Benji0815 Inputstream aus Konsole in JTextArea Java Basics - Anfänger-Themen 14
K Text aus einem Datei lesen , und im JTextArea ausgeben. Java Basics - Anfänger-Themen 3
manunana89 Farbiger Textteile in JTextArea oder ähnlichem! Java Basics - Anfänger-Themen 5
B aktuelle Position einer JTextArea ermitteln Java Basics - Anfänger-Themen 6
Developer_X Strings in JTextarea suchen Java Basics - Anfänger-Themen 15
J Java JTextArea und ActionListener Probleme Java Basics - Anfänger-Themen 6
G Mit Tab aus der JTextArea? Java Basics - Anfänger-Themen 2
G JTextArea - farbige Schrift Java Basics - Anfänger-Themen 5
hdi Alternative zu JTextArea? Java Basics - Anfänger-Themen 3
T Text Rechtsbündig in jTextArea Java Basics - Anfänger-Themen 4
T Dynamischer JTabbedPane Probleme mit JTextArea Java Basics - Anfänger-Themen 2
I Schriftart für einzelnes Wort in der JTextArea auswählen Java Basics - Anfänger-Themen 3
B jTextArea Neuzeichnung erzwingen Java Basics - Anfänger-Themen 3
L JTextArea große setzen Java Basics - Anfänger-Themen 5
G in einer JTextArea ROTE SCHRIFT ausgeben Java Basics - Anfänger-Themen 11
H JTextarea mit automatischem Scrolling Java Basics - Anfänger-Themen 6
W Zeilenposition in JTextArea feststellen(ohne Caret) Java Basics - Anfänger-Themen 7
G Ausgababeumlenkung in JTextArea Java Basics - Anfänger-Themen 4
S Ausrichtung des Textes in einer JTextArea Java Basics - Anfänger-Themen 12
C JTextArea + Zeilennummerierung Java Basics - Anfänger-Themen 3
D Eine ganze Textdatei in einer jTextArea anzeigen Java Basics - Anfänger-Themen 4
D JTextarea mit Zeilenumbruchs Problem Java Basics - Anfänger-Themen 10
R JTextArea +Leerzeilen Java Basics - Anfänger-Themen 3
M String aus externer Klasse in JTextArea schreiben Java Basics - Anfänger-Themen 4
G JTextArea mit Daten aus Datenbank ( im Wert Sring ) befüllen Java Basics - Anfänger-Themen 3
I JtextArea zeigt nichts an! Java Basics - Anfänger-Themen 3
B JTextArea mit verschiedenen Fonts Java Basics - Anfänger-Themen 4
I JTextArea insert Methode Java Basics - Anfänger-Themen 5
G JTextArea: Anlegen, Text löschen, überschreiben Java Basics - Anfänger-Themen 4
G Zählen der Zeichen in JTextArea? Java Basics - Anfänger-Themen 4
G JTextArea Java Basics - Anfänger-Themen 7
E Bild in JTextArea einfügen Java Basics - Anfänger-Themen 16
E Automatischer Zeilen-Umbruch bei JTextArea Java Basics - Anfänger-Themen 4
N JPanel / JTextArea vergrößern Java Basics - Anfänger-Themen 6
H Zeilennummern in JTextArea Java Basics - Anfänger-Themen 3
S JTextArea Java Basics - Anfänger-Themen 6
G JTextArea: insertUpdate() und writeLock() Java Basics - Anfänger-Themen 3
P In JTextArea soll automisch an einen bestimmte Scrollbar pos Java Basics - Anfänger-Themen 14
J schleife unterbrechen JTextArea aktualisieren Java Basics - Anfänger-Themen 8
M Textfile in einer JTextArea anzeigen Java Basics - Anfänger-Themen 3
D Mehrfarbige Zeilen in JTextArea Java Basics - Anfänger-Themen 4
D Text aus JTextArea löschen ? Java Basics - Anfänger-Themen 10
G Aktion bei Änderung in JTextArea starten Java Basics - Anfänger-Themen 2
C Markierten Text im JTextArea bearbeiten? Java Basics - Anfänger-Themen 2
D JTextArea Probleme !!! Brauche eure Hilfe Java Basics - Anfänger-Themen 2
N JScrollPane mit JTextArea Java Basics - Anfänger-Themen 4
O Jtextarea bzw jtextpane rechtsbündig oder blocksatz Java Basics - Anfänger-Themen 6
M Prob bei JTextArea auf .setEditable(false) setzen Java Basics - Anfänger-Themen 2
S JTextArea.ReplaceAll() schneidet Zeichen weg Java Basics - Anfänger-Themen 3
S JTextArea Problem mit Anzeige Java Basics - Anfänger-Themen 2
P JScrollPane an JTextArea anhängen Java Basics - Anfänger-Themen 3
T JTextArea mit allen Formatierungen in eine Datei schreiben Java Basics - Anfänger-Themen 15
M Border um JTextArea? Java Basics - Anfänger-Themen 2
C Sonderzeichen (ä, ö, ü) in JTextArea Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben