Java 中文官方教程 2022 版(十一)(2)

简介: Java 中文官方教程 2022 版(十一)

Java 中文官方教程 2022 版(十一)(1)https://developer.aliyun.com/article/1486353

要运行此测试,请将?i)foo输入为正则表达式。这个错误是程序员在嵌入式标志表达式(?i)中忘记开括号的常见情况。这样做将产生以下结果:

Enter your regex: ?i)
There is a problem with the regular expression!
The pattern in question is: ?i)
The description is: Dangling meta character '?'
The message is: Dangling meta character '?' near index 0
?i)
^
The index is: 0

从这个输出中,我们可以看到语法错误是在索引 0 处的悬空元字符(问号)。缺少的开括号是罪魁祸首。

Unicode 支持

原文:docs.oracle.com/javase/tutorial/essential/regex/unicode.html

从 JDK 7 版本开始,正则表达式模式匹配已扩展功能以支持 Unicode 6.0。

  • 匹配特定代码点
  • Unicode 字符属性

匹配特定代码点

您可以使用形式为\uFFFF的转义序列匹配特定的 Unicode 代码点,其中FFFF是您想匹配的代码点的十六进制值。例如,\u6771匹配东方的汉字。

或者,您可以使用 Perl 风格的十六进制表示法指定一个代码点,\x{...}。例如:

String hexPattern = "\x{" + Integer.toHexString(codePoint) + "}";

Unicode 字符属性

每个 Unicode 字符除了其值之外,还具有某些属性或特性。您可以使用表达式\p{*prop*}匹配属于特定类别的单个字符。您可以使用表达式\P{*prop*}匹配属于特定类别的单个字符。

支持的属性类型有脚本、区块和“通用”类别。

脚本

要确定代码点是否属于特定脚本,您可以使用script关键字或sc的简写形式,例如,\p{script=Hiragana}。或者,您可以在脚本名称前加上字符串Is,例如\p{IsHiragana}

Pattern支持的有效脚本名称是UnicodeScript.forName接受的那些。

区块

可以使用block关键字或blk的简写形式指定一个区块,例如,\p{block=Mongolian}。或者,您可以在区块名称前加上字符串In,例如\p{InMongolian}

Pattern支持的有效区块名称是UnicodeBlock.forName接受的那些。

通用类别

类别可以用可选前缀Is指定。例如,IsL匹配 Unicode 字母的类别。类别也可以通过使用general_category关键字或简写形式gc来指定。例如,大写字母可以使用general_category=Lugc=Lu来匹配。

支持的类别是由Character类指定的Unicode 标准版本中的类别。

其他资源

原文:docs.oracle.com/javase/tutorial/essential/regex/resources.html

现在您已经完成了关于正则表达式的这节课,您可能会发现您的主要参考资料将是以下类的 API 文档:PatternMatcherPatternSyntaxException

对于正则表达式构造的行为更精确的描述,我们建议阅读 Jeffrey E. F. Friedl 的书籍精通正则表达式

问题和练习:正则表达式

原文:docs.oracle.com/javase/tutorial/essential/regex/QandE/questions.html

问题

  1. java.util.regex包中有哪三个公共类?描述每个类的目的。
  2. 考虑字符串字面值"foo"。起始索引是多少?结束索引是多少?解释这些数字的含义。
  3. 普通字符和元字符之间有什么区别?举例说明。
  4. 如何让一个元字符表现得像一个普通字符?
  5. 一组字符被方括号括起来叫什么?它的作用是什么?
  6. 这里有三个预定义的字符类:\d\s\w。描述每一个,并使用方括号重写它们。
  7. 对于每个\d\s\w,写出两个简单的表达式,匹配相反的字符集。
  8. 考虑正则表达式(dog){3}。识别两个子表达式。这个表达式匹配什么字符串?

练习

  1. 使用反向引用编写一个表达式,只有当一个人的名字和姓氏相同时才匹配该人的名字。

检查你的答案。

路径:部署

原文:docs.oracle.com/javase/tutorial/deployment/index.html

Java 富互联网应用程序(RIA)是具有类似桌面应用程序特征的应用程序,但是通过互联网部署。Java RIA 可以作为 Java 小程序或 Java Web Start 应用程序开发和部署。

  • 小程序 - Java 小程序在浏览器环境中运行。Java 插件软件控制 Java 小程序的执行和生命周期。
  • Java Web Start 应用程序 - Java Web Start 应用程序首次通过浏览器启动。随后可以通过桌面快捷方式启动。一旦下载了 Java Web Start 应用程序并且用户接受了其安全证书,它的行为几乎像一个独立的应用程序。

