2013-03-09 54 views
1

我製作了一個迎接用戶的Loader Applet,當用戶單擊該Applet上顯示的按鈕時,它將啓動主Applet,並且Loader Applet被銷燬。從另一個Applet啓動另一個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()); 
    } 
} 

如何創建另一個小程序的實例,並銷燬當前小程序!

+0

你得到的錯誤是什麼? – SudoRahul 2013-03-09 15:04:36

+0

其實我得到NullPointerException! 所以我試着把一個If-else子句並得到輸出「Not Running」 – Snehasish 2013-03-09 15:07:38

回答

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); 
+0

我對Java相當陌生! 你能告訴我該怎麼做嗎? – Snehasish 2013-03-09 15:18:37

+0

這與在@RJ答案中幾乎相同,但我的意思是在Loader Applet中包含一個額外的面板,因此您可以根據需要從Loader Applet控制Display Applet,它還使您可以包含其他功能,甚至隱藏Loader的組件不想形象化。 我不認爲你可以使用這種方法銷燬Loader Applet,因爲Loader Applet正在創建幷包含Display Applet實例。 – emecas 2013-03-09 15:31:46

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(); 
+0

是的,它的工作! 但是這兩個類都運行在同一個Applet中! 如何銷燬加載程序applet? – Snehasish 2013-03-09 15:16:32

2

小程序有很多錯誤,很難知道從哪裏開始。但讓我們首先集中於一個更明智的策略,以引發一種觀點與另一種觀點之間的變化。

  1. 不是有兩個小程序,有被交換在CardLayout
  2. 而不必在一個頁面兩個小程序的兩個面板,來電getAppletContext().showDocument(secondAppletURL);。據推測,secondAppletURL與承載第一個小程序的頁面的URL不同。

OK - 與第一小應用程序的問題:

  1. 不要試圖設置一個applet的大小。它由HTML設置。
  2. 方法start()中的所有方法調用應移至init()方法,因爲可能會重複調用start()方法。那麼根本沒有理由覆蓋start()
  3. 請勿混用沒有良好原因的Swing(例如JApplet)& AWT(例如Button)組件。在這種情況下,請使用JButton而不是Button
  4. 作爲一個風格點,創建一個匿名內部通常比在父類上實現它更好。
  5. 用空實現覆蓋paint()不是一個好主意。原始paint()繪製小程序和組件,所以現在它什麼也不做。
  6. actionPerformed()中的方法同樣是荒謬的。一個小程序不包含在AppletContext中,直到init() & start()被調用,這意味着明確調用這些方法會導致它們被第二次調用。儘管start()方法意味着多次調用,但只應調用一次方法init()

第2小程序。

  1. 同上點1.重新安裝第一個小程序。
  2. 重寫的paint()方法..將繪製BG顏色(或FG顏色 - 不確定),但沒有其他。再次,不要覆蓋它。
+0

所以基本上正確的方法將從另一個面板中取代一個小程序的面板? – Snehasish 2013-03-10 14:21:32

+0

如果已經閱讀*「用另一個面板替換一個applet的面板**」*我可能會說'是'。事實上,我不明白你的意思。 – 2013-03-10 14:31:16

+0

哦,是的,我的意思是一樣的! – Snehasish 2013-03-10 14:33:09