我有一个包含JTextArea的JScrollPane的JFrame。滚动窗格配置为从不显示水平滚动条,并根据需要显示垂直滚动条。 随着文本区域中的文本增长,最终会出现垂直滚动条,隐藏文本区域的一部分。我希望滚动条在滚动条出现时根据需要调整其内容的大小。
我发现的一个解决方法是始终显示垂直滚动条,但这看起来并不好,因为它很少需要。
以下代码段在我的系统(Windows 10)上输入足够的文本后重现问题
import javax.swing.*;
import java.awt.*;
import static javax.swing.ScrollPaneConstants.*;
public class Test {
public static void main(String[] args) {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JLabel("text"));
panel.add(new JLabel("text"));
panel.add(new JLabel("text"));
JTextArea textArea = new JTextArea();
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setText("This text fits");
panel.add(textArea);
JScrollPane scrollPane =
new JScrollPane(panel, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_NEVER);
JFrame frame = new JFrame("Title");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(scrollPane);
frame.pack();
frame.setVisible(true);
}
}
答案 0 :(得分:2)
要解决此问题,请更改:
JTextArea textArea = new JTextArea();
致:
JTextArea textArea = new JTextArea(1,20);
通过向文本区域提供大小提示,滚动窗格可以在添加更多文本时更好地处理它。
答案 1 :(得分:0)
组件放置的问题。请参阅以下代码:
public TestFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
setContentPane(contentPane);
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
JScrollPane scrollPane = new JScrollPane();
contentPane.add(scrollPane);
JPanel panel = new JPanel();
scrollPane.setColumnHeaderView(panel);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
JLabel lblNewLabel = new JLabel("text");
panel.add(lblNewLabel);
JLabel lblNewLabel_2 = new JLabel("text");
panel.add(lblNewLabel_2);
JLabel lblNewLabel_1 = new JLabel("text");
panel.add(lblNewLabel_1);
JTextArea textArea = new JTextArea();
textArea.setLineWrap(true);
textArea.setText("This text fits");
scrollPane.setViewportView(textArea);
}
希望这会有所帮助。 : - )
答案 2 :(得分:0)
在没有显示水平滚动条的情况下玩游戏并不是真的有帮助。
相反,您需要实现Scrollable
接口来告诉滚动窗格,面板应始终适合滚动窗格的宽度。这将导致文本区域中的文本在添加文本时正确包装。
您可以使用Scrollable Panel代替实现Scrollable
接口,它允许您使用类的方法更改可滚动属性。
您只需更改代码,如下所示:
//JPanel panel = new JPanel();
ScrollablePanel panel = new ScrollablePanel();
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
答案 3 :(得分:-1)
覆盖doLayout()并做任何你想做的事情,在doLayout()中,你最终要知道如何处理子组件(在布局管理器完成工作之后)。
但是你需要首先使textArea和scrollPane成为属性,因为你需要稍后引用它们:
private static JTextArea textArea;
private static JScrollPane scrollPane;
public static void main(String[] args) {
JPanel panel = new JPanel() {
@Override
public void doLayout() {
super.doLayout();
if (scrollPane.getVerticalScrollBar().isVisible()) {
textArea.setSize(textArea.getWidth() - 3, textArea.getHeight());
}
}
};