46、Java 可访问性与 Web Start 技术详解

Java 可访问性与 Web Start 技术详解

1. 可访问性与 PageData 应用

在当今计算机领域,可访问性(Accessibility)对于软件的广泛使用至关重要。可访问性意味着软件能够被各种能力的用户,包括残障人士,方便地使用。下面我们先通过一个简单的示例来了解如何创建带标签的文本字段:

JTextField name = new JTextField(20);
JLabel nameLabel = new JLabel(“Enter Your Name:”);
nameLabel.setMnemonic(‘n’);
name.setLabelFor(nameLabel);

这里,我们创建了一个文本字段 name 和一个标签 nameLabel ,并为标签设置了助记符 'n' ,同时将标签与文本字段关联起来。

接下来,我们介绍一个名为 PageData 的 Java 应用程序,它支持多种可访问性功能。这个应用允许用户输入网页地址,并获取该网页及其服务器的相关信息。该程序主要运用了 Swing 和 Java 网络功能,同时引入了 java.net.URLConnection 类的 getHeaderField(String) 方法。这个方法可以从通过 URLConnection 对象发送信息的 Web 服务器中检索信息。例如,HTTP 协议中的 Server 头部信息,用于标识运行 Web 服务器的软件,我们可以通过以下代码获取:

String serv = pipe.getHeaderField(“Server”);

如果服务器配置为提供该信息, serv 将存储服务器软件的名称;否则,返回值为 null

PageData 程序通过以下几种方式实现了可访问性:
- 使用 super() 方法为应用的主框架设置标题 “Page Data”。
- 每个按钮都有明确标识其用途的文本标签。
- 利用 setLabelFor() 方法将标签与文本字段关联。
- 为每个命令按钮设置工具提示(ToolTips)和键盘助记符。

以下是 PageData.java 的完整源代码:

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;

public class PageData extends JFrame implements ActionListener, Runnable {
    Thread runner;
    String[] headers = { “Content-Length”, “Content-Type”, “Date”, “Public”, “Expires”, “Last-Modified”, “Server” };
    URL page;
    JTextField url;
    JLabel[] headerLabel = new JLabel[7];
    JTextField[] header = new JTextField[7];
    JButton readPage, clearPage, quitLoading;
    JLabel status;

    public PageData() {
        super(“Page Data”);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pane = new JPanel();
        pane.setLayout(new GridLayout(10, 1));

        JPanel first = new JPanel();
        first.setLayout(new FlowLayout(FlowLayout.RIGHT));
        JLabel urlLabel = new JLabel(“URL:”);
        url = new JTextField(22);
        urlLabel.setLabelFor(url);
        first.add(urlLabel);
        first.add(url);
        pane.add(first);

        JPanel second = new JPanel();
        second.setLayout(new FlowLayout());
        readPage = new JButton(“Read Page”);
        clearPage = new JButton(“Clear Fields”);
        quitLoading = new JButton(“Quit Loading”);
        readPage.setMnemonic(‘r’);
        clearPage.setMnemonic(‘c’);
        quitLoading.setMnemonic(‘q’);
        readPage.setToolTipText(“Begin Loading the Web Page”);
        clearPage.setToolTipText(“Clear All Header Fields Below”);
        quitLoading.setToolTipText(“Quit Trying to Load the Web Page”);
        readPage.setEnabled(true);
        clearPage.setEnabled(false);
        quitLoading.setEnabled(false);
        readPage.addActionListener(this);
        clearPage.addActionListener(this);
        quitLoading.addActionListener(this);
        second.add(readPage);
        second.add(clearPage);
        second.add(quitLoading);
        pane.add(second);

        JPanel[] row = new JPanel[7];
        for (int i = 0; i < 7; i++) {
            row[i] = new JPanel();
            row[i].setLayout(new FlowLayout(FlowLayout.RIGHT));
            headerLabel[i] = new JLabel(headers[i]+”:”);
            header[i] = new JTextField(22);
            headerLabel[i].setLabelFor(header[i]);
            row[i].add(headerLabel[i]);
            row[i].add(header[i]);
            pane.add(row[i]);
        }

        JPanel last = new JPanel();
        last.setLayout(new FlowLayout(FlowLayout.LEFT));
        status = new JLabel(“Enter a URL address to check.”);
        last.add(status);
        pane.add(last);

        setContentPane(pane);
    }

    public void actionPerformed(ActionEvent evt) {
        Object source = evt.getSource();
        if (source == readPage) {
            try {
                page = new URL(url.getText());
                if (runner == null) {
                    runner = new Thread(this);
                    runner.start();
                }
                quitLoading.setEnabled(true);
                readPage.setEnabled(false);
            } catch (MalformedURLException e) {
                status.setText(“Bad URL: “ + page);
            }
        } else if (source == clearPage) {
            for (int i = 0; i < 7; i++)
                header[i].setText(“”);
            quitLoading.setEnabled(false);
            readPage.setEnabled(true);
            clearPage.setEnabled(false);
        } else if (source == quitLoading) {
            runner = null;
            url.setText(“”);
            quitLoading.setEnabled(false);
            readPage.setEnabled(true);
            clearPage.setEnabled(false);
        }
    }

