2

私はJavaを学ぶのが初めてで、数日間、描画されたオブジェクトをクリックして、g.drawRect(x、x、x、x)などのオブジェクト内にマウスを含める方法を探しました...

以下のコードに出くわしました。オブジェクト内にマウスを含めるために必要なものを学習できるように動作させようとしていますが、動作させることができないようです。

「 MouseListener を Graphic オブジェクトに追加する方法はありますか?」からコードを取得しました。

私は彼らが与えたヒントに従ってそれを機能させようとしましたが、希望はありません:(。

どんな助けでも大歓迎です。

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

import javax.swing.*;

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

  public static void main(String[] args) {
    Gui3 gui = new Gui3();
    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 {

  Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100);

  public void paintComponent(Graphics g) {

    Graphics2D g2d = (Graphics2D) g;

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

  }

  @
  Override
  public void mouseClicked(MouseEvent e) {
    if ((e.getButton() == 1) && oval.contains(e.getX(), e.getY())) {
      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) {

  }

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

  }

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

4

2 に答える 2

0

基本的に、 を に登録する必要がありますMouseListenerDrawPanelこれを行うのは、マウス イベントを のコンテキスト内にする必要があるためです。DrawPanelそうしないと、MouseEvent位置情報が正しくなくなります。

class MyDrawPanel extends JComponent implements MouseListener {

    Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100);

    public MyDrawPanel() {
        addMouseListener(this);
    }

super.paintComponentまた、カスタムペイントを行う前に電話することをお勧めします

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;

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

}

また、イベント ディスパッチ スレッドのコンテキスト内から UI を作成/変更していることを確認する必要があります。詳細については、初期スレッドを参照してください

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                ex.printStackTrace();
            }

            Gui3 gui = new Gui3();
            gui.go();
        }
    });
}
于 2014-12-30T01:38:08.300 に答える
0

コメント行はあなたの問題を示唆しています - 実際に MouseListener を GUI に追加することはないので、マウスイベントは誰にも通知されません。パネルをマウス リスナーにしたようです (これで問題ありません)。それをMyDrawPanelクラスのコンストラクターに登録します。このコンストラクターを MyDrawPanel に追加すると、準備完了です。

public MyDrawPanel(){
    addMouseListener(this);
}

ovalまた、グラフィックスのメソッドを使用する代わりに、実際の変数を描画することをお勧めします。drawOval(..)これは、メモリ内の形状と互いに切り離された画像を作成しているためです。代わりにこれを試してくださいpaintComponent(Graphics g)

public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.fill(oval);
}
于 2014-12-30T01:30:42.263 に答える