# 开发 Java Web Start 应用程序

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

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

*   创建一个`MyTopJPanel`类，它是`JPanel`的子类。在`MyTopJPanel`类的构造函数中布置应用程序的 GUI 组件。
*   创建一个名为`MyApplication`的类，它是`JFrame`类的子类。
*   在`MyApplication`类的`main`方法中，实例化`MyTopJPanel`类并将其设置为`JFrame`的内容窗格。

以下部分通过使用动态树演示应用程序更详细地探讨了这些步骤。如果您不熟悉 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);
    }
    // ...
}

```

## 创建应用程序

对于具有基于 Swing 的 GUI 的应用程序，请创建一个作为`javax.swing.JFrame`子类的类。

实例化您的 top `JPanel`类并将其设置为应用程序`main`方法中`JFrame`的内容窗格。 `DynamicTreeApplication`类的`main`方法调用 AWT 事件调度程序线程中的`createGUI`方法。

```
package webstartComponentArch;

import javax.swing.JFrame;

public class DynamicTreeApplication extends JFrame {
    public static void main(String [] args) {
        DynamicTreeApplication app = new DynamicTreeApplication();
        app.createGUI();
    }

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

```

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

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

在 Dynamic Tree Demo 示例中，核心功能分为`DynamicTreePanel`类。现在将`DynamicTreePanel`类放入`JApplet`并将其作为 applet 部署是微不足道的。

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

[下载 _ 动态树演示 _ 示例的源代码](examplesIndex.html#DynamicTreeDemo)以进一步试验。