我有一个名为theLayers
的ArrayList,它存储点(层)的集合,我希望每一层都具有不同的颜色。在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);
}
}
}
}
我希望每一层的颜色都不同,而不是相同的颜色。谢谢。
答案 0 :(得分:0)
如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);
}
}
}
}
将此link用于mcve。复制并将整个代码粘贴到一个文件(SwingTestFrame.java)中并运行。