2012-02-21 9 views
5

esta es la primera vez que uso cualquier sitio web de StackExchange, así que vamos a ver cómo funciona.Activando barras de desplazamiento cuando JTextArea excede cierta cantidad de líneas

Así que he estado haciendo un programa de chat "local" en Java, y estaba usando un JTextField para la entrada de chat. Pero quería permitir el chat multilínea, así que cambié a JTextArea. Estoy usando un GroupLayout (construido con Window Builder Pro - eclipse) para facilitar el cambio de tamaño de ventanas/componentes. Aquí hay una foto:

enter image description here

El JTabbedPane, el JTextArea y el botón Enviar están contenidos en un JPanel, y todas las cosas a la izquierda está en su propio JPanel. Así que tengo JTextArea y el botón acoplado en la parte inferior del JPanel derecho. El JTextArea puede cambiar el tamaño verticalmente, pero el botón no. que era capaz de conseguir el JTextArea a crecer verticalmente cuando entro en nuevas líneas, muestran a continuación:

enter image description here

Pero soy incapaz de pensar en una manera de modo que si entro en una cierta cantidad de líneas en JTextArea, las barras de desplazamiento aparecerán y evitarán que JTextArea ocupe más espacio. Así que traté de envolver el JTextArea en un JScrollPane pero inhabilitó las barras de desplazamiento inicialmente y luego las habilité cuando necesité el JTextArea para comenzar a desplazarme, pero aprendí que si lo envuelvo, el JScrollPane no crecerá, pero seguirá actuando como lo haría. con las barras de desplazamiento visibles pero ... sin ellas. :/

** quería poner un enlace aquí, pero stackoverflow no me gusta;)

lo tanto, estoy un poco atascado ... ¿Hay algo que hace que yo' ¿Me falta? Estaba pensando que solo podía crear dos objetos GroupLayout diferentes, uno con el panel de desplazamiento ni siquiera válido, y luego otro con el panel de desplazamiento válido pero atascado en un cierto tamaño. En el oyente de keyPress, pude verificar si el área de texto excede un cierto límite y luego cambiaría el diseño del panel. El JTextArea interno seguiría siendo el mismo objeto, pero solo objetos de diseño diferentes. Opiniones sobre ese enfoque?

De todos modos, gracias de antemano a todos los que se toman su tiempo para responder a esto. :)

Respuesta

8

me escribió un pequeño programa que cambia el tamaño del JTextArea hasta un máximo de 4 líneas usando sólo los controles de oscilación

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

Aquí es cómo se ve de 1 línea, 4 líneas y 8 líneas:

1 line4 lines8 lines

+0

¡Gracias soooo much! Utilicé el código de DocumentListener e hice algunas modificaciones personalizadas al GroupLayout y funciona como un amuleto: D –

+0

+1 para 'DocumentListener'; vea también este relacionado [ejemplo] (http://stackoverflow.com/q/15039652/230513). – trashgod

+0

Sé que esta pregunta no ha estado activa en 5 años, pero en referencia a su respuesta, @ughzan, ¿el código 'revalidate()' también funcionaría en un JScrollPane, o cualquier otro elemento que sea padre de JTextArea? – Ryan

2

Puede agregar un DocumentFilter al documento de jTextArea. EN el filtro, verifique el recuento de filas de su jTextArea y permita/impida que se agregue texto dependiendo del valor del recuento de filas.

Cuestiones relacionadas