这是我第一次使用任何StackExchange网站,所以让我们看看它是怎么回事。
所以我一直用Java制作一个'本地'聊天程序,并使用JTextField进行聊天输入。但我想允许多行聊天,所以我切换到JTextArea。我正在使用GroupLayout(使用Window Builder Pro-eclipse构建),以便轻松调整窗口/组件的大小。这是一张图片:
JTabbedPane,JTextArea和Send按钮都包含在JPanel中,左边的所有内容都在它自己的JPanel中。所以我有JTextArea和按钮停靠在右侧JPanel的底部。允许JTextArea垂直调整大小,但按钮不允许。 当我输入新行时,我能够让JTextArea垂直增长,如下所示:
但我无法想办法,如果我在JTextArea中输入一定数量的行,则会出现滚动条并阻止JTextArea占用更多空间。 所以我尝试将JTextArea包装在JScrollPane中但最初禁用滚动条,然后在我需要JTextArea开始滚动时启用它们,但我了解到如果我将它包装起来,JScrollPane将不会增长但仍然会像它一样滚动条可见,但......没有它们。 :/
**我想在这里放一个链接,但StackOverflow不喜欢我;)
所以,我有点卡住...... 我有什么东西可以做到这一点吗? 我想我可以创建两个不同的GroupLayout对象,一个滚动窗格甚至没有效果,然后其他滚动窗格有效,但卡在一定大小。在keyPress监听器上,我可以检查文本区域是否超过某个限制,然后它会切换面板的布局?内部JTextArea仍然是同一个对象,但只是不同的布局对象。关于这种方法的意见?
无论如何,提前感谢所有花时间回答这个问题的人。 :)
答案 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 :(得分:2)
您可以将DocumentFilter添加到jTextArea的文档中。在过滤器中检查jTextArea的行数,并根据行计数值允许/阻止文本添加。