基于组件的架构用于富互联网应用程序

在过去,决定将 Java 富互联网应用程序作为小程序在浏览器内部部署,还是作为 Java Web Start 应用程序在浏览器外部部署,可能会显著影响应用程序的设计。有了最新的 Java 插件,这个决定变得简单多了。

传统上,应用程序在 main 方法中构建其用户界面,包括顶级 Frame。这种编程风格阻碍了应用程序在浏览器中的重新部署,因为它假定应用程序创建自己的 Frame。在浏览器中作为小程序运行时,小程序是应该容纳应用程序用户界面的顶级容器。不需要顶级 Frame

在设计 Java 富互联网应用程序时,请使用基于组件的架构。尝试将其功能组织成一个或多个可以组合在一起的组件。在这种情况下,“组件”一词指的是 AWT Component 类的子类、Swing JComponent 类或另一个子类的 GUI 元素。例如,您可以有一个顶级 JPanel,其中包含其他 UI 组件(如更多嵌套的 JPanels 和文本字段、组合框等)。通过这种设计,将核心功能部署为小程序或 Java Web Start 应用程序变得相对容易。

要部署为 Java 小程序,只需将核心功能封装在 AppletJApplet 中,并添加必要的浏览器特定功能。要部署为 Java Web Start 应用程序,请将功能封装在 JFrame 中。

选择 Java 小程序和 Java Web Start 应用程序之间

富互联网应用程序决策指南包含详细信息,帮助您决定将代码部署为 Java 小程序还是 Java Web Start 应用程序。

自包含应用程序替代方案

自包含应用程序提供了一种部署选项,不需要浏览器。用户在本地安装您的应用程序,并类似于本机应用程序运行它。自包含应用程序包括运行应用程序所需的 JRE,因此用户始终拥有正确的 JRE。

本教程讨论了 RIA 和自包含应用程序的开发和部署。请查看新功能,了解客户端 Java 运行时环境(JRE)软件各个版本引入的功能。

支持工具

课程:Java 小程序

原文:docs.oracle.com/javase/tutorial/deployment/applet/index.html

本课程讨论了 Java 小程序的基础知识,如何开发与环境交互丰富的小程序,以及如何部署小程序。

Java 小程序是一种特殊类型的 Java 程序,可以由启用了 Java 技术的浏览器从互联网上下载并运行。小程序通常嵌入在网页中,并在浏览器的上下文中运行。小程序必须是 java.applet.Applet 类的子类。Applet 类提供了小程序与浏览器环境之间的标准接口。

Swing 提供了 Applet 类的一个特殊子类,名为 javax.swing.JApplet。应该使用 JApplet 类来构建使用 Swing 组件构建其图形用户界面(GUI)的所有小程序。

浏览器的 Java 插件软件管理小程序的生命周期。

使用 Web 服务器来测试本课程中的示例。不建议使用本地小程序,当 Java 控制面板中的安全级别设置为高或非常高时,本地小程序将被阻止。


注意: 要运行小程序,请在 Microsoft Edge 上使用 IE 模式。请参阅Microsoft Edge + Internet Explorer mode: Getting Started guide



注意: 请确保您的客户端机器上至少安装了Java SE Development Kit (JDK) 6 update 10版本,然后再继续。您将需要此版本才能查看示例丰富的互联网应用程序并在不中断的情况下阅读后续章节。


开始使用小程序

原文:docs.oracle.com/javase/tutorial/deployment/applet/getStarted.html

接下来展示的 HelloWorld 小程序是一个显示字符串"Hello World"的 Java 类。

//


注意: 如果你看不到示例运行,可能需要在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。


以下是 HelloWorld 小程序的源代码:

import javax.swing.JApplet;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;
public class HelloWorld 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() {
                    JLabel lbl = new JLabel("Hello World");
                    add(lbl);
                }
            });
        } catch (Exception e) {
            System.err.println("createGUI didn't complete successfully");
        }
    }
}

这样的小程序通常由浏览器中的Java 插件软件管理和运行。

下载源代码以进一步进行实验。

定义一个小程序子类

