从另一个Applet启动另一个Applet
我已经制作了一个Loader Applet来迎接用户,当用户点击该Applet上显示的按钮时,它会启动主applet并销毁Loader Applet。
但点击另一个小程序没有启动!
装载机小程序:
import java.awt.Button; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JApplet; public class Loader extends JApplet implements ActionListener{ Display secondApplet; Button button; @Override public void init() { setSize(800,600); } @Override public void start() { setLayout(new FlowLayout()); button = new Button ("Click me !!"); add(button); button.addActionListener(this); } @Override public void paint(Graphics g) { } @Override public void actionPerformed(ActionEvent e) { secondApplet = (Display)getAppletContext().getApplet("Display"); if (secondApplet != null) { secondApplet.init(); secondApplet.start(); } else { System.out.println("Not Running\n"); } } }
显示小程序:
import java.awt.Color; import java.awt.Graphics; import javax.swing.JApplet; public class Display extends JApplet { @Override public void init() { setSize(600,400); } @Override public void paint(Graphics g) { g.fillRect(0, 0, this.getWidth(), this.getHeight()); } }
如何创建另一个Applet的实例并销毁当前的Applet !!
由于Applet / JApple本身就是java.awt.Panel ,因此您可以将其中一个嵌入到另一个中,对于您的特定情况,您可以使用Panel in Loader将Display嵌入到Loader中,以根据需要重新加载显示 。
像这样的东西:
Panel container = new Panel(); container.setLayout(new GridLayout(1,0)); container.add(secondApplet); //Display Applet add(container): secondApplet.init(); secondApplet.start(); button.setVisible(false);
小程序有很多问题,很难知道从哪里开始。 但是,让我们首先集中讨论一个更明智的策略,以便在一个视图和另一个视图之间进行更改。
- 而不是有两个小程序,有两个在
CardLayout
中交换的面板 - 而不是在一个页面中同时使用两个applet,调用
getAppletContext().showDocument(secondAppletURL);
。 据推测,secondAppletURL
与托管第一个applet的页面的URL不同。
好的 – 第一个小程序的问题:
- 不要尝试设置applet的大小。 它由HTML设置。
- 应该将
start()
方法中的所有方法调用移动到init()
方法,因为可能会重复调用start()
方法。 然后根本没有理由重写start()
。 - 不要在没有
JApplet
理由的情况下混合使用Swing(例如JApplet
)和AWT(例如Button
)组件。 在这种情况下,请使用JButton
而不是Button
。 - 作为一个风格点,通常最好创建一个匿名的内部
ActionListener
不是在父类上实现它。 - 用空实现覆盖
paint()
不是一个好主意。 原始paint()
绘制applet和组件,所以现在它什么都不做。 -
actionPerformed()
中的方法同样没有意义。 在调用init()
和start()
之后,applet才会被包含到AppletContext
,这意味着显式调用这些方法会导致它们第二次被调用。 虽然start()
方法要多次调用,但init()
方法只应调用一次。
第二个小程序。
- 同上点1.重新开始第一个applet。
- 重写的
paint()
方法..将绘制BG颜色(或FG颜色 – 不确定),但没有别的。 同样,不要覆盖它。
尝试使用此方法加载另一个小程序。 看看它是否有效。
Class applet2 = Class.forName("Applet2"); Applet appletToLoad = (Applet)applet2.newInstance(); appletToLoad.setStub(this); setLayout(new GridLayout(1,0)); add(appletToLoad); appletToLoad.init(); appletToLoad.start();