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

标签 java swing chat jscrollpane jtextarea

这是我第一次使用任何 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 对象,一个滚动 Pane 甚至无效,另一个滚动 Pane 有效但停留在一定大小。在 keyPress 监听器上,我可以检查文本区域是否超过某个限制,然后它会切换面板的布局?内部 JTextArea 仍然是同一个对象,只是不同的布局对象。对该方法有何看法?

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

最佳答案

我编写了一个小程序,仅使用 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

关于java - 当 JTextArea 超过一定数量的行时启用滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9370561/

相关文章:

java - 错误: java heap space on Google Data-Proc Cluster

java - Eclipse + Java : How do I import classes from the default package?

objective-c - Objective C,实现聊天应用程序的最佳方式(套接字)

javascript - Angular 7 - 设计桌面聊天界面组件的有效方法?

javascript - 在Django中实现Chat的最佳实践(存储在线用户)

java - spring 错误 :org. springframework.web.context.ContextLoader - 上下文初始化失败

Java 类型级别注解和私有(private)成员可见性

java - JPanel 不填充包含 JFrame

java - 如何在加载 Swing 构建 GUI 时更新/绘制 JProgressBar

java - 绘制 Graphics2D 绘图后对其进行处理