我想要做的是让用户能够从KeyListener
更改视角。如果用户按下指定的键,视角就会改变。有什么想法吗?
即使我覆盖这些方法,它们仍然不起作用。我也尝试过KeyAdapter
package com.development.gameOne.environment.component;
import java.applet.Applet;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import com.development.gameOne.environment.applet.drawing.Perspective;
import com.development.gameOne.environment.applet.perspectives.p1.FirstPerspective;
import com.development.gameOne.environment.applet.perspectives.p2.SecondPerspective;
public class Component extends Applet implements KeyListener {
private static final long serialVersionUID = 1L;
private Dimension size = new Dimension(1280, 720);
private ArrayList<Perspective> perspectives = new ArrayList<Perspective>();
private boolean running = true;
private boolean switchPerspective = false;
public Component() {
setPreferredSize(size);
loadPerspectives();
addKeyListener(this);
setFocusable(true);
setVisible(true);
start();
}
private void loadPerspectives() {
perspectives.add(new FirstPerspective());
perspectives.add(new SecondPerspective());
}
public static void main(String[] args) {
new Component();
}
@Override
public void paint(Graphics g) {
while (running) {
for (Perspective p : perspectives) {
System.out.println(p.getPerspective());
while (!switchPerspective) {
System.out.println("Rendering");
p.start(g);
sleep(100);
}
switchPerspective = false;
}
sleep(10);
}
}
public static void sleep(int renderSpeed) {
try {
Thread.sleep(renderSpeed);
}
catch (Exception e) {}
}
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_SHIFT:
System.out.println("KeyPressed");
switchPerspective = true;
break;
}
}
public void keyTyped(KeyEvent e) { }
public void keyReleased(KeyEvent e) {}
}
程序运行,但不切换视角。我似乎无法获取 KeyListener
根本不去工作。我真的不知道该怎么办。
最佳答案
我认为问题不在于您的 KeyListener
,而在于您的绘制过程
@Override
public void paint(Graphics g) {
while (running) {
for (Perspective p : perspectives) {
System.out.println(p.getPerspective());
while (!switchPerspective) {
System.out.println("Rendering");
p.start(g);
sleep(100);
}
switchPerspective = false;
}
sleep(10);
}
}
这将阻塞事件调度线程,阻止它处理进入系统的新事件
看看Painting in AWT and Swing有关 AWT 中绘画工作原理的详细信息。
在这种情况下,(简单的)解决方案是提供另一个 Thread
来处理更新之间的时间,并在您希望更新 UI 时简单调用 repaint
.
更好的解决方案是利用 BufferStrategy
来代替。它仍然需要一个Thread
,但会阻止您破坏绘画链。
作为旁注。不幸的是,AWT Applet
已经过时了,并在 2000 年之前被 JApplet
取代。话虽如此,我还是建议不要使用 applet,因为它们有足够多的问题这只会增加开始开发的难度,并专注于添加到 JFrame
实例的 JPanel
之类的东西。
看看Performing Custom Painting和 Creating a GUI With JFC/Swing
我还会尽快放弃使用 KeyListener
,转而使用 Swing 的键绑定(bind) API。请参阅How to Use Key Bindings了解更多详情
我也会避免调用您的小程序 Component
,已经有一个名为 Component
的类,这只会让事情变得困惑......
小程序绝对不应该有 main
方法。它们预计由浏览器直接加载,并具有不同的、已定义的生命周期。
关于Java AWT - repaint()方法线程调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25517034/