Как заставить формы «моргать» или менять цвета в Java? - PullRequest
1 голос
/ 29 августа 2011

Я пытаюсь научиться рисовать фигуру и уметь: а) нарисовать ее, «заморозить» процесс, нарисовать его цветом фона, а затем заново нарисовать его в исходном цвете и б) нарисовать форму и изменить ее цвет. Все, что у меня пока есть (моргает):

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 Ответ

2 голосов
/ 29 августа 2011
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.Это означает, что вы заставляете пользовательский интерфейс зависать / зависать.Это очень плохо.
  • Я создал ScheduledExecutorService для регулярного вызова метода перекраски.
  • Метод рисования меняет цвет lastColor.Большую часть времени вы будете смотреть на какую-то модель, чтобы узнать из ее состояния, какой цвет вам следует использовать.
  • Если проблема в том, что вы не собираетесь менять цвет,но вместо этого это ситуация включения / выключения, вы должны иметь логическое состояние, представляющее состояние, и рисовать окружность, только если она включена.
...