2012-02-21 5 views
5

это мой первый раз, используя любой веб-сайт StackExchange, поэтому давайте посмотрим, как это происходит.Включение полос прокрутки, когда JTextArea превышает определенное количество строк

Так что я делаю «локальную» чат-программу на Java и использовал JTextField для ввода в чат. Но я хотел разрешить многострочный чат, поэтому я переключился на JTextArea. Я использую GroupLayout (встроенный в Window Builder Pro - eclipse) для удобного изменения размера окна/компонента. Вот картинка:

enter image description here

JTabbedPane, то JTextArea и кнопку отправки все содержащиеся в JPanel, и весь материал слева находится в его собственном JPanel. Таким образом, у меня есть JTextArea, и кнопка состыкована с нижней частью правой JPanel. JTextArea разрешено изменять размер по вертикали, но кнопка отсутствует. я был в состоянии получить JTextArea расти вертикально, когда я ввожу новые строки, показано ниже:

enter image description here

Но я не могу придумать способ, так что, если я вхожу в определенное количество строк в появятся полосы прокрутки JTextArea, и JTextArea не будет занимать больше места. Итак, я попробовал обернуть JTextArea в JScrollPane, но сначала отключил полосы прокрутки, а затем включил их, когда мне понадобилось JTextArea, чтобы начать прокрутку, но я узнал, что если я его оберну, JScrollPane не будет расти, но все равно будет действовать так, как если бы с видимыми полосами прокрутки, но ... без них. :/

** Я хотел поставить ссылку здесь, но StackOverflow не любит меня;)

Итак, я вроде застрял ... Есть ли что-то, что делает это, что я m отсутствует? Я думал, что могу просто создать два разных объекта GroupLayout: один с scrollpane даже не действителен, а другой - с scrollpane, действительным, но застрявшим в определенном размере. На слушателе keyPress я мог проверить, превышает ли текстовая область определенный предел, а затем переключит макет панели? Внутренний JTextArea все равно будет одним и тем же объектом, но только разными объектами макета. Мнения о таком подходе?

В любом случае, заранее заблаговременно всем, кто не спешит ответить на этот вопрос. :)

ответ

8

Я написал небольшую программу, которая изменяет размер JTextArea до максимума 4 линий, используя только средства управления Качели

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

Вот как это выглядит на 1 линию, 4 линии и 8 линий:

1 line4 lines8 lines

+0

Спасибо вам большое! Я использовал код DocumentListener и внедрил некоторые модификации в GroupLayout, и он работает как шарм: D –

+0

+1 для 'DocumentListener'; см. также этот [пример] (http://stackoverflow.com/q/15039652/230513). – trashgod

+0

Я знаю, что этот вопрос не был активен через 5 лет, но, ссылаясь на ваш ответ, @ughzan, будет ли код 'revalidate()' также работать в JScrollPane или любой другой элемент, являющийся родителем JTextArea? – Ryan

2

Вы можете добавить DocumentFilter в документ jTextArea. В списке фильтров проверьте количество строк jTextArea и разрешите/запретите добавление текста в зависимости от значения счетчика строк.

Смежные вопросы