原文:docs.oracle.com/javase/tutorial/deployment/applet/subclass.html

每个 Java 小程序都必须定义AppletJApplet类的子类。在 Hello World 小程序中,这个子类被称为HelloWorld。以下是HelloWorld类的源代码。

import javax.swing.JApplet;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;
public class HelloWorld 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() {
                    JLabel lbl = new JLabel("Hello World");
                    add(lbl);
                }
            });
        } catch (Exception e) {
            System.err.println("createGUI didn't complete successfully");
        }
    }
}

Java applets inherit significant functionality from the Applet or JApplet class, including the capabilities to communicate with the browser and present a graphical user interface (GUI) to the user.

一个将使用来自 Swing(Java 的 GUI 工具包)的 GUI 组件的小程序应该扩展javax.swing.JApplet基类,它提供了与 Swing 的 GUI 设施最佳集成。

JApplet提供了一个根窗格,它与 Swing 的JFrameJDialog组件具有相同的顶层组件结构,而Applet只提供了一个基本面板。有关如何使用此功能的更多详细信息,请参见如何使用根窗格。

一个小程序可以扩展java.applet.Applet类,当它不使用 Swing 的 GUI 组件时。

里程碑方法

原文:docs.oracle.com/javase/tutorial/deployment/applet/appletMethods.html

Applet类为小程序执行提供了一个框架,定义了系统在里程碑发生时调用的方法。里程碑是小程序生命周期中的重要事件。大多数小程序会覆盖其中一些或全部方法以适当地响应里程碑。

init 方法

init方法适用于不需要太长时间的一次性初始化。init方法通常包含通常放在构造函数中的代码。小程序通常没有构造函数的原因是在调用其init方法之前不能保证其具有完整的环境。保持init方法简短,以便您的小程序可以快速加载。

start 方法

每个在初始化后执行任务(除了直接响应用户操作)的小程序必须覆盖start方法。start方法启动小程序的执行。从start方法快速返回是一个良好的实践。如果需要执行计算密集型操作,最好为此目的启动一个新线程。

stop 方法

大多数覆盖start方法的小程序也应该覆盖stop方法。stop方法应该暂停小程序的执行,这样当用户不查看小程序页面时,它就不会占用系统资源。例如,显示动画的小程序在用户不查看时应该停止尝试绘制动画。

destroy 方法

许多小程序不需要覆盖destroy方法,因为它们的stop方法(在destroy之前调用)将执行关闭小程序执行所需的所有任务。但是,destroy方法适用于需要释放额外资源的小程序。


注意: 尽量保持destroy方法的实现尽可能简短,因为不能保证该方法会完全执行。在长destroy方法完成之前,Java 虚拟机可能会退出。


小程序的生命周期

原文:docs.oracle.com/javase/tutorial/deployment/applet/lifeCycle.html

小程序可以对以下重大事件做出反应:

  • 它可以初始化自身。
  • 它可以开始运行。
  • 它可以停止运行。
  • 它可以执行最终清理,为即将卸载做准备。

本节介绍了一个新的小程序Simple,它使用了所有这些方法。与 Java 应用程序不同,小程序不需要实现main方法。

这是Simple小程序。

//


注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。


以下是Simple小程序的源代码。该小程序在其生命周期中遇到重要里程碑时会显示描述性字符串,例如当用户首次访问包含小程序的页面时。

import java.applet.Applet;
import java.awt.Graphics;
//No need to extend JApplet, since we don't add any components;
//we just paint.
public class Simple extends Applet {
    StringBuffer buffer;
    public void init() {
        buffer = new StringBuffer();
        addItem("initializing... ");
    }
    public void start() {
        addItem("starting... ");
    }
    public void stop() {
        addItem("stopping... ");
    }
    public void destroy() {
        addItem("preparing for unloading...");
    }
    private void addItem(String newWord) {
        System.out.println(newWord);
        buffer.append(newWord);
        repaint();
    }
    public void paint(Graphics g) {
  //Draw a Rectangle around the applet's display area.
        g.drawRect(0, 0, 
       getWidth() - 1,
       getHeight() - 1);
  //Draw the current string inside the rectangle.
        g.drawString(buffer.toString(), 5, 15);
    }
}

注意: 在此示例中,Applet 类被扩展,而不是 Swing JApplet 类,因为 Swing 组件不需要添加到此小程序中。


加载小程序

