检测何时单击多个Ellipse对象

时间:2014-04-25 08:41:48

标签: java swing graphics jpanel ellipse

我正在研究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;
    }
}

谢谢你们!

威尔

2 个答案:

答案 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上实现鼠标侦听器,然后使用从侦听器中检索到的单击位置来确定单击哪个椭圆