【问题标题】:How to make shapes "blink" or change colors in Java?如何在 Java 中使形状“闪烁”或改变颜色?
【发布时间】:2011-11-05 18:22:50
【问题描述】:

我正在尝试学习如何绘制一个形状,并且能够 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();
    }
}

如何使这段代码工作,如何让形状改变颜色?

【问题讨论】:

    标签: java graphics colors drawing


    【解决方案1】:
    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 调用期间进行睡眠调用。这意味着你是 强制 UI 挂起/停止。这很糟糕。
    • 我创建了一个 ScheduledExecutorService 用于定期调用 repaint 方法。
    • paint 方法更改 lastColor 的颜色。大多数时候,您会查看某种模型以找出它的状态来选择您应该使用哪种颜色。
    • 如果问题不是您要更改颜色,而是关闭/打开的情况,您应该有一个表示状态的布尔值,并且只有在打开时才绘制圆圈。

    【讨论】:

    • 如果这回答了你所有的问题,你可能应该接受它作为答案。
    • 这就是为什么 javax.swing.Timer 存在那里的原因,顺便说一句(如果我忘记了正确的 Java 命名方法和 void 名称和 Executor)+1
    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多