【问题标题】:Is there any way to draw outside of an Applet's paint() method?有没有办法在 Applet 的 paint() 方法之外进行绘制?
【发布时间】:2012-02-21 19:30:50
【问题描述】:

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

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

Game.java(扩展小程序)

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);
}

小程序运行并且所有绘制方法都被正确调用,但小程序从不将图像绘制到屏幕上。目前我的小程序的paint() 方法是空的。如何在小程序的 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:当然,小程序在调整大小时总是闪烁吗?可能就是这样。

【问题讨论】:

  • “小程序在调整大小时总是闪烁吗?” 其他 GUI 不应该,但小程序通常不能调整大小。换句话说,不要做this.setSize(500, 500);之类的事情。 1) 为什么要使用具有透明度的BufferedImage? 2) 你为什么要编写一个小程序?
  • 我不记得为什么我选择了 BufferedImage。最初的程序是一个小程序,因为我们的想法是,一旦项目完成,我们就可以将它发布到网站上(虽然不是我的想法)。
  • 1) 我的问题不是关于BufferedImage 的使用,而是关于透明度的使用。将其更改为 RGB 并报告任何差异。 2) “我们可以将它发布到网站上”小程序既不是最好的也不是最简单的方法。而是从使用Java Web Start 的链接启动JFrame。

标签: java applet awt


【解决方案1】:

永远不要使用getGraphics(),因为所获得的 Graphics 对象永远无法保证持久存在。如果您想在“油漆之外”绘制,我建议您在 BufferedImage 中绘制,然后在您希望显示它时在 paint 方法内绘制该图像。要显示某些东西,它最终必须在paint 方法中绘制,句号。

【讨论】:

    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2012-08-25
    相关资源
    最近更新 更多