簡體   English   中英

框架上的鼠標偵聽器

[英]mouse listener on frame

嗨,我正在嘗試在我的框架中添加一個鼠標偵聽器以獲取單擊鼠標的 position 並檢查它是否在圓圈內,問題是它沒有觸發

public class CircleDraw extends Frame implements MouseListener {

static int circles = 0;
private double color;
double mousex = 0;
double mousey = 0;
int score;

public void mouseClicked(MouseEvent evt)
{
         mousex = evt.getX();
         mousey = evt.getY();
}
public void mouseEntered (MouseEvent me) {}
public void mousePressed (MouseEvent me) {}
public void mouseReleased (MouseEvent me) {}
public void mouseExited (MouseEvent me) {}

public void paint(Graphics g) {
    try {
                this.addMouseListener(this);
      while (circles < 20) {
        color = 10*Math.random();
        Shape circle = new Ellipse2D.Double(900*Math.random(),900*Math.random(), 50.0f,      50.0f);
        Graphics2D ga = (Graphics2D)g;
        ga.draw(circle);
        if(color >2)
            ga.setPaint(Color.green);
        else
            ga.setPaint(Color.BLACK);

        ga.fill(circle);

        if(circle.contains(mousex, mousey) && color > 2)
                score ++;
        else
            if(circle.contains(mousex, mousey) && color < 2)
                score--;
        Thread.sleep(1000);

        System.out.println(circles);
        System.out.println(mousex);
        System.out.println(mousey);

        circles ++;
        ga.setPaint(Color.white);
        ga.fill(circle);
    }
                System.exit(0);
 } catch (InterruptedException e) {
    e.printStackTrace();
 } 
  }

  public static void main(String args[]) {

  Frame frame = new CircleDraw();

 frame.addWindowListener(new WindowAdapter(){
  public void windowClosing(WindowEvent we){
 System.exit(0);
 }
 });
 frame.setSize(1000, 1000);
 frame.setVisible(true);

 }}

在 paint() 方法中添加鼠標偵聽器是致命的,因為這個方法被非常頻繁地調用(每次重繪),並且添加了很多偵聽器(每次重繪)。

您應該將偵聽器添加到內容面板,而不是 JFrame 本身。 這會做到的。 您可以在 class 的構造函數中執行此操作:

public CircleDraw() {
    this.getContentPane().addMouseListener(this);
}

我認為這不會完全解決您的問題,因為當您的繪畫方法處於活動狀態時,您不會點擊鼠標。 您的代碼設計(尤其是您的 while 循環)不會給其他事件觸發任何時間。 因此,鼠標點擊事件將在 20 次循環后處理。 您可以通過添加來檢查這一點

public void mouseClicked(MouseEvent evt) {
    mousex = evt.getX();
    mousey = evt.getY();
    System.out.println("X: "+mousex+"/ Y: "+mousey);
}

到你的代碼。 您必須在不同的線程中運行您的 GUI(例如,為此使用 SwingUtilities 和 Runnable())。 我建議您獲得一本關於 JAVA 開發的好書。 或者您可以從像這樣的在線教程開始。

恕我直言,您不應該嘗試處理 awt,而是使用 SWING 或 SWT 進行 GUI 設計,因為這樣更舒適。

在構造函數中添加監聽,重復調用paint

以下是我在該來源中看到的一些問題:

  1. paint()中添加監聽器
  2. paint()方法中調用wait()
  3. paint()方法中調用System.exit() (嚴格來說不是問題,但非常不尋常)。
  4. 格式不正確且難以理解
  5. 調用不推薦使用的方法。
  6. AWT 中的代碼在錯誤的千年中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM