JScrollPane中的动态JTextArea最终在滚动条下

时间:2017-08-17 08:47:25

标签: java swing jscrollpane jtextarea

我有一个包含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);
    }
}

4 个答案:

答案 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());
            }
        }
    };