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

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

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

在此处输入图像描述

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

在此处输入图像描述

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

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

所以,我有点卡住……有什么东西可以做到这一点,我错过了吗? 我想我可以创建两个不同的GroupLayout对象,一个滚动窗格甚至没有效果,然后其他滚动窗格有效,但卡在一定大小。 在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行4行8行

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