1

我目前有一个小型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();
}

我可以为小程序做类似的事情吗?理想情况下,MyCanvas 对于这两种情况都将保持不变。

不确定它是否重要,但我正在使用 BufferStrategy 和setIgnoreRepaint(true).

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

4

3 回答 3

2

Applet是一个Container,只需在其中添加您的 Canvas 。

于 2009-01-08T16:15:57.787 回答
1

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

然后,在主方法版本中,您只需实例化您的 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();
  }
于 2009-01-08T16:32:35.210 回答
0

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

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

我建议删除您MyCanvas对 to的任何依赖JFrame。我还建议将使用框架的应用程序代码与使用小程序的代码分开。将组件添加到 aJApplet与 for 相同JFrame(在这两种情况下都存在恶作剧,实际上发生的是add实际调用getContentPane().add,这可能会导致一些不必要的混淆)。主要区别在于您不能pack使用小程序。

于 2009-01-08T17:05:30.913 回答