我目前有一个小型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()调用完成的。

有帮助吗?

解决方案

Applet 是一个容器,只需 add 你的画布。

其他提示

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

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

请参阅此处这里的技术示例,基本归结为(从第一个示例):

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

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

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

我建议删除 MyCanvas JFrame 的依赖关系。我还建议使用与使用applet不同的框架保留应用程序的代码。将组件添加到 JApplet JFrame 相同(在这两种情况下都存在恶作剧,其中实际发生的是 add 实际调用< code> getContentPane()。add ,这会导致一些不必要的混淆)。主要区别在于您无法打包小程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top