“如何制作形状”;眨眼;还是在Java中更改颜色?

“如何制作形状”;眨眼;还是在Java中更改颜色?,java,graphics,colors,drawing,Java,Graphics,Colors,Drawing,我试图学习如何绘制形状,并且能够a)绘制它,“冻结”过程,以背景颜色绘制,然后以原始颜色重新绘制,b)绘制形状并更改其颜色。到目前为止,我所能做的就是(眨眼): 我如何使这个代码工作,我如何得到一个形状来改变颜色 import java.awt.Color; import java.awt.Graphics; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; i

我试图学习如何绘制形状,并且能够a)绘制它,“冻结”过程,以背景颜色绘制,然后以原始颜色重新绘制,b)绘制形状并更改其颜色。到目前为止,我所能做的就是(眨眼):

我如何使这个代码工作,我如何得到一个形状来改变颜色

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();
    }
}

  • 在调用组件时不要进行睡眠调用。这意味着你是 强制UI挂起/暂停。这很糟糕
  • 我创建了一个ScheduledExecutorService,用于定期调用repaint方法
  • 绘制方法更改lastColor的颜色。大多数情况下,你会看一些模型,找出它的状态,选择你应该使用的颜色
  • 如果问题是您不打算更改颜色,而是处于关闭/打开状态,那么您应该有一个表示状态的布尔值,并且只有当它处于打开状态时才绘制圆

如果这回答了您所有的问题,您可能应该接受它作为一个答案。这就是javax.swing.Timer存在的原因,顺便说一句(如果我忘记了方法的正确Java命名是无效名称和执行器)+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();
    }
}