我正在研究Squares游戏的一个版本。为此,我需要检测点击椭圆的时间。但问题是我的方法是使用一个Ellipse对象。如何检测单击哪个椭圆?这是我的代码。
主广场班
public static boolean running = false;
public Squares() {
this.setSize(600, 600);
this.setTitle("Squares");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setContentPane(new SquarePane());
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public static void main(String[] args) {
try {
new Squares();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Crashed");
System.exit(-1);
}
running = true;
}
}
SquaresPanel类
public static int x = 100;
public static int y = 100;
public static Color randomColor;
public static float r;
public static float g;
public static float b;
public void paintComponent(Graphics gra) {
Graphics2D g2d = (Graphics2D) gra;
gra.setColor(Color.black);
gra.fillRect(0, 0, 600, 600);
Random rand = new Random();
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
Ellipse2D oval = new Ellipse2D.Double(x, y, 10, 10);
r = rand.nextFloat();
g = rand.nextFloat();
b = rand.nextFloat();
randomColor = new Color(r, g, b);
g2d.setColor(randomColor);
g2d.fill(oval);
x += 50;
}
x = 100;
y += 50;
}
}
谢谢你们!
威尔
答案 0 :(得分:1)
不要过多地看你的代码(因为我认为它缺乏很多)我只会解释你的需求是如何实现的。
第1名:您需要MouseListener
并实施mousePressed
。从MouseEvent
对象中,您可以获得单击的点。如果您不确定,请参阅How to Write MouseListener。
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
}
第二名:保留List
你的省略号
List<Ellipse2D> ellipses;
第3名:保留一个selectedEllipse
变量来保存选择的一个。
Ellipse2D selectedEllipse;
第4步:点击该点后,循环浏览列表,检查每个Ellipse2D.contains
点是否正确。然后使用选定的椭圆
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
for (Ellipse2D ellipse : ellipses) {
if (ellipse.contains(p) {
selectedEllipse = ellipse;
// do something with selectedEllipse
break;
} else {
selectedEllipse = null;
}
}
}
第5步:循环浏览ellipses
以在paintComponent
方法中绘制
protected void paintComponent(Grapchics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
for (Ellipse2D ellipse : ellipses) {
g2.fill(ellipse):
}
}
附注
您必须在super.paintComponent
方法
paintComponent
protected void paintComponent(Graphics g) {
super.paintComponent(g);
}
<强>更新强>
仔细研究一下你的代码后,我会看到你想要实现的更多内容。看起来你想要8个8格的椭圆。另一种选择是创建64个面板。并涂上每一个。
首先有一个面板类,您可以在其中设置颜色
public class EllipsePanel extends JPanel {
private Color color;
public EllipsePanel(Color color) {
this.color = color;
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillOval(0, 0, getWidth(), getHeight());
}
}
然后,您可以使用面板来保存所有这些面板并使用GridLayout
,同时保留JPanel[][]
,以便您可以轻松引用每个面板。您还可以为每个面板添加一个mouselistener
JPanel gridPanel = new JPanel(new GridLayout(8, 8));
EllipsePanel[][] panels = new EllipsePanel[8][8];
EllipsePanel selectedPanel = null;
int currentRow;
int currentCol;
...
for (int i = 0; i < 8; i++) {
for (int j = 0; i < 8; j++) {
final EllipPanel panel = new EllipsePanel(getRendomColor);
panel.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e) {
selectedPanel = panel;
// do something with selected panel;
}
});
gridPanel.add(panel);
}
}
答案 1 :(得分:0)
您应该在JPanel上实现鼠标侦听器,然后使用从侦听器中检索到的单击位置来确定单击哪个椭圆