2011-01-08 8 views
16

Czy istnieje sposób na dodanie MouseListener do obiektu graficznego.
Mam prosty GUI, który rysuje owal.
Co chcę operująca zdarzenie, kiedy użytkownik kliknie na owaluCzy istnieje sposób na dodanie MouseListener do obiektu Graphic?

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.*; 

public class Gui2 extends JFrame { 
JFrame frame = new JFrame(); 
MyDrawPanel drawpanel = new MyDrawPanel(); 

public static void main(String[] args) { 
    Gui2 gui = new Gui2(); 
    gui.go(); 
} 

public void go() { 

    frame.getContentPane().add(drawpanel); 
    // frame.addMouseListener(this); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(300, 300); 
    frame.setVisible(true); 

} 

} 

class MyDrawPanel extends JComponent implements MouseListener { 

public void paintComponent(Graphics g) { 

    int red = (int) (Math.random() * 255); 
    int green = (int) (Math.random() * 255); 
    int blue = (int) (Math.random() * 255); 
    Color startrandomColor = new Color(red, green, blue); 

    red = (int) (Math.random() * 255); 
    green = (int) (Math.random() * 255); 
    blue = (int) (Math.random() * 255); 
    Color endrandomColor = new Color(red, green, blue); 

    Graphics2D g2d = (Graphics2D) g; 
    this.addMouseListener(this); 
    GradientPaint gradient = new GradientPaint(70, 70, startrandomColor, 
    150, 150, endrandomColor); 

    g2d.setPaint(gradient); 
    g2d.fillOval(70, 70, 100, 100); 

} 

@Override 
public void mouseClicked(MouseEvent e) { 
    if ((e.getButton() == 1) 
    && (e.getX() >= 70 && e.getX() <= 170 && e.getY() >= 70 && e 
     .getY() <= 170)) { 
    this.repaint(); 
    // JOptionPane.showMessageDialog(null,e.getX()+ "\n" + e.getY()); 
    } 

} 

@Override 
public void mouseEntered(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseExited(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mousePressed(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseReleased(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

} 

Działa to oprócz tego, że pożary, gdy kliknięcie w oknie wirtualnym wokół owalu.
Czy ktoś może mi pomóc, aby go uruchomić, gdy kliknięcie jest DOKŁADNIE na owalu.
Z góry dziękuję.

Odpowiedz

19

Najprostszym sposobem na zrobienie tego jest uniknięcie fillOval i użycie geometrii w pakiecie java.awt.geom. Możesz więc zadeklarować elipsę, ponieważ wydaje się, że owal, który rysujesz, ma rozmiar statyczny.

class MyDrawPanel extends JComponent implements MouseListener { 
     Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100); 

     .... 

} 

Następnie w paintComponent należy użyć metody wypełnienia (kształtu), aby narysować to.

public void paintComponent(Graphics g) { 
     .... 
     Graphics2D g2d = (Graphics2D) g; 
     .... 
     g2d.fill(oval); 

    } 

Następnie w przypadku myszy można wykryć, czy kliknięcie w owalu lub nie podoba:

public void mouseClicked(MouseEvent e) { 
    if ((e.getButton() == 1) && oval.contains(e.getX(), e.getY())) { 
     repaint(); 
    // JOptionPane.showMessageDialog(null,e.getX()+ "\n" + e.getY()); 
    } 
} 
+0

+1: Wow, nigdy nie wiedziałem, że można to zrobić w tak prosty sposób! Cholera, ile godzin straciłem. – Rekin

+0

@Rekin To jest celem pakietu Geom. Aby zamknąć wszystkie geometryczne operacje na twojej grafice 2D. –

+0

Dokładnie tego chcę. Dziękuję Vincent –

4

Cały kod powinien być zawarty w klasie niestandardowych komponentów. Masz niestandardowy kod do namalowania owalu. Teraz potrzebujesz niestandardowego kodu do wykrywania kliknięć. Robisz to przez przesłonięcie metody contains (...). Na podstawie Vincents sugestią byłoby dodać coś takiego:

public boolean contains(int x, int y) 
{ 
    return oval.contains(x, y); 
} 

ten sposób nie potrzeba żadnego kodu niestandardowego w MouseListener.

0

Nie, nie można dodać odbiornika myszy do grafiki bezpośrednio, ponieważ nie jest to komponent. Słuchacz myszy powinien zostać dodany do Twojego Component (lub JComponent), który odbiera odpowiedni obiekt Grafiki przekazany, gdy Swing wywoła paint(Graphics) i znajomych.

Jeśli coś zmienia się w stosunku do akcji myszy, należy zmodyfikować stan (pola) komponentu, a następnie wywołać repaint. Metody grup farb zostaną później wywołane w odpowiednim czasie.

Jeszcze więcej nie można umieścić słuchacza na figurze geometrycznej jak owal. Musisz uzyskać współrzędne myszy i spróbować określić, czy kliknięcie znajduje się wewnątrz twojej postaci.

Powiązane problemy