2017-10-14 19 views
0

J'ai une question, qui apparaît pendant le codage: Je veux m'assurer, à propos de cette question, alors j'espère que vous pourriez m'aider!Longueur de Java Swing JTextArea?

Donc, je pense à ce sujet, est la longueur JTextArea infinie? Ou combien de caractères peuvent être utilisés au maximum?

J'ai essayé de l'écrire manuellement, mais je me suis ennuyé, environ 5000 lignes, et 100 000 caractères, alors quelle est la limite sur le JTextArea?

Je travaille sur un programme de discussion, et c'est important pour moi, mais je n'ai trouvé nulle part la réponse.

+0

Commander question similaire comme la vôtre https://stackoverflow.com/questions/13863795/force-max-caractères-sur-swing-jtextarea-avec-un-peu-courbe-balles –

+1

Je suggère que la longueur est probablement fixée à la longueur maximale d'un 'String' ou tableau, qui est moins alors 'Integer.MAX_VALUE' – MadProgrammer

+0

@SamDev Je ne pense pas que l'OP veut limiter le nombre de caractères, mais veut connaître la théorie al le nombre maximum de caractères qu'un 'JTextArea' pourrait contenir – MadProgrammer

Répondre

0

Merci MadProgrammer pour me corriger.

Si vous souhaitez définir la limite de JTextArea:

Pour mettre en œuvre un filtre de documents, créer une sous-classe de DocumentFilter puis l'attacher à un document en utilisant la méthode setDocumentFilter définie dans la classe AbstractDocument. Bien qu'il soit possible d'avoir des documents qui ne descendent pas de AbstractDocument, les composants de texte Swing utilisent par défaut les sous-classes AbstractDocument pour leurs documents.

L'application TextComponentDemo possède un filtre de document, DocumentSizeFilter, qui limite le nombre de caractères que le volet de texte peut contenir. Voici le code qui crée le filtre et qu'il attache au document du volet texte:

JTextPane textPane; 
AbstractDocument doc; 
static final int MAX_CHARACTERS = 300; 
... 
textPane = new JTextPane(); 
... 
StyledDocument styledDoc = textPane.getStyledDocument(); 
if (styledDoc instanceof AbstractDocument) { 
doc = (AbstractDocument)styledDoc; 
doc.setDocumentFilter(new DocumentSizeFilter(MAX_CHARACTERS)); 
} 

source: http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter

+0

L'OP n'essaie pas de limiter le nombre de caractères, mais veut savoir quelle est la limite maximum IS - combien de caractères un JTextArea peut-il supporter – MadProgrammer

+0

* "JTextArea est infini" * - Non, ce n'est pas le cas. Basé sur l'implémentation de 'PlainDocument', le mécanisme de stockage sous-jacent est un' char [] ', qui est limité à moins de' Integer.MAX_VALUE', dans la plupart des cas, beaucoup plus petit en raison du besoin des éléments du tableau être mis en mémoire de façon continue. Parce que 'JTextArea' est aussi capable de renvoyer un' String' du texte, nous pouvons en outre supposer que la limite du composant doit être la longueur maximale d'un 'int' car' String # length' ne renvoie qu'un 'int'. .. qui est la réponse de base – MadProgrammer

3

Alors, je pense à ce sujet, est la longueur de JTextArea infinie? Ou combien de caractères peuvent être utilisés max?

Non, JTextArea n'est pas infinite.

Nous pouvons entendre la longueur maximale basée sur le fait que JTextArea ne renvoie un String, qui a une length qui retourne un int. Cela implique que la longueur maximale d'un JTextArea est liée à Integer.MAX_VALUE, mais, en raison des frais généraux de tableau, est légèrement plus petit. Mais en pratique, vous constaterez probablement qu'il est beaucoup plus petit, en raison de la nécessité de mettre les tableaux en mémoire de manière continue, cela dépendra donc de la quantité de mémoire disponible et de la fragmentation de la JVM.

Nous pouvons continuer à enquêter sur cela et jeter un oeil à PlainDocument, qui est la valeur par défaut Document utilisé par JTextArea, qui utilise un char[] comme sa structure de données interne, tout comme String.

Cette autre Bétons le raisonnement que la limite d'un JTextArea est limitée à moins de Integer.MAX_VALUE

Vous pouvez jeter un oeil à Do Java arrays have a maximum size?, Why I can't create an array with large size? et Why the maximum array size of ArrayList is Integer.MAX_VALUE - 8? pour des discussions sur les raisons d'un tableau ne peut pas être déclaré comme Integer.MAX_VALUE

maintenant, avant que quelqu'un suggère que vous pourriez écrire une implémentation de liste chaînée d'un Document, ne pas oublier que les deux Document et JTextArea comptent sur String, ce qui est un facteur limitant clé

1

Je travaille sur un programme de chat, ce qui est important pour moi

La zone de texte prend en charge au moins plusieurs valeur bibles du texte (à savoir 'beaucoup'). Beaucoup plus que ce qui pourrait jamais être lu par un lecteur occasionnel et immensément plus que ce qui devrait apparaître dans un «programme de chat».

Voici un petit exemple qui montre plus de 1,1 millions de lignes de production sur les noms des caractères Unicode:

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class HowLongTextArea { 

    private JComponent ui = null; 

    HowLongTextArea() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new BorderLayout(4,4)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     JTextArea ta = new JTextArea(15, 40); 
     StringBuilder sb = new StringBuilder(); 
     String eol = System.getProperty("line.separator"); 
     for (int ii=0; ii<Character.MAX_CODE_POINT; ii++) { 
      sb.append((ii+1) + "\t" + Character.getName(ii) + eol); 
      if (ii%10000==0) { 
       System.out.println("ii: " + ii); 
      } 
     } 
     ta.setText(sb.toString()); 
     ui.add(new JScrollPane(ta)); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       HowLongTextArea o = new HowLongTextArea(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
}