首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java重新绘制()方法线程调度

Java重新绘制()方法线程调度
EN

Stack Overflow用户
提问于 2014-08-27 00:11:31
回答 1查看 358关注 0票数 0

我想要做的是让用户能够从KeyListener中改变透视图。如果用户按下指定的键,则应更改透视图。有什么想法吗?

即使我重写了这些方法,它们仍然不起作用。我也尝试过KeyAdapter

代码语言:javascript
复制
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工作。我真的不知道该怎么做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-27 00:17:44

我认为问题不在于你的KeyListener,而在于你的油漆工艺

代码语言:javascript
复制
@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方法。预期它们将由浏览器直接加载,并且具有不同的、定义的生命周期。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25517034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档