2011-01-08 5 views
16

GraphicオブジェクトにMouseListenerを追加する方法はありますか。
私はこの楕円形のGUIを持っています。クリックは、楕円形の周りの仮想ボックス内にあるとき、ユーザはこれがそれ以外は動作楕円GraphicオブジェクトにMouseListenerを追加する方法はありますか?

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 

} 

} 

をクリックした私は、イベントを処理している必要
が起動します。
クリックが正確に楕円形になっていると誰もがそれを発射するのを助けることができますか?
ありがとうございます。

答えて

19

私が考えることができる最も簡単な方法は、fillOvalを避け、java.awt.geomパッケージでジオメトリを使用することです。したがって、描画している楕円形が静的に大きさがあるように見えるので、楕円を宣言することができます。

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

     .... 

} 

次に、paintComponentでこれを描画するためにfill(Shape)メソッドを使用します。

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

    } 

クリックは、このような楕円形であるか、ない場合は、マウスイベントにあなたが検出することができます:すべてのコードは、カスタム・コンポーネント・クラスに含まれるべき

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:うわー、私はそれがこのような単純なやり方でできていることは知らなかった!やあ、何時間失ったの? – Rekin

+0

@Rekinこれは、geomパッケージの目的です。 2Dグラフィックス上のすべての幾何学操作をカプセル化する。 –

+0

これは私が欲しいものです。ありがとう、ヴィンセント –

4

が。あなたは楕円をペイントするためのカスタムコードを持っています。これで、クリック検出用のカスタムコードが必要になります。これを行うには、contains(...)メソッドをオーバーライドします。 Vincentsの提案に基づいて、次のようなものを追加します:

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

このようにして、MouseListenerにカスタムコードは必要ありません。

0

いいえ、コンポーネントではないため、マウスリスナーをGraphicsに直接追加することはできません。スイングがpaint(Graphics)とフレンドを呼び出すときに、適切なGraphicsオブジェクトを受け取るマウスリスナーをComponent(またはJComponent)に追加する必要があります。

マウス操作に何か変更があった場合は、コンポーネントの状態(フィールド)を変更してからrepaintを呼び出す必要があります。ペイントグループメソッドは、適切な時間に後で呼び出されます。

さらに、楕円のような幾何学的図形にリスナーを置くことはできません。マウスのクリック座標を取得し、クリックがあなたの体の中にあれば、別の方法を決定する必要があります。

関連する問題