从另一个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 LoaderDisplay嵌入到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); 

小程序有很多问题,很难知道从哪里开始。 但是,让我们首先集中讨论一个更明智的策略,以便在一个视图和另一个视图之间进行更改。

  1. 而不是有两个小程序,有两个在CardLayout中交换的面板
  2. 而不是在一个页面中同时使用两个applet,调用getAppletContext().showDocument(secondAppletURL); 。 据推测, secondAppletURL与托管第一个applet的页面的URL不同。

好的 – 第一个小程序的问题:

  1. 不要尝试设置applet的大小。 它由HTML设置。
  2. 应该将start()方法中的所有方法调用移动到init()方法,因为可能会重复调用start()方法。 然后根本没有理由重写start()
  3. 不要在没有JApplet理由的情况下混合使用Swing(例如JApplet )和AWT(例如Button )组件。 在这种情况下,请使用JButton而不是Button
  4. 作为一个风格点,通常最好创建一个匿名的内部ActionListener不是在父类上实现它。
  5. 用空实现覆盖paint()不是一个好主意。 原始paint()绘制applet和组件,所以现在它什么都不做。
  6. actionPerformed()中的方法同样没有意义。 在调用init()start()之后,applet才会被包含到AppletContext ,这意味着显式调用这些方法会导致它们第二次被调用。 虽然start()方法要多次调用,但init()方法只应调用一次。

第二个小程序。

  1. 同上点1.重新开始第一个applet。
  2. 重写的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();