gpt4 book ai didi

Java AWT - repaint()方法线程调度

转载 作者:行者123 更新时间:2023-12-01 18:27:38 25 4
gpt4 key购买 nike

我想要做的是让用户能够从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 PaintingCreating 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com