有没有办法在Applet的paint()方法之外绘制?

时间:2012-01-29 20:36:36

标签: java applet awt

我有一个我正在尝试绘制的applet,但我想在applet的paint()方法之外进行绘制。目前我有一个Entity类,它将图像的文件名和屏幕坐标作为参数。构造函数调用Sprite类来处理资源加载和类似的东西。

所以我有一个名为MainMenuState的类,它本来应该处理我的applet主菜单的键盘输入(我正在处理2D游戏)但我意识到将绘图代码放在那里会更好好。我想要做的是在构建主菜单状态时绘制主菜单背景。这是我到目前为止所做的:

Game.java(扩展Applet)

public void init() {
    this.setSize(500, 500);

    // New games have the MainMenuState by default because the game starts at the main menu.
    setState(new MainMenuState(this));

    Entity background = new Entity("../Assets/Menus/titleScreen.png", 0, 0);
    background.draw(this.getGraphics());

}

MainMenuState.java(扩展抽象State类)

public MainMenuState(Game game) {
    super(game);
    Graphics g = game.getGraphics();
    Entity background = new Entity("../Assets/Menus/titleScreen.png", 0, 0);
    background.draw(g);
}

小程序运行并且绘制方法都被正确调用,但小程序从不将图像绘制到屏幕上。目前我的applet的paint()方法是空的。如何在applet的paint()方法之外将图像绘制到屏幕上?

感谢。

更新:好的。我修改了我的MainMenuState类,使用屏幕外缓冲区的图形上下文调用背景的draw()方法,然后我将其绘制到屏幕上。这有效,但每当我调整窗口大小时,我都会闪烁。

Game.java

public void init() {
    this.setSize(500, 500);

    offScreen = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
    graphics = offScreen.getGraphics();

    // New games have the MainMenuState by default because the game starts at the main menu.
    setState(new MainMenuState(this));
}

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

public void update(Graphics g) {
    paint(g);
}

MainMenuState.java除此之外是相同的:background.draw(game.getOffScreenGraphics());

更新2:当然,applets在调整大小时总是会闪烁吗?可能就是这样。

1 个答案:

答案 0 :(得分:1)

永远不要使用getGraphics(),因为永远不会保证获得的Graphics对象能够持久存在。我建议您绘制一个BufferedImage,如果您想绘制“paint of paint”,然后在您希望显示它时在paint方法内绘制该图像。要显示某些内容,最终必须在paint方法中绘制。