【问题标题】:Launching another Applet from another Applet从另一个 Applet 启动另一个 Applet
【发布时间】:2013-03-09 14:54:57
【问题描述】:

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

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

加载器小程序:

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 !!

【问题讨论】:

  • 您遇到的错误是什么?
  • 实际上我得到了 NullPointerException !所以我尝试放置一个 If-else 子句并得到输出“未运行”

标签: java applet japplet


【解决方案1】:

由于 Applet/JApple 本身就是 java.awt.Panel,因此您可以将一个嵌入到另一个中,针对您的具体情况,您可以将 Display 嵌入到 Loader 使用 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);

【讨论】:

  • 这与@RJ 回答中的几乎相同,但我的意思是在加载程序小程序中包含一个额外的面板,因此您可以根据需要从加载程序小程序控制显示小程序,它还使您可以包含其他功能,甚至隐藏您不想可视化的 Loader 组件。我不认为您可以使用这种方法销毁 Loader Applet,因为 Loader Applet 正在创建并包含 Display Applet 实例。
【解决方案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() 中的方法同样荒谬。直到调用init()start() 之后,小程序才会包含在AppletContext 中,这意味着显式调用这些方法会导致它们被第二次调用。虽然 start() 方法应该被调用多次,但 init() 方法应该只被调用一次。

第二个小程序。

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

【讨论】:

  • 所以基本上正确的方法是从另一个面板替换一个小程序的面板??
  • 如果上面写着 "将一个小程序的面板替换为另一个面板??"我可能会说'是'。事实上,我不明白你的意思。
  • 哦,是的..我的意思是一样的!
【解决方案3】:

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

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-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多