Newsgroup: it.comp.java
Titolo: Limitare il numero di caratteri in un JEditorPane

Ciao,
   il problema è: come limitare il numero di caratteri inseribili in un 
JEditorPane che gestisce documenti di testo (plain, non rtf o html)?
Lo scenario prevede un'applet contenente un JEditorPane (editor) con 
funzioni di undo, redo, cut, copy, paste e save abilitate.
Quello che vorrei è mostrare all'utente della mia applicazione il numero 
di caratteri inseriti sul totale (e fino a qui me la sono cavata con un 
CaretListener e un editor.getText().getLength() per impostare una 
JLabel). Ora, però, non so dove sbattere la testa per inibire 
l'inserimento una volta raggiunto il numero massimo di caratteri.
T.I.A.
-- 
||//endaar / non e' bello cio' che e' bello
||\\______/  e' bello cio' che e' kender
CdHer #1, FIDDer #27, Membro del Consiglio dei Due della LILV

Prima di tutto scuami per strafalcioni o cacchiate varie che potresti
trovare
nelle righe di codice che seguono (è poco che programmo :(  ),
poi :
c'ho messo un pò ma il codice che segue funziona alla grande(almeno per il
mio standard)
magari mi dirai che la variabile che definisce quanti caratteri puoi
inserire sarebbe
meglio trattarla un pò + dinamicamente
        je = new JEditorPane();
        je.addKeyListener(new KeyAdapter(){
            int iMaxCar = 10;
            boolean bBack = false;
            public void keyPressed(KeyEvent e){
                bBack = e.getKeyCode() == KeyEvent.VK_BACK_SPACE;
                if(e.getKeyCode() == KeyEvent.VK_V && e.isControlDown()){
                    Clipboard p = getToolkit().getSystemClipboard();
                    try{
                        String data =
(String)p.getContents(je).getTransferData(DataFlavor.stringFlavor);
                        if(data.length() + je.getText().length() > iMaxCar)
                            e.consume();
                    }catch(Exception x){}
                }
            }
            public void keyTyped(KeyEvent e){
                if(je.getText().length() >= iMaxCar && !bBack){
                    e.consume();
                }
            }
        });
A proposito grazie ...

Ecco te pare mi ero scordato :

import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
 fammi sapere ok ciao..

A dire il vero ho trovato, un pochino nascosto, nei meandri del 
tutorial, una classe che estende DefaultStyleDocument:
public class LimitedStyledDocument extends DefaultStyledDocument
{
private int maxChars;
private JLabel statusLine;
public LimitedStyledDocument(JLabel statusLine, int maxChars)
{
	this.maxChars = maxChars;
	this.statusLine = statusLine;
}
public void insertString(int offs, String str, AttributeSet a)
	throws BadLocationException
{
	if ((getLength() + str.length()) <= maxChars)
	{
		super.insertString(offs, str, a);
	}
	else
	{
		Toolkit.getDefaultToolkit().beep();
		statusLine.setForeground(Color.RED);
		statusLine.setText("Too much characters: insertion aborted");
	}
}
}
La classe, inoltre aggiunge un messaggio ad una status line (JLabel) ed 
emette un beep (soluzione IMHO migliore rispetto ad una JOptionPane 
perché non costringe l'utente a premere OK ogni volta che supera la soglia)
Inoltre, siccome nel tutorial si suggeriva di usare un JTextPane, mi 
sono uniformato (non è che abbia molto chiaro il funzionamento di 
EditorKit, Document, EditorPane etc, etc...). Quindi il JTextPane è 
stato creato così:
	JTextPane editor = new JTextPane(
		new LimitedStyledDocument(statusLine, maxLength));
	editor.setFont(new Font("Monospaced",Font.PLAIN,12));
	editor.setEditable(true);
HTH
