# 开发可拖动的小程序

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

通过指定`draggable`参数部署的 Java 小程序可以拖动到浏览器之外并动态转换为 Java Web Start 应用程序。可以通过按 Alt 键和鼠标左键并拖动鼠标来拖动 Java 小程序。当拖动操作开始时，applet 将从其父容器（`Applet`或`JApplet`）中移除，并放置在新的未修饰的顶级窗口（`Frame`或`JFrame`）中。拖动的小程序旁边会显示一个小的浮动关闭按钮。单击浮动“关闭”按钮时，小程序将重新放回浏览器中。可以拖出浏览器的 Java 小程序以后称为 _ 可拖动小程序 _。

您可以通过以下方式自定义可拖动小程序的行为：

*   您可以更改用于将 applet 拖动到浏览器之外的按键和鼠标按键序列。
*   您可以添加可用于在浏览器外部启动应用程序的桌面快捷方式。
*   您可以定义在将 applet 拖出浏览器之后应如何关闭它。

以下部分描述了如何实现和自定义可拖动的 applet。 [`MenuChooserApplet`](examples/applet_Draggable/src/MenuChooserApplet.java) 类用于演示可拖动小程序的开发和部署。在浏览器中打开 [``AppletPage.html``](examples/dist/applet_Draggable/AppletPage.html)，在新页面上查看菜单选择器小程序。

* * *

**Note:**  If you don't see the applet running, you need to install at least the [Java SE Development Kit (JDK) 6 update 10](http://www.oracle.com/technetwork/java/javase/downloads/index.html) release.

* * *

* * *

**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.

* * *

## 启用能力拖动小程序

通过在部署 applet 时将`draggable`参数设置为`true`，可以启用拖动 applet 的功能，如以下代码段所示：

```
<script src="https://www.java.com/js/deployJava.js"></script>
<script>
    var attributes = { code:'MenuChooserApplet', width:900, height:300 };
    var parameters = { jnlp_href: 'draggableapplet.jnlp', draggable: 'true' };
    deployJava.runApplet(attributes, parameters, '1.6');
</script>

```

## 更改用于拖动 Applet 的按键和鼠标按键序列

您可以通过实现`isAppletDragStart`方法更改用于拖动小程序的按键和鼠标按键序列。在下面的代码片段中，可以通过按下鼠标左键并拖动鼠标来拖动小程序：

```
 public boolean isAppletDragStart(MouseEvent e) {
        if(e.getID() == MouseEvent.MOUSE_DRAGGED) {
            return true;
        } else {
            return false;
        }
    }

```

## 当 Applet 与浏览器断开连接时，启用添加桌面快捷方式

如果用户在页面外拖动 applet 后关闭浏览器窗口或导航离开页面，则称 applet 与浏览器 _ 断开连接 _。当 applet 与浏览器断开连接时，您可以为 applet 创建桌面快捷方式。桌面快捷方式可用于在浏览器外部启动应用程序。要启用桌面快捷方式的创建，请将`offline-allowed`和`shortcut`标记添加到小程序的 Java 网络启动协议（JNLP）文件中。

```
<information>
    <!-- ... -->
    <offline-allowed />
    <shortcut online="false">
        <desktop />
    </shortcut>
</information>

```

* * *

**Note:** Depending on the setting for Shortcut Creation in the user's Java Control Panel, the user might be prompted for confirmation before the shortcut is created.

* * *

## 定义应如何关闭 Applet

您可以定义 applet 的关闭方式。例如，你的 Swing applet 可能有一个`JButton`来关闭 applet，而不是依赖于默认的浮动关闭按钮。

Java Plug-in 软件为 applet 提供了`ActionListener`类的实例。 `ActionListener`类的这个实例，也称为 _ 关闭侦听器 _，可用于修改 applet 的默认关闭行为。

要定义应如何关闭 applet，请在 applet 中实现`setAppletCloseListener`和`appletRestored`方法。

在下面的代码片段中， [`MenuChooserApplet`](examples/applet_Draggable/src/MenuChooserApplet.java) 类接收关闭侦听器并将其传递给 [`MenuItemChooser`](examples/applet_Draggable/src/MenuItemChooser.java) 类的实例：

```
MenuItemChooser display = null;
// ...
display = new MenuItemChooser();
// ...
public void setAppletCloseListener(ActionListener cl) {
    display.setCloseListener(cl);
}

public void appletRestored() {
    display.setCloseListener(null);
}

```

`MenuItemChooser`类负责控制 applet 的用户界面。 `MenuItemChooser`类定义标记为“关闭”的`JButton`。当用户单击此“关闭”按钮时，将执行以下代码：

```
private void close() {
    // invoke actionPerformed of closeListener received
    // from the Java Plug-in software.
    if (closeListener != null) {
        closeListener.actionPerformed(null);
    }
}

```

## 请求和自定义 Applet 装饰

从 Java SE 7 发行版开始，在部署 applet 时，您可以指定拖动的 applet 窗口应使用默认或自定义窗口标题进行修饰。

要启用拖动小程序的窗口装饰，请使用值`"true"`指定`java_decorated_frame`参数。要启用自定义窗口标题，还请指定`java_applet_title`参数。此参数的值应为窗口标题的文本。

```
<script src="https://www.java.com/js/deployJava.js"></script>
<script>
    var attributes =
      { code:'SomeDraggableApplet', width:100, height:100 };
    var parameters =
      { jnlp_href: 'somedraggableapplet.jnlp', 
          java_decorated_frame: 'true',
          java_applet_title: 'A Custom Title'   
      };
    deployJava.runApplet(attributes, parameters, '1.7');
</script>

```

`java_decorated_frame`和`java_applet_title`参数也可以在 applet 的 JNLP 文件中指定，如以下代码段所示：

```
<applet-desc main-class="SayHello" name="main test" height="150" width="300">
    <param name="java_decorated_frame" value="true" />
    <param name="java_applet_title" value="" />
</applet-desc>

```

[下载 _Draggable Applet_ 示例的源代码](examplesIndex.html#DraggableApplet)进行进一步实验。