# 开发 Applet

> 原文： [https://docs.oracle.com/javase/tutorial/deployment/applet/developingApplet.html](https://docs.oracle.com/javase/tutorial/deployment/applet/developingApplet.html)

使用基于[组件的体系结构](../index.html#componentBasedArch)设计的应用程序可以开发成 Java applet。考虑具有基于 Swing 的图形用户界面（GUI）的 Java applet 的示例。通过基于组件的设计，GUI 可以使用较小的构建块或组件构建。以下常规步骤用于创建 applet GUI：

*   创建一个`MyTopJPanel`，它是`javax.swing.JPanel`的子类。在`MyTopJPanel`类的构造函数中布置 applet 的 GUI 组件。
*   创建一个名为`MyApplet`的类，它是`javax.swing.JApplet`的子类。
*   在`MyApplet`的`init`方法中，实例化`MyTopJPanel`并将其设置为 applet 的内容窗格。

以下部分使用动态树演示小程序更详细地探索这些步骤。如果您不熟悉 Swing，请参阅[使用 Swing 创建 GUI](../../uiswing/index.html) 以了解有关使用 Swing GUI 组件的更多信息。

<noscript>A browser with JavaScript enabled is required for this page to operate properly.</noscript>

* * *

**Note:**  If you don't see the example running, you might need to enable the JavaScript interpreter in your browser so that the Deployment Toolkit script can function properly.

* * *

## 创建 Top `JPanel`类

创建一个作为`JPanel`子类的类。此顶部`JPanel`充当所有其他 UI 组件的容器。在以下示例中，`DynamicTreePanel`类是最顶层的`JPanel`。 `DynamicTreePanel`类的构造函数调用其他方法来正确创建和布置 UI 控件。

```
public class DynamicTreePanel extends JPanel implements ActionListener {
    private int newNodeSuffix = 1;
    private static String ADD_COMMAND = "add";
    private static String REMOVE_COMMAND = "remove";
    private static String CLEAR_COMMAND = "clear";

    private DynamicTree treePanel;

    public DynamicTreePanel() {
        super(new BorderLayout());

        //Create the components.
        treePanel = new DynamicTree();
        populateTree(treePanel);

        JButton addButton = new JButton("Add");
        addButton.setActionCommand(ADD_COMMAND);
        addButton.addActionListener(this);

        JButton removeButton = new JButton("Remove");

        // ...

        JButton clearButton = new JButton("Clear");

        // ...

        //Lay everything out.
        treePanel.setPreferredSize(
            new Dimension(300, 150));
        add(treePanel, BorderLayout.CENTER);

        JPanel panel = new JPanel(new GridLayout(0,3));
        panel.add(addButton);
        panel.add(removeButton); 
        panel.add(clearButton);
        add(panel, BorderLayout.SOUTH);
    }
    // ...
}

```

## 创建 Applet

对于具有基于 Swing 的 GUI 的 Java applet，创建一个作为`javax.swing.JApplet`子类的类。不包含基于 Swing 的 GUI 的 applet 可以扩展`java.applet.Applet`类。

覆盖 applet 的`init`方法来实例化你的 top `JPanel`类并创建 applet 的 GUI。 `DynamicTreeApplet`类的`init`方法调用 AWT 事件调度程序线程中的`createGUI`方法。

```
package appletComponentArch;

import javax.swing.JApplet;
import javax.swing.SwingUtilities;

public class DynamicTreeApplet extends JApplet {
    //Called when this applet is loaded into the browser.
    public void init() {
        //Execute a job on the event-dispatching thread; creating this applet's GUI.
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    createGUI();
                }
            });
        } catch (Exception e) { 
            System.err.println("createGUI didn't complete successfully");
        }
    }

    private void createGUI() {
        //Create and set up the content pane.
        DynamicTreePanel newContentPane = new DynamicTreePanel();
        newContentPane.setOpaque(true); 
        setContentPane(newContentPane);        
    }        
}

```

## 从最终部署机制中分离核心功能的好处

创建 applet 的另一种方法是删除抽象层（单独的顶部`JPanel`）并在 applet 的`init`方法本身中布置所有控件。直接在 applet 中创建 GUI 的缺点是，如果您以后选择这样做，现在将您的功能部署为 Java Web Start 应用程序会更加困难。

在 Dynamic Tree Demo 示例中，核心功能位于`DynamicTreePanel`类中。现在将`DynamicTreePanel`类放入`JFrame`并部署为 Java Web Start 应用程序是微不足道的。

因此，为了保持可移植性并保持部署选项的开放，请遵循本页所述的基于组件的设计。

[Download source code](examplesIndex.html#ComponentArchDynamicTreeDemo) for the _Dynamic Tree Demo Applet_ example to experiment further.