这是我第一次使用任何 StackExchange 网站,所以让我们看看它是如何进行的。
所以我一直在用 Java 制作一个“本地”聊天程序,并使用 JTextField 进行聊天输入。但我想允许多线聊天,所以我切换到 JTextArea。我正在使用 GroupLayout(使用 Window Builder Pro - eclipse 构建)来轻松调整窗口/组件的大小。这是一张照片:
JTabbedPane、JTextArea 和发送按钮都包含在一个 JPanel 中,左边的所有内容都在它自己的 JPanel 中。所以我将 JTextArea 和按钮停靠在右侧 JPanel 的底部。 JTextArea 允许垂直调整大小,但按钮不允许。 当我输入新行时,我能够让 JTextArea 垂直增长,如下所示:
但我无法想出一种方法,如果我在 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 行的查找方式:
关于java - 当 JTextArea 超过一定数量的行时启用滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9370561/