Включение полос прокрутки, когда JTextArea превышает определенное количество строк - PullRequest
5 голосов
/ 21 февраля 2012

Я впервые использую любой веб-сайт StackExchange, поэтому давайте посмотрим, как он работает.

Итак, я делал «локальную» программу чата на 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 меня не устраивает;)

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

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

Ответы [ 2 ]

8 голосов
/ 21 февраля 2012

Я написал небольшую программу, которая изменяет размер JTextArea максимум до 4 строк, используя только элементы управления 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);
    }
}

Вот как это выглядит для 1 строки, 4 строки и 8 строк:*

1 line4 lines8 lines

2 голосов
/ 21 февраля 2012

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

...