1

我制作了一个加载器小程序,它向用户打招呼,当用户单击该小程序上显示的按钮时,它会启动主小程序,加载程序小程序被销毁。

但是点击另一个小程序没有启动!

加载程序小程序:

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 !

4

3 回答 3

3

由于 Applet/JApple 本身就是java.awt.Panel,因此您可以将一个嵌入到另一个中,对于您的特定情况,您可以使用 Loader 中的面板将 Display 嵌入Loader 中,以便根据需要重新加载Display

像这样的东西:

Panel container = new Panel();
container.setLayout(new GridLayout(1,0));
container.add(secondApplet); //Display Applet
add(container):

secondApplet.init();
secondApplet.start();

button.setVisible(false);
于 2013-03-09T15:08:14.940 回答
2

小程序有很多问题,很难知道从哪里开始。但是,让我们首先专注于一种更明智的策略,以引起一种观点和另一种观点之间的变化。

  1. 不是有两个小程序,而是有两个面板在一个CardLayout
  2. 不要将两个小程序放在一个页面中,而是调用getAppletContext().showDocument(secondAppletURL);. 可能secondAppletURL与托管第一个小程序的页面的 URL 不同。

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

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

第二个小程序。

  1. 同上第 1 点。关于第一个小程序。
  2. 被覆盖的paint()方法..将绘制 BG 颜色(或 FG 颜色 - 不确定),但仅此而已。同样,不要覆盖它。
于 2013-03-10T11:33:42.533 回答
1

试试这个方法来加载另一个小程序。看看它是否有效。

Class applet2 = Class.forName("Applet2");
Applet appletToLoad = (Applet)applet2.newInstance();
appletToLoad.setStub(this);
setLayout(new GridLayout(1,0));
add(appletToLoad);
appletToLoad.init();
appletToLoad.start();
于 2013-03-09T15:10:52.457 回答