    public void run() {
        URLConnection conn = null;
        try {
            conn = this.page.openConnection();
            conn.connect();
            status.setText(“Connection opened ...”);
            for (int i = 0; i < 7; i++)
                header[i].setText(conn.getHeaderField(headers[i]));
            quitLoading.setEnabled(false);
            clearPage.setEnabled(true);
            status.setText(“Done”);
            runner = null;
        } catch (IOException e) {
            status.setText(“IO Error:” + e.getMessage());
        }
    }

    public static void main(String[] arguments) {
        PageData frame = new PageData();
        frame.pack();
        frame.setVisible(true);
    }
}

运行 PageData 应用程序需要有活跃的互联网连接,用户在使用 Java 解释器运行该程序前,应先登录到网络服务提供商。该程序的工具提示、选择性启用组件等功能,使得它易于学习和使用。如果输入的网页地址无法加载,用户可以使用 “Quit Loading” 按钮停止连接尝试。

2. Java Web Start 技术

Java 程序员面临的一个重要问题是如何将软件提供给用户。在 Java 2 版本 1.4 中,Sun 引入了 Java Web Start 技术,这是一种通过点击网页链接来下载和运行程序的协议。使用 Java Web Start,用户可以像运行小程序(applets)一样运行应用程序。

2.1 Java 程序的分发方式

