Как изменить цвет линий в каждой итерации цикла for в Java - PullRequest
0 голосов
/ 26 марта 2019

У меня есть ArrayList с именем theLayers, в котором хранятся наборы точек (слоев), и я бы хотел, чтобы каждый слой имел отдельный цвет.На каждой итерации цикла for я устанавливаю новый цвет графики и рисую точки каждого отдельного слоя.Однако после отладки я заметил, что для точек задан последний сгенерированный цвет.

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

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.JPanel;

public class Drawer extends JPanel {
private ArrayList<ArrayList<Point>> theLayers;

public Drawer() {
    this(new ArrayList<ArrayList<Point>>());
}

public Drawer(ArrayList<ArrayList<Point>> coordinates) {
    this.theLayers = new ArrayList<ArrayList<Point>>(coordinates);
}

public void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

g2d.setStroke(new BasicStroke(3));
for(ArrayList<Point> coordinates:theLayers) {
    int R = (int) (Math.random( )*256);
    int G = (int)(Math.random( )*256);
    int B= (int)(Math.random( )*256);
    Color randomColor = new Color(R, G, B);
    g2d.setColor(randomColor);
    for (int i = 0; i < coordinates.size(); i++) {
        g2d.drawLine(coordinates.get(i).x, coordinates.get(i).y,
                coordinates.get(i).x, coordinates.get(i).y);
    }
}
}
}

Я хочу, чтобы цвет каждого слоя был разным, а не один и тот же цвет.Спасибо.

1 Ответ

0 голосов
/ 26 марта 2019

Как объяснено camickr имеет пользовательский точечный объект с атрибутом цвета:

class ColoredPoint extends Point{

    private final Color color;

    ColoredPoint(int x, int y,Color color) {
        super(x, y);
        this.color = color;
    }

    Color getColor() {
        return color;
    }
}

И используйте его в Drawer классе:

class Drawer extends JPanel {

    private final ArrayList<ArrayList<ColoredPoint>> theLayers;
    private static final int W = 700, H =700;
    public Drawer() {
        this(new ArrayList<ArrayList<ColoredPoint>>());
    }

    public Drawer(ArrayList<ArrayList<ColoredPoint>> coordinates) {
        theLayers = new ArrayList<>(coordinates);
        setPreferredSize(new Dimension(W,H));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setStroke(new BasicStroke(3));

        for(ArrayList<ColoredPoint> cPoints:theLayers) {
            g2d.setColor(cPoints.get(0).getColor());
            for (int i = 0; i < cPoints.size(); i++) {
                g2d.drawLine(cPoints.get(i).x, cPoints.get(i).y,
                        cPoints.get(i).x, cPoints.get(i).y);
            }
        }
    }
}

Используйте эту ссылку для mcve.Скопируйте, вставьте весь код в один файл (SwingTestFrame.java) и запустите.

...