【发布时间】:2018-11-07 06:14:35
【问题描述】:
我正在设计一款非常类似于 Flow free 的游戏。我在代码中遇到了一个问题,我希望能够单击网格中的一个圆圈,能够测量其颜色,然后检查颜色是否为白色。如果颜色是白色,我会打印错误,现在是一个占位符。但是,即使我单击非白色瓷砖,我仍然会看到正在打印的错误消息。我做错了什么?
我的代码:
import javax.swing.JFrame; //JFrame Class
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Shape;
import java.util.ArrayList;
import javax.swing.JPanel;
import java.awt.geom.Ellipse2D;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class DriverV2 extends JPanel {
static ArrayList<Shape> circles;
static ArrayList<Color> colors;
public DriverV2() {
circles = new ArrayList<Shape>();
colors = new ArrayList<Color>();
colors.add( Color.CYAN);//1
colors.add( Color.BLUE);//2
colors.add( Color.WHITE);//3
colors.add( Color.WHITE);//4
colors.add( Color.GREEN);//5
colors.add( Color.WHITE);//6
colors.add( Color.CYAN);//7
colors.add( Color.WHITE);//8
colors.add( Color.WHITE);//9
colors.add( Color.RED);//10
colors.add( Color.WHITE);//11
colors.add( Color.YELLOW);//12
colors.add( Color.WHITE);//13
colors.add( Color.GREEN);//14
colors.add( Color.WHITE);//15
colors.add( Color.WHITE);//16
colors.add( Color.BLUE);//17
colors.add( Color.WHITE);//18
colors.add( Color.RED);//19
colors.add( Color.WHITE);//20
colors.add( Color.WHITE);//21
colors.add( Color.WHITE);//22
colors.add( Color.WHITE);//23
colors.add( Color.WHITE);//24
colors.add( Color.YELLOW);//25
int rows = 5;
for (int y=0;y< rows;y++)
{
for (int x=0;x<rows;x++)
{
circles.add( new Ellipse2D.Double((x + 1) * 150, (y + 1) *150, 100, 100) );
}
}
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
Color foreground = g2d.getColor();
int h = 0;
for (Shape shape : circles)
{
g2d.setColor( colors.get(h));
g2d.draw( shape );
g2d.fill(shape);
h++;
}
}
public static boolean checkLinearity(int index1, int index2){
if((index1%5) == (index2 %5)) { //vertical line check
return true;
}
if(Math.abs(index1-index2) < 5) { //horizantal line check
return true;
}
else {
return false;
}
}
static int counter = 0;
static int index1 = 0;
static int index2 = 0;
public static void main(String[] args)
{
JFrame f = new JFrame("Flow"); //new JFrame
DriverV2 t = new DriverV2();
f.setSize(900,900);//sets size of frame
// f.setLocation(100,50);//sets location of frame
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//sets default close operation
// f.setContentPane(new Panel()); //sets content pane
f.setVisible(true);//makes panel visible
f.add(t);
f.addMouseListener( new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
for (Shape shape: circles) {
if (shape.contains(x,y)) {
counter++;
if(counter % 2 == 1) {
index1 = circles.indexOf(shape)+1;
if(Color.WHITE.equals(colors.get(index1))) {
counter--;
System.out.println("error");
}
}
else{
index2 = circles.indexOf(shape) +1;
if(checkLinearity(index1, index2) == true) {
//I want to be able to draw a rectange here
}
}
}
}
}
});
}
}
【问题讨论】:
-
我们可以看看你的
class Shape吗? -
请注意,索引是从 0 开始的,因此
colors.get(index1)可能是由于index1 = circles.indexOf(shape)+1;而导致的。顺便说一句,既然您正在迭代circles,那么就不需要circles.indexOf(shape)- 只需计算循环迭代次数(再次从0开始)。更好的是,创建一个包含形状和颜色的类Circle。这样,形状和颜色的索引就不会因为编程错误而失去同步。 -
@Thomas 我知道情况并非如此,因为我尝试单击网格中的所有内容并且每次打印错误消息时
-
@mackycheese21 Shape 是一个内置的 java 接口,只需 google 其文档
-
@mackycheese21:他没有“类”形状。他引用了核心 Java Shape 接口。请检查导入。
标签: java swing colors panel paint