Java 应用程序需要 Java 解释器,用户可以选择安装 Java 运行时环境(Java Runtime Environment,JRE)。最简单的方法是要求用户从 Sun 的网站(http://java.sun.com/getjava/)下载并安装 JRE。应用程序可以通过 CD、网站等方式分发,用户可能需要运行安装程序或手动复制文件和文件夹。

小程序相对更容易分发,因为它们可以由 Web 浏览器(如 Microsoft Internet Explorer、Netscape Navigator 和 Mozilla)直接运行。但 Java 2 小程序要求用户的浏览器安装 Java 插件,该插件也可以从 Sun 网站随 JRE 一起下载。不过,小程序存在一些缺点,例如默认的安全策略限制了它们对用户计算机上数据的读写操作。

2.2 Java Web Start 的工作原理

Java Web Start 的工作流程如下:
1. 程序员将应用程序的文件打包成 Java 归档(JAR)文件,并创建一个使用 Java 网络启动协议(JNLP)的文件。
2. 将这些文件发布到 Web 服务器上,并在网页中添加指向 JNLP 文件的链接。
3. 用户使用浏览器打开网页并点击链接。
4. 如果用户没有安装 JRE,会弹出对话框询问是否下载并安装。完整安装包目前大小为 5.7M,在 56K 网络连接下可能需要 30 - 45 分钟下载。
5. JRE 安装并运行程序,打开新的窗口和界面组件,程序会被缓存,下次运行无需再次安装。

我们可以访问 Sun 的 Java Web Start 网站(http://java.sun.com/products/javawebstart),点击 “Demos” 链接,测试一些示例应用程序。

2.3 使用 Java Web Start 准备应用程序

要使用 Java Web Start 运行应用程序,需要完成以下步骤:
1. 打包 JAR 文件 :使用以下命令将应用程序的类文件打包成 JAR 文件:

jar -cf PageData.jar PageData.class

这里创建了一个名为 PageData.jar 的 JAR 文件,包含 PageData.class 文件。
2. 创建图标 :为应用程序创建一个 64x64 像素的图标,可以是 GIF 或 JPEG 格式。如果不想创建新图标,可以从指定网站下载 pagedataicon.gif 文件,并保存到与 PageData.jar 相同的文件夹中。
3. 创建 JNLP 文件 :JNLP 文件是一个 XML 格式的文件,用于指定应用程序的主类文件、JAR 存档等信息。以下是 PageData 应用的 JNLP 文件示例:

<?xml version=”1.0” encoding=”utf-8”?>
<!-- JNLP File for the PageData Application -->
<jnlp codebase=”http://www.cadenhead.org/book/java21pro/java” href=”PageData.jnlp”>
    <information>
        <title>PageData Application</title>
        <vendor>Rogers Cadenhead</vendor>
        <homepage href=”http://www.java21pro.com”/>
        <icon href=”pagedataicon.gif”/>
        <offline-allowed/>
    </information>
    <resources>
        <j2se version=”1.4”/>
        <jar href=”PageData.jar”/>
    </resources>
    <application-desc main-class=”PageData”/>
</jnlp>

在创建 JNLP 文件后,需要将第 4 行的 codebase 属性修改为存储应用程序 JAR 文件、图标文件和 JNLP 文件的 Web 服务器文件夹。然后将这三个文件上传到该文件夹,使用浏览器通过完整 Web 地址加载 JNLP 文件。如果 Web 服务器配置为支持 Java Web Start,应用程序将被加载并运行。

2.4 服务器对 Java Web Start 的支持

如果服务器不支持 Java Web Start,可能会直接显示 JNLP 文件的文本内容,而无法运行应用程序。为了让服务器识别 JNLP 文件并启动 Java 应用程序,需要设置 MIME 类型。在 Apache Web 服务器中,服务器管理员可以在 mime.types .mime.types 文件中添加以下行:

application/x-java-jnlp-file JNLP

如果无法在自己的服务器上实现 Java Web Start,可以在指定的官方网站上测试项目。

2.5 JNLP 文件的其他元素

JNLP 格式还有其他元素可以影响 Java Web Start 的性能。例如, security 元素可以用于运行具有不同安全权限的签名应用程序:

<security>
    <all-permissions/>
</security>

description 元素可以为应用程序提供更多信息,有四种不同类型的描述:
- kind=”one-line” :简洁的单行描述,用于 Web Start 应用程序列表。
- kind=”short” :段落长度的描述,在有足够空间时显示。
- kind=”tooltip” :工具提示描述。
- 无 kind 属性:默认描述。

另外, icon 元素可以指定应用程序加载时显示的图标和启动画面。

2.6 运行小程序

Java Web Start 不仅可以运行应用程序,还可以运行小程序。与浏览器运行小程序不同,Java Web Start 运行的小程序具有与应用程序相同的默认安全策略,并且在独立窗口中运行。要使用 Java Web Start 运行小程序,需要使用 applet-desc 元素代替 application-desc 元素。以下是一个运行 NewWatch 小程序的 JNLP 文件示例:

<?xml version=”1.0” encoding=”utf-8”?>
<!-- JNLP File for the NewWatch Applet -->
<jnlp codebase=”http://www.cadenhead.org/book/java21pro/java” href=”NewWatch.jnlp”>
    <information>
        <title>New Watch Applet</title>
        <vendor>Rogers Cadenhead</vendor>
        <homepage href=”http://www.java21pro.com”/>
        <description kind=”one-line”>An applet that displays the current time.</description>
        <offline-allowed/>
    </information>
    <resources>
        <j2se version=”1.2+”/>
        <jar href=”NewWatch.jar”/>
    </resources>
    <applet-desc name=”NewWatch applet” main-class=”NewWatch” documentBase=”http://www.cadenhead.org/book/java21pro” width=”345” height=”50”>
        <param name=”background” value=”#996633”>
    </applet-desc>
</jnlp>

通过以上步骤,我们可以将小程序转换为使用 Java Web Start 运行的形式,为用户提供更方便的使用体验。

总之,可访问性和 Java Web Start 技术为 Java 应用程序的开发和分发带来了新的可能性,使得软件更加易用和易于传播。开发者可以通过合理运用这些技术,提高软件的质量和用户满意度。

3. 可访问性与 Java Web Start 的综合应用及注意事项

在前面我们分别介绍了可访问性和 Java Web Start 技术,接下来我们深入探讨如何将这两者综合应用,以及在实际应用中需要注意的事项。

3.1 可访问性在 Java Web Start 应用中的体现

当使用 Java Web Start 来分发具有可访问性设计的应用程序时,可访问性的优势能够得到进一步的发挥。以 PageData 应用为例,它本身通过设置标签、助记符、工具提示等方式实现了良好的可访问性。当将其通过 Java Web Start 进行分发后,更多的用户可以方便地使用这个应用。

在 JNLP 文件中,虽然没有直接体现可访问性的相关代码,但应用程序本身的可访问性设计会随着程序的运行而展现出来。例如,用户使用屏幕阅读器等辅助技术时,能够清晰地获取到应用程序中各个组件的信息,如按钮的用途、文本字段的提示等。

3.2 综合应用的操作流程

以下是将具有可访问性的应用程序通过 Java Web Start 进行分发的详细操作流程:
1. 开发具有可访问性的应用程序
- 像 PageData 应用一样,使用 Swing 组件,为按钮设置助记符和工具提示,为文本字段关联标签。
- 确保应用程序的逻辑清晰,便于各种用户理解和操作。
2. 打包应用程序
- 使用 jar 命令将应用程序的类文件打包成 JAR 文件。例如:

jar -cf PageData.jar PageData.class
  1. 创建 JNLP 文件
    • 编写 JNLP 文件,指定应用程序的主类、JAR 文件、图标等信息。示例如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for the PageData Application -->
<jnlp codebase="http://www.cadenhead.org/book/java21pro/java" href="PageData.jnlp">
    <information>
        <title>PageData Application</title>
        <vendor>Rogers Cadenhead</vendor>
        <homepage href="http://www.java21pro.com"/>
        <icon href="pagedataicon.gif"/>
        <offline-allowed/>
    </information>
    <resources>
        <j2se version="1.4"/>
        <jar href="PageData.jar"/>
    </resources>
    <application-desc main-class="PageData"/>
</jnlp>
  1. 上传文件到服务器
    • 将 JAR 文件、图标文件和 JNLP 文件上传到 Web 服务器的指定文件夹。
  2. 配置服务器
    • 如果服务器不支持 Java Web Start,需要设置 MIME 类型。在 Apache 服务器中,在 mime.types .mime.types 文件中添加:
application/x-java-jnlp-file JNLP
  1. 测试应用程序
    • 使用浏览器通过完整的 Web 地址加载 JNLP 文件,测试应用程序是否能够正常运行。
3.3 注意事项

在综合应用可访问性和 Java Web Start 技术时,有以下几点需要注意:
- 界面布局问题 :Java Web Start 应用程序在某些情况下可能会出现界面布局问题。例如,在 Windows 系统中,可能需要适当增加应用程序的高度,以确保文本字段能够正常显示内容。
- 安全问题 :默认情况下,Java Web Start 应用程序的功能会受到一定的限制,除非用户给予权限。如果应用程序的 JAR 文件进行了数字签名,可以使用 security 元素来移除这些安全限制。
- 兼容性问题 :不同版本的 Java 解释器可能会对应用程序的运行产生影响。在 JNLP 文件中,需要明确指定应用程序所支持的 Java 版本。

4. 总结与展望

通过本次对可访问性和 Java Web Start 技术的学习,我们了解到这两项技术对于 Java 应用程序的重要性。可访问性使得软件能够被更广泛的用户使用,包括残障人士,提高了软件的社会价值。而 Java Web Start 技术则为应用程序的分发提供了一种便捷的方式,用户可以通过点击网页链接轻松下载和运行应用程序。

在未来的 Java 开发中,可访问性和 Java Web Start 技术有望得到更广泛的应用。随着互联网的发展,越来越多的应用程序将通过网络进行分发,Java Web Start 技术的优势将更加明显。同时,社会对软件可访问性的要求也会越来越高,开发者需要更加注重软件的可访问性设计。

为了更好地应用这两项技术,开发者可以不断学习和研究相关的知识,关注技术的发展动态。同时,多进行实践,将理论知识应用到实际项目中,提高自己的开发能力。

技术 优点 缺点 适用场景
可访问性 提高软件的可用性,服务更多用户 开发成本相对较高 面向大众的软件,特别是需要考虑残障人士使用的软件
Java Web Start 方便应用程序的分发和更新,用户无需复杂操作 需要服务器支持,存在一定的安全限制 通过网络分发的 Java 应用程序

mermaid 流程图如下:

graph LR
    A[开发具有可访问性的应用程序] --> B[打包应用程序]
    B --> C[创建 JNLP 文件]
    C --> D[上传文件到服务器]
    D --> E[配置服务器]
    E --> F[测试应用程序]

通过以上的学习和实践,我们可以更好地掌握可访问性和 Java Web Start 技术,为 Java 应用程序的开发和分发带来新的活力。

【四旋翼无人机】具备螺旋桨倾斜机构的全驱动四旋翼无人机:建模控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动四旋翼无人机展开研究,重点探讨其系统建模控制策略,结合Matlab代码Simulink仿真实现。文章详细分析了无人机的动力学模型,特别是引入螺旋桨倾斜机构后带来的全驱动特性,使其在姿态位置控制上具备更强的机动性自由度。研究涵盖了非线性系统建模、控制器设计(如PID、MPC、非线性控制等)、仿真验证及动态响应分析,旨在提升无人机在复杂环境下的稳定性和控制精度。同时,文中提供的Matlab/Simulink资源便于读者复现实验并进一步优化控制算法。; 适合人群:具备一定控制理论基础和Matlab/Simulink仿真经验的研究生、科研人员及无人机控制系统开发工程师,尤其适合从事飞行器建模先进控制算法研究的专业人员。; 使用场景及目标:①用于全驱动四旋翼无人机的动力学建模仿真平台搭建;②研究先进控制算法(如模型预测控制、非线性控制)在无人机系统中的应用;③支持科研论文复现、课程设计或毕业课题开发,推动无人机高机动控制技术的研究进展。; 阅读建议:建议读者结合文档提供的Matlab代码Simulink模型,逐步实现建模控制算法,重点关注坐标系定义、力矩分配逻辑及控制闭环的设计细节,同时可通过修改参数和添加扰动来验证系统的鲁棒性适应性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值