在运行时单击 JButton 时,JTextArea 在一段时间内没有清晰显示
JTextArea is not clearly displaying for some period of time while clicking on JButton at runtime
JTextArea 在特定时间段显示不清晰。
我创建了一个JFrame,在里面添加了一个JButton,当点击JButton时,JFrame会被展开,它会显示一个JTextArea,它会添加2行文本,间隔为2秒。问题是点击 JButton 时,JFrame 立即展开,但 JTextArea 显示不清晰(JTextArea 显示为黑色),如下所示:
2 秒后显示 2 行文本,如下所示:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class ExpandJFrame {
public static JFrame frame;
public static JButton btn;
public static JTextArea textArea;
public static void main(String[] args) {
frame = new JFrame("JFrame Expand");
frame.setSize(400, 200);
btn = new JButton("Expand");
btn.setBounds(10, 10, 80, 25);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
try {
frame.setSize(400, 400);
textArea = new JTextArea();
textArea.setBounds(5, 210, 370, 150);
textArea.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
frame.add(textArea);
Thread.sleep(1000);
textArea.append("FirstLine\n");
Thread.sleep(1000);
textArea.append("SecondLine\n");
} catch (Exception e) {
}
}
});
frame.add(btn);
frame.setLayout(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
预期场景:当点击 JButton 时,一次 JTextArea 应该清楚地显示为空,然后用户应该能够逐行查看输入的 2 行。
有人可以帮忙吗?
after 2 seconds it will be displayed with 2 lines of text
不要使用 Thread.sleep(...)。这可以防止框架重新绘制自身。
相反,您需要:
- 将 ActionListener 中的代码移至单独的线程。这可以通过使用 Swing Worker 来完成,如上面链接的 Swing 教程 o
Concurrency
中所示。
- 使用 Swing 计时器安排文本区域的更新。对于这种方法,您可以将文本添加到 ArrayList。然后你启动定时器。当计时器触发时,您删除位置 0 处的文本并将其显示在文本区域中。当 ArrayList 为空时,您停止计时器。这将使您可以轻松地在文本区域中显示多行文本。
JTextArea 在特定时间段显示不清晰。
我创建了一个JFrame,在里面添加了一个JButton,当点击JButton时,JFrame会被展开,它会显示一个JTextArea,它会添加2行文本,间隔为2秒。问题是点击 JButton 时,JFrame 立即展开,但 JTextArea 显示不清晰(JTextArea 显示为黑色),如下所示:
2 秒后显示 2 行文本,如下所示:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class ExpandJFrame {
public static JFrame frame;
public static JButton btn;
public static JTextArea textArea;
public static void main(String[] args) {
frame = new JFrame("JFrame Expand");
frame.setSize(400, 200);
btn = new JButton("Expand");
btn.setBounds(10, 10, 80, 25);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
try {
frame.setSize(400, 400);
textArea = new JTextArea();
textArea.setBounds(5, 210, 370, 150);
textArea.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
frame.add(textArea);
Thread.sleep(1000);
textArea.append("FirstLine\n");
Thread.sleep(1000);
textArea.append("SecondLine\n");
} catch (Exception e) {
}
}
});
frame.add(btn);
frame.setLayout(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
预期场景:当点击 JButton 时,一次 JTextArea 应该清楚地显示为空,然后用户应该能够逐行查看输入的 2 行。
有人可以帮忙吗?
after 2 seconds it will be displayed with 2 lines of text
不要使用 Thread.sleep(...)。这可以防止框架重新绘制自身。
相反,您需要:
- 将 ActionListener 中的代码移至单独的线程。这可以通过使用 Swing Worker 来完成,如上面链接的 Swing 教程 o
Concurrency
中所示。 - 使用 Swing 计时器安排文本区域的更新。对于这种方法,您可以将文本添加到 ArrayList。然后你启动定时器。当计时器触发时,您删除位置 0 处的文本并将其显示在文本区域中。当 ArrayList 为空时,您停止计时器。这将使您可以轻松地在文本区域中显示多行文本。