java - 小程序不显示任何内容

标签 java applet awt doublebuffered appletviewer

一个简单的问题,但解决方案可能并不那么简单。我的代码应该在黑色背景上显示一个可以在屏幕上移动的三角形。没有显示任何内容,只有一个无法右键单击的白色区域。它在 appletviewer 或 HTML 文档中都不起作用,并且不显示任何语法错误。我的代码有什么问题吗?

import java.awt.*;
import java.applet.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;


public class Shipmovementtest extends Applet implements Runnable,KeyListener{

    Graphics2D g2d;
    Ship ship1 = new Ship();
    BufferedImage backbuffer;
    AffineTransform identity = new AffineTransform();
    Shape ship1shape;
    Thread gameloop;
    public void start()
    {
        gameloop = new Thread(this);
        gameloop.start();
    }
    public void run()
    {
        Thread t = Thread.currentThread();
        while(gameloop==t)
        {
        try
        {
            Thread.sleep(20);
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
        repaint();
        }
    }
    public void stop()
    {
        gameloop = null;
    }

    public void init()
    {
        ship1shape = ship1.getShape();
        backbuffer = new BufferedImage(640,480,BufferedImage.TYPE_INT_RGB);
        g2d = backbuffer.createGraphics();
        addKeyListener(this);
        setFocusable(true);
        requestFocusInWindow();

    }
    public void update(Graphics g)
    {
        g2d.setTransform(identity);
        g2d.setPaint(Color.BLACK);
        g2d.fillRect(0,0,getSize().width,getSize().height);
        drawShip();
        paint(g);
    }
    public void keyTyped(KeyEvent e){}
    public void keyPressed(KeyEvent e)
    {
        int ke = e.getKeyCode();
        switch(ke)
        {
        case KeyEvent.VK_LEFT:
            ship1.setFaceAngle(ship1.getFaceAngle()-5);
            break;
        case KeyEvent.VK_RIGHT:
            ship1.setFaceAngle(ship1.getFaceAngle()+5);
            break;
        case KeyEvent.VK_UP:
            ship1.incX(-ship1.calcAngleMoveX(ship1.getFaceAngle())*ship1.velocity);
            ship1.incY(-ship1.calcAngleMoveY(ship1.getFaceAngle())*ship1.velocity);
            break;
        case KeyEvent.VK_DOWN:
            ship1.incX(ship1.calcAngleMoveX(ship1.getFaceAngle())*ship1.velocity);
            ship1.incY(ship1.calcAngleMoveY(ship1.getFaceAngle())*ship1.velocity);
            break;
       }
    }
    public void paint(Graphics g)
    {
        g2d.drawImage(backbuffer,0,0,this);
    }
    public void keyReleased(KeyEvent e){}
    public void drawShip()
    {
        g2d.setTransform(identity);
        g2d.translate(ship1.getX(),ship1.getY());
        g2d.rotate(Math.toRadians(ship1.getFaceAngle()));
        g2d.setColor(ship1.getColor());
        g2d.fill(ship1.getShape());
    }
}

最佳答案

paint结束时,您需要将缓冲区实际绘制到真实图形g。目前您仅在缓冲区中绘画。

所以正确的代码是

public void paint(Graphics g)
{
    g.drawImage(backbuffer,0,0,this);
}

关于java - 小程序不显示任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115116/

相关文章:

java - 在 ubuntu 12.04 上 wkhtmltopdf 不渲染格鲁吉亚字符

java - Eclipse IDE插件能否扩展其他插件

java - 我如何正确对齐此文本?

java - 想要创建一个选择模式并在单击 2 个 JPanels 后将其关闭

java - Swing 图形不会显示 - Java

java - 无法为连接 URL '' Oracle 创建类 'null' 的 JDBC 驱动程序

java - 我正在尝试生成一个随机 #,转换为字符串,然后根据转换后的字符串分配花色

Java 游戏 Applet 在第一帧卡住

java - 如何将其他项目中的类指定给小程序?

java检测何时创建或关闭任何窗口