我想通过使闪光效果:改变成红色(一个JTextArea的)背景 - >然后等待1秒 - >要回白色。 我这样做:
JTextArea jTextArea = new JTextArea();
jTextArea.setBackGround(Color.RED);
Thread.currentThread().sleep(1000);
jTextArea.setBackGround(Color.WHITE)
但是,这是行不通的,所有我有什么是白色背景,我没有看到红色的。
我是什么问题?
谢谢!
而不是使用Thread.sleep(...)
可以冻结你的GUI,你应该使用javax.swing.Timer中 。 而且对GUI的任何更新必须在美国东部时间来完成,非常多的@MinhCatVO说。 有关主题的更多信息,请参阅并发秋千 。 看看下面的代码,并问什么是抓不到。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ColouringTextArea
{
private JTextArea tarea;
private Timer timer;
private Color[] colours = {
Color.RED,
Color.BLUE,
Color.GREEN.darker(),
Color.DARK_GRAY,
Color.MAGENTA,
Color.YELLOW
};
private int counter = 0;
private ActionListener timerAction = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if (counter < colours.length)
{
tarea.setBackground(colours[counter]);
counter++;
}
else
{
tarea.setBackground(Color.PINK);
counter = 0;
}
}
};
private void displayGUI()
{
JFrame frame = new JFrame("Colouring JTextArea");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
tarea = new JTextArea(10, 10);
contentPane.add(tarea);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
timer = new Timer(1000, timerAction);
timer.start();
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new ColouringTextArea().displayGUI();
}
});
}
}
由于该线程ü要睡1秒不是GUI线程。 我认为Swing.Utilities有一个方法SwingUtilities.invokeLater()。
public void class Flash extends Thread {
JTextArea jtextArea = new JTextArera();
public void run() {
SwingUtilities.invokeLater(new Runnable()) {
jTextArea.setBackground(Color.WHITE);
}
}
}
public void class Main {
public void main() {
...
Flash fl = new Flash();
fl.start();
}
}
这不,因为线程问题的工作。 你需要一个工作线程 。
这应该工作:
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jTextArea.setBackground(Color.RED);
}
});
Thread.sleep(1000);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jTextArea.setBackground(Color.WHITE);
}
});
return null;
}
};
sw.execute();
请注意,在Swing对象的所有方法必须从事件指派线程调用。 要做到这一点,请使用以下模式:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Do gui things
}
});
了解事件调度线程。 有在SO对此这么多的帖子。 只要搜索词。
文章来源: How to use Thread.sleep() and setBackground() to create flash effect in Swing?