如何在 Java Swing 的 TextArea 上设置滚动条?
How to set scrollbar on TextArea in Java Swing?
我正在开发一个使用 Java 中的 Swing 库的项目。在我的 window 中,TextArea 填充了一些内容。
但是,TextArea是静态的,没有滚动条,因此在内容溢出之前,它只显示了部分内容。
如何为我的 TextArea 添加可滚动性and/or 使其动态化?
PS- 我对 Java 中的 Swing 和 GUI 非常陌生。
我在互联网上搜索了一个解决方案并找到了很多,但 none 致力于实施。
我尝试使用 ScrollPane、Scrollbar。我什至将布局管理器设置为 BorderLayout() 和 GridBagLayout,但这只是把 window 搞砸了,并没有解决我的静态 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);
}
}
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 教程部分,了解上述建议如何影响布局。
我正在开发一个使用 Java 中的 Swing 库的项目。在我的 window 中,TextArea 填充了一些内容。
但是,TextArea是静态的,没有滚动条,因此在内容溢出之前,它只显示了部分内容。
如何为我的 TextArea 添加可滚动性and/or 使其动态化?
PS- 我对 Java 中的 Swing 和 GUI 非常陌生。
我在互联网上搜索了一个解决方案并找到了很多,但 none 致力于实施。
我尝试使用 ScrollPane、Scrollbar。我什至将布局管理器设置为 BorderLayout() 和 GridBagLayout,但这只是把 window 搞砸了,并没有解决我的静态 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);
}
}
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 教程部分,了解上述建议如何影响布局。