如何在Java中使形状“闪烁”或改变颜色?

时间:2011-08-29 04:31:11

标签: java graphics colors drawing

我正在尝试学习如何绘制形状,并能够a)绘制它,“冻结”过程,用背景颜色绘制它,然后以原始颜色重新绘制它b)画出一个形状并改变它的颜色。到目前为止我所有的(闪烁):

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Carlight extends JPanel{
    Thread th=new Thread();
    public void paintComponent (Graphics g){
        super.paintComponents(g);
        g.setColor(Color.yellow);
        g.fillOval(25, 25, 10, 10);
        try{
            th.sleep(10);
        }catch(InterruptedException e){}
        repaint();
        g.setColor(Color.yellow);
        g.fillOval(25, 25, 10, 10);
        try{
            th.sleep(10);
        }catch(InterruptedException e){}
        repaint();
        g.setColor(Color.yellow);
        g.fillOval(25, 25, 10, 10);
    }
    public Carlight(){
        JFrame frame=new JFrame();
        frame.setTitle("Carlights");
        frame.add(this);
        frame.setBackground(Color.black);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(100,150);
        frame.setVisible(true);
    }
    public static void main(String[] args){
        new Carlight();
    }
}

如何使此代码有效以及如何获得改变颜色的形状?

1 个答案:

答案 0 :(得分:2)

import java.awt.Color;
import java.awt.Graphics;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class carlight extends JPanel
{
    private Color lastColor = Color.YELLOW;
    // For telling the panel to be repainted at regular intervals
    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponents(g);
        if(lastColor.equals(Color.YELLOW))
        {
            lastColor = Color.GREEN;
        }
        else
        {
            lastColor = Color.YELLOW;
        }
        g.setColor(lastColor);
        g.fillOval(25, 25, 10, 10);
    }

    public carlight()
    {
        JFrame frame = new JFrame();
        frame.setTitle("Carlights");
        frame.add(this);
        frame.setBackground(Color.black);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(100, 150);
        frame.setVisible(true);
        service.scheduleAtFixedRate(new Runnable()
        {
            public void run()
            {
                repaint();
            }
        }, 0, 1, TimeUnit.SECONDS);
    }

    public static void main(String[] args)
    {
        new carlight();
    }
}

好的,

  • 不要在paintComponent调用期间调用sleep调用。这意味着你 强制UI挂起/停止。这非常糟糕。
  • 我已经创建了一个ScheduledExecutorService来定期调用重绘方法。
  • paint方法会更改lastColor的颜色。大多数时候你会看某种模型来找出它的状态,以选择你应该使用的颜色。
  • 如果问题在于你不是要改变颜色,而是一个关闭/打开的情况,你应该有一个布尔表示状态,只有在它打开的情况下绘制圆圈。