Java 小程序中未显示按钮
以下是我的小程序游戏的浓缩代码:Java 小程序中未显示按钮,java,applet,awt,keylistener,runnable,Java,Applet,Awt,Keylistener,Runnable,以下是我的小程序游戏的浓缩代码: import java.applet.Applet; import java.awt.event.*; import java.awt.*; public class Game extends Applet implements KeyListener, Runnable { Button options = new Button("Options"); Thread thread = new Thread(this); public
import java.applet.Applet;
import java.awt.event.*;
import java.awt.*;
public class Game extends Applet implements KeyListener, Runnable {
Button options = new Button("Options");
Thread thread = new Thread(this);
public void init() {
addKeyListener(this);
thread.start();
}
public void paint(Graphics graphics) {
// draw stuff
}
public void run() {
try {
while (true) {
thread.sleep(40);
repaint();
}
} catch (InterruptedException exception) {}
}
public void keyPressed(KeyEvent keyEvent) {
switch (keyEvent.getKeyCode()) {
case KeyEvent.VK_ESCAPE:
// pause game
add(options);
}
}
public void keyReleased(KeyEvent keyEvent) {}
public void keyTyped(KeyEvent keyEvent) {}
}
我的游戏按预期运行。但是,当用户按下Esc键时,我想暂停游戏并显示一个选项按钮
问题是,当我按Esc键时,它会按预期暂停游戏。但是,它不会在屏幕上显示按钮。我试图寻找一个解决办法,但没有结果。到底发生了什么事?对我来说非常好
public class TestApplet02 extends Applet implements KeyListener, Runnable {
Button options = new Button("Options");
Thread thread = new Thread(this);
int y = 0;
public void init() {
thread.start();
}
@Override
public void start() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setLayout(new BorderLayout());
addKeyListener(TestApplet02.this);
}
});
}
public void paint(Graphics graphics) {
super.paint(graphics);
Graphics2D g2d = (Graphics2D) graphics;
y++;
if (y > getHeight()) {
y = 0;
}
g2d.drawLine(0, y, getWidth(), y);
}
public void run() {
try {
while (true) {
thread.sleep(40);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
repaint();
}
});
}
} catch (InterruptedException exception) {
}
}
public void keyPressed(KeyEvent keyEvent) {
switch (keyEvent.getKeyCode()) {
case KeyEvent.VK_ESCAPE:
// pause game
add(options);
invalidate();
revalidate();
}
}
public void keyReleased(KeyEvent keyEvent) {
}
public void keyTyped(KeyEvent keyEvent) {
}
}
从垃圾神提供的链接
在小程序中,必须从init启动GUI创建任务
使用invokeAndWait的方法;否则,init可能会在GUI之前返回
已创建,这可能会导致web浏览器启动
小程序。在任何其他类型的程序中,调度GUI创建任务
通常是初始线程做的最后一件事,所以它不会
不管它是使用invokeLater还是invokeAndWait
已更新
我遇到的主要问题是:
在您的转义键处理程序中,如果方向为0,则暂停选项将永远不会激活
case KeyEvent.VK_ESCAPE:
direction = -direction;
if (direction < 0) {
add(options);
} else {
remove(options);
}
您使用的布局管理器是什么?你画画的方法是什么?您正在呼叫super.paint吗?此外,我会认真考虑使用基于AWT的基于Swing的组件,个人…我使用<代码> BoDeLays。然而,即使我使用任何其他布局,它仍然不会显示按钮。你的绘画方法是什么?它是否调用
super.paint
?否。它不调用super.paint
。它应该是吗?另请参见小程序中的required。使用SwingUtilities
,它有什么帮助?所有UI更新都必须在事件调度线程的上下文中执行。我运行的第一个测试在没有它们的情况下运行得很好,但是因为我是一个Swing开发人员,我从不在没有它的情况下从另一个线程修改UI组件。另一个问题-为什么要设置布局并在start
中添加键侦听器,而不是init
?start
方法可能会被多次调用。实际上,没有任何理由,只是想看看它是否起到了作用。实际上,您应该交换init
和start
方法的内容init
应用于“准备”小程序,start
用于告诉您浏览器已请求小程序“启动”它的工作。。。
invalidate();
revalidate();
repaint();