![](/img/trans.png)
[英]JPopupMenu in Java3d applet does not receive mouse or keyboard input
[英]Java Applet Game Loop stops Mouse/Keyboard Input?
經過大約 2 小時的嘗試后,我遇到了一個無法上班的問題。 我想要一個循環來執行 2 種方法(繪制和更新),但還要聽鼠標/鍵盤事件。 我有一個繪制和更新的循環,但在循環之外什么都不做(監聽事件)我嘗試了很多東西,但沒有任何效果。 請幫忙?
我嘗試使用 Runnable Thread,使用不同的命令,使用 wait() 和 notify(),我嘗試了很多東西。 但基本上我想知道如何運行循環並仍然檢查用戶輸入
此外,當我嘗試單擊紅色“X”退出程序時,它不會退出但仍然可以工作
這是代碼:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class main extends Applet implements MouseListener, Runnable {
public main() {
super();
init();
}
Thread t;
Screen screen = new Screen();
String Text = "Hello";
boolean Running = true;
boolean Click = false;
int R = 0x00;
int G = 0x00;
int B = 0x00;
int xpoints[] = {25, 40, 40, 25, 25};
int ypoints[] = {40, 40, 25, 25, 25};
int npoints = 5;
public void run() {
while (Running) {
GameLoop();
}
}
public void init() {
this.addMouseListener(this);
this.setSize(400, 300); //manually set your Frame's size
t = new Thread(this);
t.start();
}
public void paint(Graphics g) {
g.setColor(new Color(R, B, G));
g.fillPolygon(xpoints, ypoints, npoints);
Running = true;
t.run();
}
public void mousePressed(MouseEvent e) { //On Mouse Click
System.exit(0);
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
System.exit(0);
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public boolean keyDown(Event e, int key) {
return true;
}
public void GameLoop() {
if (Running) {
if (R != 0xff) {
R++;
} else {
if (G != 0xff) {
G++;
} else {
if (B != 0xff) {
B++;
} else {
System.exit(0);
}
}
}
try {
sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
paint(getGraphics());
}
}
public void sleep(int time) throws InterruptedException {
Thread.sleep(time, 0);
}
}
本教程應該提供一些關於如何構建程序的見解。 這對鼠標聽眾很有幫助。
您應該解決的問題:
1)你正在用paint
方法做一些可疑的事情。 你為什么在那里調用t.run()
? 線程t
已經在運行並且循環不斷地調用paint()
方法來重繪屏幕。 刪除這個電話,看看你得到了什么。
1)您的線程/應用程序的破壞很差。 上面的第一個例子提供了一種更好的方式來實現這一點
2)您在mousePressed()
上有System.Exit(0)
並帶有注釋//on mouse click
但在mouseClicked()
中沒有任何內容 ...它可以工作,但它的約定不好
3)將 class 命名為main
是非常糟糕的約定,既令人困惑又不切實際。 將您的 class 重命名為“游戲”或類似名稱。
4)如果不使用Screen
,為什么要聲明它?
我看到您在初始化時將 Running 變量定義為 true。 此變量用於確定游戲是否應該停止。 但是,我沒有看到您將此變量的值修改為 false 的任何地方。 這可以解釋為什么你的游戲永遠不會退出。
至於游戲無法運行,請嘗試在 IDE 中調試應用程序。 然后,您應該注意拋出了什么異常(如果有的話)以及您所質疑的任何變量的值。 希望這能讓您深入了解應用程序的行為。
不要忘記向我們提供您發現的任何新信息,以便我們一路為您提供幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.