我想要做的是让用户能够从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工作。我真的不知道该怎么做。
发布于 2014-08-27 00:17:44
我认为问题不在于你的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);
}
}这将阻止事件分派线程,从而阻止它处理进入系统的新事件。
看看AWT和Swing中的绘画,了解在AWT中绘画是如何工作的。
在这种情况下,(简单)解决方案是提供另一个Thread,当您想更新UI时,它处理更新和简单调用repaint之间的时间。
一个更好的解决方案是利用a BufferStrategy来代替。它仍然需要一个Thread,但阻止您打破绘画链。
作为副词。令人遗憾的是,AWT Applet已经过时,在2000年之前被JApplet取代.尽管如此,我还是建议您不要使用applet,因为它们有足够的问题,只会增加启动开发的难度,并将重点放在添加到JFrame实例中的JFrame之类的东西上。
看看表演定制绘画和用JFC/Swing创建GUI
我也会尽快放弃使用KeyListener,以支持Swing的键绑定API。有关更多细节,请参见如何使用键绑定
我也会避免调用您的applet Component,已经有一个名为Component的类,这只会混淆事情.
当然,applet不应该有main方法。预期它们将由浏览器直接加载,并且具有不同的、定义的生命周期。
https://stackoverflow.com/questions/25517034
复制相似问题