【问题标题】:How to set scrollbar on TextArea in Java Swing?如何在 Java Swing 中的 TextArea 上设置滚动条?
【发布时间】:2019-08-01 03:27:21
【问题描述】:

我正在开发一个在 Java 中使用 Swing 库的项目。在我的窗口中,TextArea 填充了一些内容。

但是,TextArea 是静态的,没有滚动条,因此它只显示内容溢出之前的部分内容。

如何为我的 TextArea 添加可滚动性和/或使其动态化?

PS- 我对 Java 中的 Swing 和 GUI 非常陌生。

我在互联网上搜索了一个解决方案并找到了很多,但没有一个能够实施。

我尝试使用 ScrollPane、Scrollbar。我什至为 BorderLayout() 和 GridBagLayout 设置了一个布局管理器,但这只是把窗口弄乱了,并没有解决我的静态 TextArea 问题。

package crawler;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class WebCrawler extends JFrame {

    public WebCrawler() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("WebCrawlerWindow");
        setLocationRelativeTo(null);
        setSize(800, 600);

        JTextField urlName = new JTextField();
        urlName.setName("UrlTextField");
        urlName.setBounds(50,20,600,20);
        add(urlName);

        JTextArea jlb = new JTextArea("HTML code?");//this is the TextArea that needs to be scrollable
        jlb.setName("HtmlTextArea");
        jlb.setBounds(50,45,700,1000);
        jlb.setAutoscrolls(true);
        jlb.setLineWrap(true);
        jlb.setWrapStyleWord(true);
        jlb.disable();
        add(jlb, BorderLayout.CENTER);

        JButton download = new JButton();
        download.setName("RunButton");
        download.setBounds(660,20,70,20);
        download.setText("Get Code");

        var LINE_SEPARATOR = System.getProperty("line.separator");

        download.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String url = urlName.getText().toLowerCase();/* Get url from JTextField */
                try {
                    if(!url.substring(0,7).equals("https://"))
                        url = String.join("","https://", url);

                    final InputStream inputStream = new URL(url).openStream();
                    final BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
                    final StringBuilder stringBuilder = new StringBuilder();

                    String nextLine;
                    while ((nextLine = reader.readLine()) != null) {
                        stringBuilder.append(nextLine);
                        stringBuilder.append(LINE_SEPARATOR);
                    }

                    final String siteText = stringBuilder.toString();
                    jlb.setText(siteText);
                } catch(Exception ex) {
                    jlb.setText("Link Not Found");
                }
            }
        });
        add(download);

        setLayout(null);
        setVisible(true);
    }
}

【问题讨论】:

    标签: java swing jscrollpane jtextarea jscrollbar


    【解决方案1】:
    jlb.setAutoscrolls(true);
    ...
    add(jlb, BorderLayout.CENTER);
    

    setAutoScrolls(...) 方法不会使文本区域可滚动。

    您需要将文本区域添加到JScrollPane 并将滚动窗格添加到框架:

    //jlb.setAutoscrolls(true);
    ...
    //add(jlb, BorderLayout.CENTER);
    JScrollPane scrollPane = new JScrollPane( jlb );
    add(scrollPane, BorderLayout.CENTER);
    

    你也不应该使用空布局。 Swing 旨在与布局管理器一起使用。

    add(download, BorderLayout.PAGE_START);
    //add(download);
    //setLayout(null);
    

    阅读 How to Use Border Layout 上的 Swing 教程部分,了解上述建议如何影响布局。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-03
      • 2016-02-29
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多