如何使用Thread.sleep()方法和的setBackground()创建Swing中的闪光效果

2019-10-17 03:52发布

我想通过使闪光效果:改变成红色(一个JTextArea的)背景 - >然后等待1秒 - >要回白色。 我这样做:

JTextArea jTextArea = new JTextArea();
jTextArea.setBackGround(Color.RED);
Thread.currentThread().sleep(1000);
jTextArea.setBackGround(Color.WHITE)

但是,这是行不通的,所有我有什么是白色背景,我没有看到红色的。

我是什么问题?

谢谢!

Answer 1:

而不是使用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();
            }
        });
    }
}


Answer 2:

由于该线程ü要睡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();
   }
}


Answer 3:

这不,因为线程问题的工作。 你需要一个工作线程 。

这应该工作:

            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?