web-dev-qa-db-ja.com

MouseListenerをGraphicオブジェクトに追加する方法はありますか?

MouseListenerをGraphicオブジェクトに追加する方法はありますか?.
楕円形を描くこのシンプルなGUIがあります。
ユーザーが楕円形をクリックしたときにイベントを処理する必要があります

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

 }

}

これは、クリックが楕円の周りの仮想ボックス内にあるときに発生することを除いて機能します。
クリックが正確に楕円形になっているときに、誰かがそれを発射するのを手伝ってくれませんか。
前もって感謝します。

17
Abu Muhammad

これを行うために私が考えることができる最も簡単な方法は、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());
   }
 }
20

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

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

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

4
camickr

いいえ、コンポーネントではないため、グラフィックスにマウスリスナーを直接追加することはできません。マウスリスナーは、SwingがPaint(Graphics)とその仲間を呼び出すときに渡される適切なGraphicsオブジェクトを受け取るComponent(またはJComponent)に追加する必要があります。

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

さらに、楕円形のような幾何学的図形にリスナーを置くことはできません。マウスのクリック座標を取得し、クリックが図の内側にあるかどうかを判断する必要があります。

0