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());
    }
}

他のアプレットのインスタンスを作成して、現在のアプレットを破棄するにはどうすればよいですか。

4

3 に答える 3

3

Applet / JAppleはそれ自体がjava.awt.Panelであるため、一方を他方に埋め込むことができます。特定のケースでは、ローダーのパネルを使用してディスプレイローダーに埋め込み、必要に応じてディスプレイをリロードできます。

このようなもの:

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. 2つのアプレットを使用する代わりに、2つのパネルを交換します。CardLayout
  2. 1つのページに両方のアプレットを含める代わりに、を呼び出しますgetAppletContext().showDocument(secondAppletURL);。おそらくsecondAppletURL、最初のアプレットをホストするページのURLとは異なります。

OK-最初のアプレットの問題:

  1. アプレットのサイズを設定しようとしないでください。HTMLで設定します。
  2. メソッドは繰り返し呼び出される可能性があるため、メソッド内のすべてのメソッド呼び出しをstart()メソッドに移動する必要があります。そうすれば、オーバーライドする理由はまったくありません。init()start()start()
  3. JApplet正当な理由がない限り、Swing(eg)コンポーネントとAWT(eg )コンポーネントを混在させないでくださいButton。この場合、JButtonの代わりにを使用してButtonください。
  4. ActionListener様式上のポイントとして、通常、親クラスに実装するよりも匿名の内部を作成する方が適切です。
  5. paint()空の実装でオーバーライドすることはお勧めできません。オリジナルpaint()はアプレットとコンポーネントを描画するので、今は何もしません。
  6. のメソッドactionPerformed()も同様に無意味です。アプレットは、 &が呼び出されるAppletContextまで含まれません。つまり、これらのメソッドを明示的に呼び出すと、2回目に呼び出されます。メソッドは複数回呼び出されることを意図していますが、メソッドは1回だけ呼び出す必要があります。init()start()start()init()

2番目のアプレット。

  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 に答える