由于小程序被加载,您应该看到文本“初始化…启动…”。小程序加载时,会发生以下情况:

  • 创建小程序控制类的一个实例(Applet子类)。
  • 小程序初始化自身。
  • 小程序开始运行。

离开并返回到小程序的页面

当用户离开页面,例如前往另一页时,浏览器会停止并销毁小程序。小程序的状态不会被保留。当用户返回页面时,浏览器会初始化并启动小程序的新实例。

重新加载小程序

当您刷新或重新加载浏览器页面时,当前小程序实例会被停止和销毁,并创建一个新实例。

退出浏览器

当用户退出浏览器时,小程序有机会在浏览器退出之前停止自身并执行最终清理。

下载源代码以进一步实验Simple 小程序示例。

Applet 的执行环境

原文:docs.oracle.com/javase/tutorial/deployment/applet/appletExecutionEnv.html

Java applet 在浏览器的上下文中运行。浏览器中的 Java 插件软件控制 Java applet 的启动和执行。浏览器还有一个 JavaScript 解释器,用于运行网页上的 JavaScript 代码。本主题描述了 Java 平台标准版 6 更新 10 中发布的 Java 插件软件的行为。

Java 插件

Java 插件软件为每个 Java applet 创建一个工作线程。它在 Java Runtime Environment (JRE)软件的一个实例中启动 applet。通常,所有 applet 在同一个 JRE 实例中运行。Java 插件软件在以下情况下启动新的 JRE 实例:

  • 当 applet 请求在特定版本的 JRE 中执行时。
  • 当 applet 指定自己的 JRE 启动参数时,例如堆大小。如果新 applet 的要求是现有 JRE 的子集,则新 applet 使用现有 JRE,否则启动新的 JRE 实例。

如果满足以下条件,applet 将在现有 JRE 中运行:

  • applet 所需的 JRE 版本与现有的 JRE 匹配。
  • JRE 的启动参数满足 applet 的要求。

以下图表显示了 applet 在 JRE 中的执行方式。

Java 插件和 JavaScript 解释器的交互

Java applet 可以调用网页中存在的 JavaScript 函数。JavaScript 函数也允许调用同一网页上嵌入的 applet 的方法。Java 插件软件和 JavaScript 解释器协调 Java 代码到 JavaScript 代码的调用以及 JavaScript 代码到 Java 代码的调用。

Java 插件软件是多线程的,而 JavaScript 解释器在单个线程上运行。因此,为了避免线程相关问题,特别是当多个 applet 同时运行时,请保持 Java 代码和 JavaScript 代码之间的调用简短,并尽量避免往返。查看以下主题以了解 Java 代码和 JavaScript 代码之间的交互更多信息:

  • 从 Applet 调用 JavaScript 代码
  • 从 JavaScript 代码调用 Applet 方法

开发 Applet

原文:docs.oracle.com/javase/tutorial/deployment/applet/developingApplet.html

使用基于组件的架构设计的应用程序可以开发为 Java applet。考虑具有基于 Swing 的图形用户界面(GUI)的 Java applet 的示例。通过组件化设计,GUI 可以使用更小的构建块或组件构建。以下是用于创建 applet GUI 的一般步骤:

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

以下部分通过使用动态树演示 applet 更详细地探讨这些步骤。如果您对 Swing 不熟悉,请参阅使用 Swing 创建 GUI 以了解更多关于使用 Swing GUI 组件的信息。

//


注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。


创建顶部JPanel

创建一个是JPanel子类的类。这个顶部JPanel充当所有其他 UI 组件的容器。在下面的示例中,DynamicTreePanel类是最顶层的JPanelDynamicTreePanel类的构造函数调用其他方法来正确创建和布局 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方法以实例化您的顶部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);        
    }        
}

Java 中文官方教程 2022 版(十一)(3)https://developer.aliyun.com/article/1486355

相关文章
|
1月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
3月前
|
Java 开发者 UED
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
60 3
|
21天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
21天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
21天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
7天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
10 0
|
30天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
73 2
|
1月前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
本系列教程笔记详细讲解了Kotlin语法,适合希望深入了解Kotlin的开发者。对于需要快速学习Kotlin的小伙伴,推荐查看“简洁”系列教程。本篇笔记重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android库开发建议以及相互调用时的注意事项。
25 3
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
22 3
下一篇
无影云桌面