题
我目前有一个小型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的方式是让您的入口点类扩展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 ,这会导致一些不必要的混淆)。主要区别在于您无法打包
小程序。