有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JScrollPane中的java Dynamic JTextArea位于滚动条下

我有一个JFrame和一个包含JTextArea的JScrollPane。scrollpane配置为从不显示水平滚动条,而根据需要显示垂直滚动条。 随着文本区域中文本的增长,垂直滚动条最终出现,隐藏部分文本区域。当滚动条出现时,我希望滚动条能够根据需要调整其内容的大小

我发现的一个解决方法是始终显示垂直滚动条,但这看起来不太好,因为很少需要它

在我的系统(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) 个答案

  1. # 1 楼答案

    要解决此问题,请更改:

    JTextArea textArea = new JTextArea();
    

    致:

    JTextArea textArea = new JTextArea(1,20);
    

    通过向文本区域提供大小提示,当添加更多文本时,滚动窗格能够更好地处理它

  2. # 2 楼答案

    只是组件的放置有问题。请参阅以下代码:

    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);
    }
    

    希望这会有所帮助。:-)

  3. # 3 楼答案

    重写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());
                }
            }
        };
    
  4. # 4 楼答案

    玩不显示水平滚动条的游戏并没有真正的帮助

    相反,您需要实现Scrollable接口来告诉scrollpane面板应该始终适合scrollpane的宽度。这将导致文本区域中的文本在添加文本时被正确包装

    您可以使用Scrollable Panel而不是实现Scrollable接口,它允许您使用类的方法更改可滚动属性

    您只需按如下方式更改代码:

    //JPanel panel = new JPanel();
    ScrollablePanel panel = new ScrollablePanel();
    panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );