MouseListener na obiekcie typu graphic

0

Mam taką łamigłówkę. Rysuje sobie kulki które poruszają się w jakimś oknie. Chciałbym teraz aby kliknięcie na kulkę spowodoało jakąś akcję ale jakoś mi nie wychodzi.

class Ball extends JComponent implements MouseListener {
        Random ran = new Random();
	private static final int XSIZE =35;
	private static final int YSIZE =35;
	private double x =ran.nextInt(450);
	private double y =ran.nextInt(350);
	private double dx =1;
	private double dy =1;
Ball(){
   this.addMouseListener(this);
}

    public void mouseClicked(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) {  }
    public void mouseExited(MouseEvent e)  {  }
    public void mousePressed(MouseEvent e) { log(e); }
    public void mouseReleased(MouseEvent e){  }

    //====================================================================== log
    // Utility method to handle common logging action by all listeners.
        private void log(MouseEvent e) {
           System.out.println("---------");
        }
	
        public void mouseMoved(MouseEvent e) {
            //log(e);
             e.getX();
             e.getY();
             System.out.println("+");
            //this.repaint();  // Show the change.  Indirectly calls paintComponent.
        }
        public void mouseDragged(MouseEvent e) {
            e.getPoint(); // Save the point for drawing.
            //this.repaint();  // Show the change.  Indirectly calls paintComponent.
        }


	public void move(Rectangle2D bounds ){

		x +=dx;
		y +=dy;
		if(x<bounds.getMinX()){
			x=bounds.getMinX();
			dx = -dx;
		}
		if(x + XSIZE >= bounds.getMaxX()){
			x=bounds.getMaxX() - XSIZE;
			dx = -dx;
		}
		if(y < bounds.getMinY()){
			y = bounds.getMinY();
			dy = -dy;
		}
		if(y +YSIZE >= bounds.getMaxY()){
			y = bounds.getMaxY()-YSIZE;
			dy= -dy;
		}
	}
	public Ellipse2D getShape(){
            
		return new Ellipse2D.Double(x,y,XSIZE,YSIZE);
	}



}
 

Wydaje mi się, że "Mysz nie widzi obszaru kulki". Może jakoś te kulki zastąpić obiektami typu button ??

0

Imho, MouseListenera powinieneś dodać do panelu na którym rysujesz. W metodach obsługi pobrać od MouseEvent współrzędne kliknięcia, sprawdzić czy w tym miejscu jest jakaś kulka, jeśli jest to coś z nią zrobić.

0

Nie jest to takie proste - dawno temu się z tym bawiłem. Nie możesz otrzymać pozycji z panelu np ze zdjęciem nad którym jest kursor. Tzn nie wprost stosujac onmove czy OnClick...kiedyś dobra dusza podsunęła mi rozwiązanie (wtedy java to była dla mnie trochę enigma...teraz wiem że to enigma^2 :P )

http://forums.java.net/node/686523

PS: Jak czytam tego swojego posta to mój ENG był chyba lepszy na studiach niż teraz:P

0

@likperson, to jest proste i działa tak jak opisałem.

0

Nie działa - zawsze dostaniesz tylko koordynaty wejściowe!!

0

Jak nie działa, skoro działa. Napisałem przed paroma minutami program sprawdzający.

0

To wklej go proszę....bom sam Ciekaw.

0
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Animacja extends JFrame implements ActionListener,MouseListener
{
    Rysunek obraz=new Rysunek();
    JButton start=new JButton("Start");
    JButton stop=new JButton("Stop");
    //------------------------
    public static void main(String args[])
    {
        new Animacja();
    }
    //------------------------
    public Animacja()
    {
        super("Animacja");
        setSize(210,170);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel=new JPanel();
        panel.setLayout(new BorderLayout());
        panel.addMouseListener(this);
        panel.add(obraz,"Center");

        JPanel dolny=new JPanel();
        start.addActionListener(this);
        dolny.add(start);
        stop.addActionListener(this);
        stop.setEnabled(false);
        dolny.add(stop);
        panel.add(dolny,"South");
        setContentPane(panel);
        setVisible(true);
        setResizable(false);
    }
    //------------------------
    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource()==start)
        {
            obraz.play();
            start.setEnabled(false);
            stop.setEnabled(true);
            return;
        }
        if (e.getSource()==stop)
        {
            obraz.stop();
            start.setEnabled(true);
            stop.setEnabled(false);
            return;
        }
    }
    //------------------------
    public void mouseClicked(MouseEvent me)
    {
        int x=me.getX();
        int y=me.getY();
        System.out.println("x = "+x+", y = "+y);
        if(obraz.inOval(x,y))
        {
            System.out.println("trafiles");
        }
        else
        {
            System.out.println("pudlo");
        }
        return;
    }
    //------------------------
    public void mouseReleased(MouseEvent me)
    {
    }
    //------------------------
    public void mouseEntered(MouseEvent me)
    {
    }
    //------------------------
    public void mouseExited(MouseEvent me)
    {
    }
    //------------------------
    public void mousePressed(MouseEvent me)
    {
    }
}
//------------------------------------------------
class Rysunek extends JPanel implements Runnable
{
    int wspX=0;
    int skok=1;
    Thread thread=null;
    //------------------------
    void play()
    {
        if (thread==null)
        {
            thread=new Thread(this);
            thread.start();
        }
    }
    //------------------------
    void stop()
    {
        if (thread!=null)
        {
            thread=null;
        }
    }
    //------------------------
    public void run()
    {
        Thread ten=Thread.currentThread();
        while (thread==ten)
        {
            wspX+=skok;
            if (wspX>=210)
            {
                wspX=-40;
            }
            try
            {
                Thread.sleep(10);
            }
            catch(InterruptedException e)
            {
            }
            repaint();
        }
    }
    //------------------------
    public void paintComponent(Graphics gr)
    {
        Graphics2D g=(Graphics2D) gr;
        g.setColor(Color.white);
        g.fillRect(0,0,210,100);
        g.setColor(new Color(0,204,255));
        g.fillOval(wspX,30,40,40);
    }
    //------------------------
    public boolean inOval(int x,int y)
    {
        return (Math.pow(wspX+20-x,2)+Math.pow(50-y,2)<=20*20);
    }
}
0

Ok...w sumie nie doczytałem co autor ma na myśli. Podświadomie ja myślałem o kulkach nie rysowanych tylko wstawianych jako zdjęcie...

Twój program pięknie działa.

0

Myślałem, że istnieje jakaś sprytniejsza metoda ale wielkie dzięki za pomoc.
Co prawda ten programik u mnie nie działa(tak jakby się zawiesza i nie można nawet wcisnąć close) ale może przez to, że mam słabego kompa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1