gpt4 book ai didi

java - 检测何时单击多个 Ellipse 对象

转载 作者:行者123 更新时间:2023-12-01 13:05:40 25 4
gpt4 key购买 nike

我正在开发 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;
}
}

谢谢大家!

最佳答案

无需过多查看您的代码(因为我发现它缺少很多),我只会解释如何实现您的要求。

第一:您需要一个 MouseListener 并实现 mousePressed。从MouseEvent对象中,您可以获得点击的点。请参阅How to Write MouseListener如果您不确定。

public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
}

第二:保留省略号的列表

List<Ellipse2D> ellipses;

第三:保留一个 selectedEllipse 变量来保存所选的一个。

Ellipse2D selectedEllipse;

第四:单击该点后,您将循环遍历列表,检查每个Ellipse2D.是否包含该点。然后对选定的椭圆执行一些操作

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;
}
}
}

第五:循环遍历省略号以在paintComponent方法中绘制

protected void paintComponent(Grapchics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
for (Ellipse2D ellipse : ellipses) {
g2.fill(ellipse):
}
}
<小时/>

旁注

  • 必须paintComponent方法中调用super.paintComponent

    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    }
<小时/>

更新

仔细查看您的代码后,我更多地了解了您想要实现的目标。看起来你想要 8 x 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[][],以便您可以轻松引用每个面板。您还可以向每个面板添加一个鼠标监听器

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);
}
}

关于java - 检测何时单击多个 Ellipse 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23288235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com