Java绘图图形

时间:2013-06-07 15:24:40

标签: java swing awt

我正在用Java制作游戏,我有一个画布类,它有游戏标记,我在画布上使用

绘制图像
public void paint(Graphics g) {
    // draw stuff here
}

我想将所有绘图函数移动到我的Engine类。 我的引擎中有这个方法:

@Override
public void render(Graphics scene) {
 // draw stuff here
}

在我的Canvas中我没有调用paint方法,但是在Engine中我必须调用render方法,但是因为它需要作为参数图形场景,所以我有点不知所措。我怎么能从我的Engine类(使用render方法)而不是从Canvas类中绘制组件。

引擎类不扩展任何JComponent,但它会初始化Canvas对象

2 个答案:

答案 0 :(得分:1)

  

我正在用Java制作游戏,我有一个画布类,它有   游戏勾选,我使用

在画布上绘制图像

注意

  

public void paint(Graphics g){for awt.Canvas,awt.Panel

     

public void paintComponent(Graphics g){for swing.JComponent,swing.JPanel

  • 任何绘画都只能用于J / Component,好的实践不能将这些方法移到J / Component声明之外
  

我想将所有绘图函数移动到我的Engine类。我有   我的引擎中的这个方法:

  • 最好在执行paint / paintComponent之前准备好所有Object,
  • 将所有对象放入数组
  • 内部paint / paintComponent仅在已准备好的Obects数组中循环,从Swing Timer,Mouse / Key事件调用
  • 所有paiting事件,AWT / Swing GUI必须在Event Dispatch Thread
  • 上完成
  • 今天的GUI使用Swing JComponent,JPanel并覆盖paintComponent
  • 这里有一些非常好的代码示例,由paintComponent
  • 标记

答案 1 :(得分:0)

一个问题是Engine无法知道调用paint(g),因为调用是在画布上运行的。因此,您很可能需要修改Canvas.paint,以便调用Engine。你可以添加一些时髦的听众来Canvas,但我认为这可能比你需要的更复杂。

一种可行的方法是将Engine的实例传递给构造上的Canvas

public class Engine {
    private Canvas canvas;
    public Engine() {
        Canvas = new Canvas(this);
    }
    public void render(Graphics g) {
        // do stuff
    }
}

public class Canvas extends JPanel {
    private Engine engine;
    public Canvas(Engine engine) {
         this.engine = engine;
    }
    @Override
    public void paintComponent(Graphics g) {
          super.paintComponent(g);
          engine.render(g);
    }
}