[英]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
以下是我在該來源中看到的一些問題:
paint()
中添加監聽器paint()
方法中調用wait()
。paint()
方法中調用System.exit()
(嚴格來說不是問題,但非常不尋常)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.