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);
}
}