Как реализовать изменение цвета для объекта Graphic2D в Java? - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь понять, возможно ли изменить цвет существующей графики во время работы моего приложения (что-то вроде мерцания между несколькими разными цветами).

У меня есть начальная фигура, нарисованная с использованием класса GeneralPath, и у меня также работает мой случайный селектор цветового кода RGB. Можно ли изменить цвет, используя repaint();, чтобы изменить цвет моей звезды между 3 выбранными цветами, которые были выбраны случайным образом из моего метода createRandomColor()?

Код

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import static java.lang.Math.random;
import java.util.Vector;
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Sandbox extends JApplet {
    DrawingStar canvas;

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        Sandbox path = new Sandbox();
        path.init();
        frame.getContentPane().add(path);
        frame.setSize(250, 250);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void init() {
        Container container = getContentPane();
        canvas = new DrawingStar();
        container.add(canvas);
    }

}

class DrawingStar extends Canvas {
    Vector generalPaths;
    private List<Color> colors;

    public DrawingStar() {
        colors = new ArrayList<Color>();

        for (int i = 0; i < 3; i++) {
            colors.add(createRandomColor());
        }

        setBackground(Color.white);
        setSize(400, 400);
        generalPaths = new Vector();

        GeneralPath gp1;

        gp1 = new GeneralPath();
        gp1.moveTo(50, 120);
        gp1.lineTo(70, 180);
        gp1.lineTo(20, 140);
        gp1.lineTo(80, 140);
        gp1.lineTo(30, 180);
        gp1.closePath();
        generalPaths.addElement(gp1);
    }

    public void paint(Graphics g) {
        Graphics2D g2D = (Graphics2D) g;
        g2D.translate(70.0f, -85.0f);
        g2D.draw((GeneralPath) generalPaths.elementAt(0));

        for (int i = 0; i < 3; i++) {
            Color color = colors.get(i);
            g2D.setColor(color);
            g2D.fill((GeneralPath) generalPaths.elementAt(0));
        }

        System.out.println("Is this working");
        repaint();
    }


    private Color createRandomColor(){
        int r = (int) (Math.random() * 256);
        int g = (int) (Math.random() * 256);
        int b = (int) (Math.random() * 256);
        Color color = new Color(r,g,b);

        return color;
    }

}

1 Ответ

0 голосов
/ 04 ноября 2018

Апплеты мертвы, да здравствует HTML5

Время двигаться дальше ... кроме того, жизненные циклы апплета намного сложнее, чем вы реализовали.

«Альтернатива»

Canvas - это компонент низкого уровня, который, вероятно, не очень подходит для ваших нужд. Он также не имеет двойной буферизации, поэтому вы получите мерцание, когда он будет перекрашен.

Не вызывайте repaint из любого метода рисования, вам не понравятся результаты. Вместо этого запланируйте обновление в будущем.

В этом примере просто используется Swing Timer в качестве псевдо-цикла, который увеличивает счетчик и получает следующий цвет и перерисовывает вызов каждую секунду.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.GeneralPath;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Sandbox {

    DrawingStar canvas;

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

    public Sandbox() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                canvas = new DrawingStar();
                frame.getContentPane().add(canvas);
                frame.setSize(250, 250);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }

    class DrawingStar extends JPanel {

        Vector generalPaths;
        private List<Color> colors;
        private int colorIndex = 0;
        private Color color;

        public DrawingStar() {

            colors = new ArrayList<Color>();

            for (int i = 0; i < 3; i++) {
                colors.add(createRandomColor());
            }

            color = colors.get(0);

            setBackground(Color.white);
            generalPaths = new Vector();

            GeneralPath gp1;

            gp1 = new GeneralPath();
            gp1.moveTo(50, 120);
            gp1.lineTo(70, 180);
            gp1.lineTo(20, 140);
            gp1.lineTo(80, 140);
            gp1.lineTo(30, 180);
            gp1.closePath();
            generalPaths.addElement(gp1);

            Timer timer = new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    colorIndex++;
                    if (colorIndex >= colors.size()) {
                        colorIndex = 0;
                    }

                    color = colors.get(colorIndex);
                    repaint();
                }
            });
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
            Graphics2D g2D = (Graphics2D) g;
            g2D.translate(70.0f, -85.0f);
            g2D.draw((GeneralPath) generalPaths.elementAt(0));

            g2D.setColor(color);
            g2D.fill((GeneralPath) generalPaths.elementAt(0));
        }

        private Color createRandomColor() {
            int r = (int) (Math.random() * 256);
            int g = (int) (Math.random() * 256);
            int b = (int) (Math.random() * 256);
            Color color = new Color(r, g, b);

            return color;
        }

    }
}

Swing НЕ является потокобезопасным и является однопоточным, поэтому причина использования Swing Timer

...