无法在滚动窗格上滚动 - Java Swing
Unable to scroll on scrollpane - Java Swing
我有一个 Swing 应用程序,它在将字符串传递给 GUI 后立即使用字符串更新 Textarea 的内容。
我在 textarea 中实时更新了字符串,但我现在面临的问题是我无法在进程仍在进行时滚动 textarea 运行。
任何人都知道这里发生了什么或有解决方案
尝试 1 -
public static void appendToJTextArea(String message){
String currentText = GUI.textLogArea.getText();
String newString = message;
String newTextToAppend = currentText + "\n" + newString;
GUI.textLogArea.setText(newTextToAppend);
GUI.frame.update(GUI.frame.getGraphics());
}
尝试 2 -
public static void appendToJTextArea(String message){
Runnable runnable = new LogThread(message);
Thread thread = new Thread(runnable);
thread.start();
/**
String currentText = GUI.textLogArea.getText();
String newString = message;
String newTextToAppend = currentText + "\n" + newString;
GUI.textLogArea.setText(newTextToAppend);
GUI.frame.update(GUI.frame.getGraphics());
**/
}
}
class LogThread implements Runnable {
private String test;
public LogThread(String message){
test = message;
}
public void run() {
update(test);
}
private void update(String message) {
System.out.println("BBB"+GUI.textLogArea.getText());
System.out.println("AAA"+message);
String currentText = GUI.textLogArea.getText();
String newString = message;
String newTextToAppend = currentText + "\n" + newString;
GUI.textLogArea.append(newTextToAppend);
}
带有滚动面板的 GUI class
JPanel panel_1 = new JPanel();
panel_1.setBounds(361, 40, 390, 305);
contentPane.add(panel_1);
panel_1.setLayout(null);
JLabel lblScraperLogs = new JLabel("Scraper Logs");
lblScraperLogs.setBounds(0, 0, 390, 31);
lblScraperLogs.setFont(new Font("Cooper Black", Font.PLAIN, 13));
lblScraperLogs.setHorizontalAlignment(SwingConstants.CENTER);
panel_1.add(lblScraperLogs);
textLogArea = new JTextArea();
textLogArea.setEditable(false);
textLogArea.setBounds(10, 23, 380, 282);
JScrollPane scroll = new JScrollPane(textLogArea);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setBounds(10, 23, 380, 282);
panel_1.add(scroll);
but the problem im now facing is I am unable to scroll the the textarea while the process is still running
听起来您的长 运行ning 进程正在 Event Dispatch Thread (EDT)
上执行。此线程负责绘制 GUI,因此 GUI 在进程完成执行之前无法自行重新绘制。不要 运行 你的代码在 EDT 上。
而不是需要为长 运行ning 进程创建一个单独的 Thread
。也许使用 SwingWorker
创建一个单独的线程并允许您 "publish" 数据可用。阅读有关 Concurrency 的 Swing 教程部分,了解有关 EDT 和 SwingWorker 的更多信息。
我有一个 Swing 应用程序,它在将字符串传递给 GUI 后立即使用字符串更新 Textarea 的内容。
我在 textarea 中实时更新了字符串,但我现在面临的问题是我无法在进程仍在进行时滚动 textarea 运行。
任何人都知道这里发生了什么或有解决方案
尝试 1 -
public static void appendToJTextArea(String message){
String currentText = GUI.textLogArea.getText();
String newString = message;
String newTextToAppend = currentText + "\n" + newString;
GUI.textLogArea.setText(newTextToAppend);
GUI.frame.update(GUI.frame.getGraphics());
}
尝试 2 -
public static void appendToJTextArea(String message){
Runnable runnable = new LogThread(message);
Thread thread = new Thread(runnable);
thread.start();
/**
String currentText = GUI.textLogArea.getText();
String newString = message;
String newTextToAppend = currentText + "\n" + newString;
GUI.textLogArea.setText(newTextToAppend);
GUI.frame.update(GUI.frame.getGraphics());
**/
}
}
class LogThread implements Runnable {
private String test;
public LogThread(String message){
test = message;
}
public void run() {
update(test);
}
private void update(String message) {
System.out.println("BBB"+GUI.textLogArea.getText());
System.out.println("AAA"+message);
String currentText = GUI.textLogArea.getText();
String newString = message;
String newTextToAppend = currentText + "\n" + newString;
GUI.textLogArea.append(newTextToAppend);
}
带有滚动面板的 GUI class
JPanel panel_1 = new JPanel();
panel_1.setBounds(361, 40, 390, 305);
contentPane.add(panel_1);
panel_1.setLayout(null);
JLabel lblScraperLogs = new JLabel("Scraper Logs");
lblScraperLogs.setBounds(0, 0, 390, 31);
lblScraperLogs.setFont(new Font("Cooper Black", Font.PLAIN, 13));
lblScraperLogs.setHorizontalAlignment(SwingConstants.CENTER);
panel_1.add(lblScraperLogs);
textLogArea = new JTextArea();
textLogArea.setEditable(false);
textLogArea.setBounds(10, 23, 380, 282);
JScrollPane scroll = new JScrollPane(textLogArea);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setBounds(10, 23, 380, 282);
panel_1.add(scroll);
but the problem im now facing is I am unable to scroll the the textarea while the process is still running
听起来您的长 运行ning 进程正在 Event Dispatch Thread (EDT)
上执行。此线程负责绘制 GUI,因此 GUI 在进程完成执行之前无法自行重新绘制。不要 运行 你的代码在 EDT 上。
而不是需要为长 运行ning 进程创建一个单独的 Thread
。也许使用 SwingWorker
创建一个单独的线程并允许您 "publish" 数据可用。阅读有关 Concurrency 的 Swing 教程部分,了解有关 EDT 和 SwingWorker 的更多信息。