MouseListener na obiekcie typu graphic

Odpowiedz Nowy wątek
2010-11-21 00:09

Rejestracja: 10 lat temu

Ostatnio: 8 lat temu

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 ??

Pozostało 580 znaków

bo
2010-11-21 10:57
bo
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ć.

Pozostało 580 znaków

2010-11-21 11:15

Rejestracja: 12 lat temu

Ostatnio: 4 lata temu

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


Another jam from the world for the jam from the voices of the world......
edytowany 1x, ostatnio: lipkerson, 2010-11-21 11:17

Pozostało 580 znaków

bo
2010-11-21 11:45
bo
0

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

Pozostało 580 znaków

2010-11-21 11:53

Rejestracja: 12 lat temu

Ostatnio: 4 lata temu

0

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


Another jam from the world for the jam from the voices of the world......

Pozostało 580 znaków

bo
2010-11-21 11:54
bo
0

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

Pozostało 580 znaków

2010-11-21 12:13

Rejestracja: 12 lat temu

Ostatnio: 4 lata temu

0

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


Another jam from the world for the jam from the voices of the world......

Pozostało 580 znaków

bo
2010-11-21 12:16
bo
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);
    }
}

Pozostało 580 znaków

2010-11-21 13:10

Rejestracja: 12 lat temu

Ostatnio: 4 lata temu

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.


Another jam from the world for the jam from the voices of the world......

Pozostało 580 znaków

2010-11-21 14:47

Rejestracja: 10 lat temu

Ostatnio: 8 lat temu

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 :)

Pozostało 580 znaków

Odpowiedz

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