当JTextArea超过一定数量的行时启用滚动条

时间:2012-02-21 00:40:24

标签: java swing chat jscrollpane jtextarea

这是我第一次使用任何StackExchange网站,所以让我们看看它是怎么回事。

所以我一直用Java制作一个'本地'聊天程序,并使用JTextField进行聊天输入。但我想允许多行聊天,所以我切换到JTextArea。我正在使用GroupLayout(使用Window Builder Pro-eclipse构建),以便轻松调整窗口/组件的大小。这是一张图片:

enter image description here

JTabbedPane,JTextArea和Send按钮都包含在JPanel中,左边的所有内容都在它自己的JPanel中。所以我有JTextArea和按钮停靠在右侧JPanel的底部。允许JTextArea垂直调整大小,但按钮不允许。 当我输入新行时,我能够让JTextArea垂直增长,如下所示:

enter image description here

但我无法想办法,如果我在JTextArea中输入一定数量的行,则会出现滚动条并阻止JTextArea占用更多空间。 所以我尝试将JTextArea包装在JScrollPane中但最初禁用滚动条,然后在我需要JTextArea开始滚动时启用它们,但我了解到如果我将它包装起来,JScrollPane将不会增长但仍然会像它一样滚动条可见,但......没有它们。 :/

**我想在这里放一个链接,但StackOverflow不喜欢我;)

所以,我有点卡住...... 我有什么东西可以做到这一点吗? 我想我可以创建两个不同的GroupLayout对象,一个滚动窗格甚至没有效果,然后其他滚动窗格有效,但卡在一定大小。在keyPress监听器上,我可以检查文本区域是否超过某个限制,然后它会切换面板的布局?内部JTextArea仍然是同一个对象,但只是不同的布局对象。关于这种方法的意见?

无论如何,提前感谢所有花时间回答这个问题的人。 :)

2 个答案:

答案 0 :(得分:8)

我编写了一个小程序,仅使用Swing控件将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 line 4 lines 8 lines

答案 1 :(得分:2)

您可以将DocumentFilter添加到jTextArea的文档中。在过滤器中检查jTextArea的行数,并根据行计数值允许/阻止文本添加。