我目前有一个小型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()
电话完成的。
答案 0 :(得分:2)
答案 1 :(得分:1)
通常,您的应用程序也是applet的方式是让您的入口点类扩展Applet,并让其设置将Canvas添加到自身等等。
然后,在main方法版本中,您只需实例化Applet类并将其添加到新的Frame(或JApplet / JFrame等)。
有关该技术的示例,请参阅here和here,其实质上归结为(来自第一个示例):
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.invokeLater
(invokeAndWait
表示applet)。您不应该从EDT执行任何阻止操作,因此请为此启动您自己的线程。默认情况下,您在主线程(或applet的applet线程)中运行,这与EDT完全不同。
我建议您删除MyCanvas
到JFrame
的依赖关系。我还建议使用与使用applet不同的框架保留应用程序的代码。将组件添加到JApplet
与JFrame
相同(在这两种情况下都存在恶作剧,实际发生的情况是add
实际调用getContentPane().add
这可能导致一些不必要的混乱)。主要区别在于您不能pack
小程序。