2012-02-21 7 views
5

questa è la mia prima volta che utilizzo qualsiasi sito Web di StackExchange, quindi vediamo come va.Abilitare le barre di scorrimento quando JTextArea supera determinate quantità di righe

Quindi ho creato un programma di chat "locale" in Java e utilizzavo un campo JText per l'immissione della chat. Ma volevo consentire la chat multilinea, quindi sono passato a JTextArea. Sto usando un GroupLayout (creato con Window Builder Pro - eclipse) per ridimensionare facilmente le finestre/componenti. Ecco una foto:

enter image description here

Il JTabbedPane, il JTextArea e il pulsante Invia sono tutte contenute in un JPanel, e tutte le cose a sinistra è in essa la propria JPanel. Quindi ho il JTextArea e il pulsante ancorato al fondo del JPanel destro. JTextArea può ridimensionarsi verticalmente, ma il pulsante no. sono stato in grado di ottenere il JTextArea a crescere verticalmente quando entro in nuove linee, mostrano di seguito:

enter image description here

Ma io sono in grado di pensare in modo tale che se entro una certa quantità di linee in il JTextArea, le barre di scorrimento appariranno e impediranno a JTextArea di occupare altro spazio. Così ho provato a inserire JTextArea in un JScrollPane, ma inizialmente disabilitavo le scrollbars e poi li abilitavo quando avevo bisogno di JTextArea per iniziare a scorrere, ma ho imparato che se lo avvolgo, JScrollPane non crescerà ma agirà come se fosse con le barre di scorrimento visibili ma ... senza di loro. :/

** ho voluto mettere un link qui, ma StackOverflow non mi piace;)

Quindi, io sono un po 'bloccato ... C'è qualcosa che fa questo che ho' m mancante? Stavo pensando che avrei potuto creare solo due diversi oggetti GroupLayout, uno con lo scrollpane non ancora valido, e poi altri con lo scrollpane valido ma bloccato a una certa dimensione. Sul listener keyPress potrei controllare se l'area di testo supera un certo limite e quindi cambierà il layout per il pannello? Il JTextArea interno sarebbe ancora lo stesso oggetto, ma solo diversi oggetti di layout. Opinioni su questo approccio?

In ogni caso, grazie in anticipo a tutti coloro che si prendono il loro tempo per rispondere a questo. :)

risposta

8

ho scritto un piccolo programma che ridimensiona il JTextArea fino ad un massimo di 4 linee usando solo i controlli swing

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

public class ResizeTextArea { 

    public static final int CHAT_ROW_LIMIT = 4; 

    public static void main(String[] args) { 
     JPanel topPanel = new JPanel(); 
     topPanel.setPreferredSize(new Dimension(200, 200)); 
     topPanel.setBackground(Color.WHITE); 

     final JTextArea chatArea = new JTextArea(); 
     final JScrollPane scrollPane = new JScrollPane(chatArea); 

     final JPanel mainPanel = new JPanel(new BorderLayout(5,5)); 
     mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     mainPanel.add(topPanel, BorderLayout.CENTER); 
     mainPanel.add(scrollPane, BorderLayout.SOUTH); 

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

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

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

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

      private void updateLineCount() { 
       int lineCount = chatArea.getLineCount(); 
       if (lineCount <= CHAT_ROW_LIMIT) { 
        chatArea.setRows(lineCount); 
        mainPanel.revalidate(); 
       } 
      } 
     }); 

     JFrame f = new JFrame("ResizeTextArea"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(mainPanel); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

Ecco come appare per 1 linea, 4 linee, e 8 linee:

1 line4 lines8 lines

+0

Grazie mille! Ho usato il codice DocumentListener e ho apportato alcune modifiche personalizzate a GroupLayout e funziona come un incantesimo: D –

+0

+1 per 'DocumentListener'; vedere anche questo relativo [esempio] (http://stackoverflow.com/q/15039652/230513). – trashgod

+0

So che questa domanda non è stata attiva in 5 anni, ma in riferimento alla tua risposta, @ughzan, il codice 'revalidate()' funzionerà anche in un JScrollPane, o qualsiasi altro elemento che è un genitore di JTextArea? – Ryan

2

È possibile aggiungere un DocumentFilter al documento di jTextArea. Nel filtro controlla il conteggio delle righe di jTextArea e consenti/impedisce l'aggiunta di testo in base al valore del conteggio delle righe.