在Applet中绘制画布

时间:2009-01-08 16:10:25

标签: java graphics applet canvas

我目前有一个小型Java程序,我想在桌面上(即在JFrame中)和applet中运行。目前,所有绘图和逻辑都由扩展Canvas的类处理。这为我的桌面应用程序提供了一个非常好的主要方法:

public static void main(String[] args) {
    MyCanvas canvas = new MyCanvas();
    JFrame frame = MyCanvas.frameCanvas(canvas);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    canvas.loop();
}

我可以为applet做类似的事情吗?理想情况下,两种情况下MyCanvas都会保持不变。

不确定它是否重要,但我使用BufferStrategy和setIgnoreRepaint(true)进行绘制。

编辑:为了澄清,我的问题似乎是画画布 - 因为所有的绘画都是通过canvas.loop()电话完成的。

3 个答案:

答案 0 :(得分:2)

AppletContainer,只是add你的画布。

答案 1 :(得分:1)

通常,您的应用程序也是applet的方式是让您的入口点类扩展Applet,并让其设置将Canvas添加到自身等等。

然后,在main方法版本中,您只需实例化Applet类并将其添加到新的Frame(或JApplet / JFrame等)。

有关该技术的示例,请参阅herehere,其实质上归结为(来自第一个示例):

  public static void main(String args[])
  {
    Applet applet = new AppletApplication();
    Frame frame = new Frame();
    frame.addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
    });

    frame.add(applet);
    frame.setSize(IDEAL_WIDTH,IDEAL_HEIGHT);
    frame.show();
  }

答案 2 :(得分:0)

Canvas不适合添加到Swing组件。请改用JComponent(和setOpaque(true))。

应始终在AWT事件调度线程(EDT)上操作Swing组件。使用java.awt.EventQueue.invokeLaterinvokeAndWait表示applet)。您不应该从EDT执行任何阻止操作,因此请为此启动您自己的线程。默认情况下,您在主线程(或applet的applet线程)中运行,这与EDT完全不同。

我建议您删除MyCanvasJFrame的依赖关系。我还建议使用与使用applet不同的框架保留应用程序的代码。将组件添加到JAppletJFrame相同(在这两种情况下都存在恶作剧,实际发生的情况是add实际调用getContentPane().add这可能导致一些不必要的混乱)。主要区别在于您不能pack小程序。