2011-05-09 4 views
2

Je commence par créer un JTextArea d'une taille spécifique. L'utilisateur peut ajouter du texte à l'intérieur mais il sera coupé s'il devient trop long (verticalement ou horizontalement). Je veux que JTextArea s'étende ou se contracte automatiquement (pour la suppression du texte). Je peux permettre aux utilisateurs de changer la police et la taille de la police dans le futur, donc ce serait bien si je pouvais éviter de faire augmenter/diminuer les choses d'une certaine taille. J'utilise actuellement des limites pour dimensionner mon JTextArea. Peut-être devrais-je dimensionner par lignes et colonnes et utiliser un auditeur et agir de manière appropriée?expansion/contraction dynamique automatique de JTextArea en Java

merci d'avance!

Répondre

2

Je ne peux imaginer pourquoi vous voulez faire cela, pourquoi ne pas mettre un JTextArea dans un JScrollPane, mais ok, je vais jouer le long ... Peut-être quelque chose comme ceci:

import java.awt.Container; 

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 


public class Expander extends JFrame { 

    private final JTextArea area; 
    private int hSize = 1; 
    private int vSize = 1; 

    public Expander() { 
     Container cp = getContentPane(); 
     cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS)); 

     cp.add(Box.createHorizontalGlue()); 
     area = new JTextArea(vSize, hSize); 
     cp.add(area); 
     cp.add(Box.createHorizontalGlue()); 

     area.getDocument().addDocumentListener(new DocumentListener() { 

      @Override 
      public void insertUpdate(DocumentEvent e) { 
       adjust(); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       adjust(); 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       adjust(); 
      } 
     }); 

     pack(); 
    } 

    private void adjust() { 
     int maxColumns = getMaxColumns(); 
     if ((area.getLineCount() != vSize) || (maxColumns != hSize)) { 
      hSize = maxColumns; 
      vSize = area.getLineCount(); 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        area.setColumns(hSize); 
        area.setRows(vSize); 
        Expander.this.doLayout(); 
        Expander.this.pack(); 
       } 
      }); 
     } 
    } 

    private int getMaxColumns() { 
     int startOffset = 0; 
     int maxColumns = 0; 
     for (int i = 0; i < area.getLineCount(); i++) { 
      try { 
       int endOffset = area.getLineEndOffset(i); 
       int lineSize = endOffset - startOffset; 
       if (lineSize > maxColumns) { 
        maxColumns = lineSize; 
       } 
       startOffset = endOffset; 
      } catch (BadLocationException ble) { 
      } 
     } 

     return maxColumns; 
    } 

    public static void main(String[] args) { 

     Expander e = new Expander(); 
     e.setLocationRelativeTo(null); 
     e.setVisible(true); 
    } 
} 
+0

Merci! J'en ai besoin parce que j'ai besoin que tout le texte soit visible à la fois. Dans l'ensemble, je veux avoir ces «morceaux de texte» que l'utilisateur peut se déplacer et interagir avec. – matthieu

2

J'appuie le conseil pour simplement mettre le JTextArea dans un JScrollPane et laisser ceci prendre soin du texte supplémentaire. Aussi et peut-être le plus important, ne pas définir les limites de la JTextArea parce que si vous faites cela, vous contraindre à une certaine taille et ce n'est pas ce que vous voulez avoir. Au lieu de cela, initialisez votre JTextArea avec deux constantes int pour représenter le nombre de lignes et de colonnes qui doivent être visualisées, puis placez-le dans un JScrollPane. Veillez également à lire sur l'utilisation des gestionnaires de disposition de sorte que vous pouvez éviter de définir la taille de votre JScrollPane aussi! Edit: lors du test, il semble que setPreferredSize soit plus dangereux pour JTextArea que setSize.

import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.*; 

public class ConstrainedTextArea extends JPanel { 
    private JTextArea textArea1, textArea2, textArea3; 

    public ConstrainedTextArea() { 
     textArea1 = new JTextArea(20, 30); 
     textArea2 = new JTextArea(); 
     textArea3 = new JTextArea(); 

     textArea2.setPreferredSize(new Dimension(300, 300)); 
     textArea3.setSize(textArea3.getPreferredSize()); 

     setLayout(new GridLayout(1, 0)); 
     add(new JScrollPane(textArea1)); 
     add(new JScrollPane(textArea2)); 
     add(new JScrollPane(textArea3)); 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("ConstrainedTextArea"); 
     frame.getContentPane().add(new ConstrainedTextArea()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 
+0

Merci! J'en ai besoin de cette façon parce que j'ai besoin de tout le texte pour être visible à la fois ... donc je ne pouvais pas utiliser une barre de défilement. Dans l'ensemble, je veux avoir ces «morceaux de texte» que l'utilisateur peut se déplacer et interagir avec. – matthieu