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

标签 java applet awt

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

相关文章:

java - IncationTargetExceptionMessage 是 : It is impossible to create a new session because 'createSession' error

java - 从 Applet 向 servlet 发送数据时出现 EOFException

java - JApplet 和 JDialog

java - 为 JFrame 设置背景颜色

java - 我正在尝试实现一个 Queue 来反转堆栈并打印堆栈 FIFO?

java - 如何从webview下载文件

java - 如何在图像上画一个圆圈?

java - 如何绘制一条正确指向屏幕角落图像的线

java - 如何拖动多边形?

java - 无需重复字符序列的Passay密码