提交 37b3b559 编写于 作者: W wizardforcel

handler => 处理器

上级 273ebecf
......@@ -32,7 +32,7 @@
当您通过`"com.sun.jndi.ldap.connect.pool"`环境属性请求`Context`实例使用连接池时,可能会也可能不会合并使用的连接。默认规则是允许使用简单或不使用身份验证的普通(非 SSL)连接进行池化。您可以使用系统属性更改此默认值以包括 SSL 连接和 DIGEST-MD5 身份验证类型。要允许汇集普通和 SSL 连接,请将`“com.sun.jndi.ldap.connect.pool.protocol”`系统属性设置为字符串`“plain ssl”`。要允许共享匿名(无),简单和 DIGEST-MD5 身份验证类型的连接,请将 `com.sun.jndi.ldap.connect.pool.authentication` 系统属性设置为字符串`“没有简单的 DIGEST-MD5“`
有一些环境属性会自动取消 `Context` 实例使用池化连接的资格。 `Context` 实例如果将`“java.naming.ldap.factory.socket”`属性设置为自定义套接字工厂类或其`“,则不能使用池连接 java.naming.security.sasl.callback“`属性设置为自定义回调处理程序类,或其`”com.sun.jndi.ldap.trace.ber“`属性设置为启用协议跟踪。
有一些环境属性会自动取消 `Context` 实例使用池化连接的资格。 `Context` 实例如果将`“java.naming.ldap.factory.socket”`属性设置为自定义套接字工厂类或其`“,则不能使用池连接 java.naming.security.sasl.callback“`属性设置为自定义回调处理类,或其`”com.sun.jndi.ldap.trace.ber“`属性设置为启用协议跟踪。
## 如何连接连接
......
......@@ -138,7 +138,7 @@ Unmarshal Validate 示例演示了如何在解组期间启用验证。请注意
```
6. 默认验证事件处理程序处理验证错误,生成 `system.out` 的输出,然后抛出异常。
6. 默认验证事件处理处理验证错误,生成 `system.out` 的输出,然后抛出异常。
```
} catch( UnmarshalException ue ) {
......
......@@ -20,13 +20,13 @@
运行时系统在调用堆栈中搜索包含可处理异常的代码块的方法。这段代码称为 _ 异常处理程序 _。搜索从发生错误的方法开始,并按照调用方法的相反顺序继续通过调用堆栈。找到适当的处理程序后,运行时系统会将异常传递给处理程序。如果抛出的异常对象的类型与处理程序可以处理的类型匹配,则认为异常处理程序是合适的。
运行时系统在调用堆栈中搜索包含可处理异常的代码块的方法。这段代码称为 _ 异常处理器 _。搜索从发生错误的方法开始,并按照调用方法的相反顺序继续通过调用堆栈。找到适当的处理器后,运行时系统会将异常传递给处理器。如果抛出的异常对象的类型与处理器可以处理的类型匹配,则认为异常处理器是合适的。
选择的异常处理程序称 _ 捕获异常 _。如果运行时系统穷举搜索调用堆栈上的所有方法而没有找到适当的异常处理程序,如下图所示,则运行时系统(以及程序)终止。
选择的异常处理器称 _ 捕获异常 _。如果运行时系统穷举搜索调用堆栈上的所有方法而没有找到适当的异常处理器,如下图所示,则运行时系统(以及程序)终止。
![The call stack showing three method calls, where the first method called has the exception handler.](img/0d275d710fa7beac49efa736d9ad13f5.jpg)
在调用堆栈中搜索异常处理程序
在调用堆栈中搜索异常处理
......
......@@ -4,7 +4,7 @@
有效的 Java 编程语言代码必须遵守 _Catch 或 Specify Requirement_ 。这意味着可能抛出某些异常的代码必须包含以下任一项:
* 捕获异常的`try`语句。 `try`必须为异常提供处理程序,如[捕获和处理异常](handling.html)中所述。
* 捕获异常的`try`语句。 `try`必须为异常提供处理,如[捕获和处理异常](handling.html)中所述。
* 一种方法,指定它可以抛出异常。该方法必须提供列出异常的`throws`子句,如[中指定由方法](declaring.html)引发的异常中所述。
不符合 Catch 或 Specify Requirement 的代码将无法编译。
......
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html](https://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html)
本节描述如何使用三个异常处理程序组件 - `try``catch``finally`块 - 来编写异常处理程序。然后,解释了 Java SE 7 中引入的`try-` with-resources 语句。 `try-` with-resources 语句特别适合使用`Closeable`资源的情况,例如流。
本节描述如何使用三个异常处理器组件 - `try``catch``finally`块 - 来编写异常处理器。然后,解释了 Java SE 7 中引入的`try-` with-resources 语句。 `try-` with-resources 语句特别适合使用`Closeable`资源的情况,例如流。
本节的最后一部分将介绍一个示例,并分析各种场景中发生的情况。
......@@ -44,4 +44,4 @@ public class ListOfNumbers {
如果您尝试编译 [``ListOfNumbers``](examples/ListOfNumbers.java)类,编译器将打印有关`FileWriter`构造函数抛出的异常的错误消息。但是,它不会显示有关`get`引发的异常的错误消息。原因是构造函数`IOException`抛出的异常是一个经过检查的异常,而`get`方法`IndexOutOfBoundsException`抛出的异常是一个未经检查的异常。
现在您已熟悉`ListOfNumbers`类以及可以在其中抛出异常的位置,您已准备好编写异常处理程序来捕获和处理这些异常。
\ No newline at end of file
现在您已熟悉`ListOfNumbers`类以及可以在其中抛出异常的位置,您已准备好编写异常处理器来捕获和处理这些异常。
\ No newline at end of file
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html](https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html)
构造异常处理程序的第一步是封装可能在`try`块中引发异常的代码。通常,`try`块看起来如下所示:
构造异常处理的第一步是封装可能在`try`块中引发异常的代码。通常,`try`块看起来如下所示:
```
try {
......@@ -14,7 +14,7 @@ catch and finally blocks . . .
标记为 `_ 代码 _` 的示例中的段包含一个或多个可能引发异常的合法代码行。 (`catch``finally`块将在接下来的两个小节中介绍。)
要从`ListOfNumbers`类为`writeList`方法构造异常处理程序,请在`try`块中包含`writeList`方法的异常抛出语句。有不止一种方法可以做到这一点。您可以将可能引发异常的每行代码放在其自己的`try`块中,并为每个代码提供单独的异常处理程序。或者,您可以将所有`writeList`代码放在一个`try`块中,并将多个处理程序与其关联。以下列表对整个方法使用一个`try`块,因为所讨论的代码非常短。
要从`ListOfNumbers`类为`writeList`方法构造异常处理器,请在`try`块中包含`writeList`方法的异常抛出语句。有不止一种方法可以做到这一点。您可以将可能引发异常的每行代码放在其自己的`try`块中,并为每个代码提供单独的异常处理器。或者,您可以将所有`writeList`代码放在一个`try`块中,并将多个处理器与其关联。以下列表对整个方法使用一个`try`块,因为所讨论的代码非常短。
```
private List<Integer> list;
......@@ -34,4 +34,4 @@ public void writeList() {
```
如果`try`块中发生异常,则该异常由与之关联的异常处理程序处理。要将异常处理程序与`try`块关联,必须在其后放置一个`catch`块;下一节, [catch Blocks](catch.html) ,向您展示如何。
\ No newline at end of file
如果`try`块中发生异常,则该异常由与之关联的异常处理器处理。要将异常处理器与`try`块关联,必须在其后放置一个`catch`块;下一节, [catch Blocks](catch.html) ,向您展示如何。
\ No newline at end of file
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html](https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html)
通过在`try`块之后直接提供一个或多个`catch`块,可以将异常处理程序`try`块关联。在`try`块的末尾和第一个`catch`块的开头之间没有代码。
通过在`try`块之后直接提供一个或多个`catch`块,可以将异常处理`try`块关联。在`try`块的末尾和第一个`catch`块的开头之间没有代码。
```
try {
......@@ -15,11 +15,11 @@ try {
```
每个`catch`块都是一个异常处理程序,它处理由其参数指示的异常类型。参数类型 `_ExceptionType_`声明了处理程序可以处理的异常类型,并且必须是继承自`Throwable`类的类的名称。处理程序可以使用 `_ 名称 _` 引用异常。
每个`catch`块都是一个异常处理器,它处理由其参数指示的异常类型。参数类型 `_ExceptionType_`声明了处理器可以处理的异常类型,并且必须是继承自`Throwable`类的类的名称。处理器可以使用 `_ 名称 _` 引用异常。
`catch`块包含在调用异常处理程序时执行的代码。当处理程序是调用堆栈中的第一个处理程序时,运行时系统调用异常处理程序,其 `_ExceptionType_`与抛出的异常类型匹配。如果抛出的对象可以合法地分配给异常处理程序的参数,则系统认为它是匹配的。
`catch`块包含在调用异常处理器时执行的代码。当处理器是调用堆栈中的第一个处理器时,运行时系统调用异常处理器,其 `_ExceptionType_`与抛出的异常类型匹配。如果抛出的对象可以合法地分配给异常处理器的参数,则系统认为它是匹配的。
以下是`writeList`方法的两个异常处理程序
以下是`writeList`方法的两个异常处理
```
try {
......@@ -32,9 +32,9 @@ try {
```
异常处理程序不仅可以打印错误消息或停止程序。他们可以进行错误恢复,提示用户做出决定,或者使用链式异常将错误传播到更高级别的处理程序,如[链式异常](chained.html)部分所述。
异常处理器不仅可以打印错误消息或停止程序。他们可以进行错误恢复,提示用户做出决定,或者使用链式异常将错误传播到更高级别的处理器,如[链式异常](chained.html)部分所述。
## 使用一个异常处理程序捕获多种类型的异常
## 使用一个异常处理捕获多种类型的异常
在 Java SE 7 及更高版本中,单个`catch`块可以处理多种类型的异常。此功能可以减少代码重复并减少捕获过于宽泛的异常的诱惑。
......
......@@ -48,11 +48,11 @@ public void writeList() {
创建`FileWriter`的语句可能由于多种原因而失败。例如,如果程序无法创建或写入指示的文件,`FileWriter`的构造函数将抛出`IOException`
`FileWriter`抛出`IOException`时,运行系统立即停止执行`try`块;正在执行的方法调用未完成。然后,运行时系统开始在方法调用堆栈的顶部搜索适当的异常处理程序。在此示例中,当`IOException`发生时,`FileWriter`构造函数位于调用堆栈的顶部。但是,`FileWriter`构造函数没有适当的异常处理程序,因此运行时系统会在方法调用堆栈中检查下一个方法 - `writeList`方法。 `writeList`方法有两个异常处理程序:一个用于`IOException`,另一个用于`IndexOutOfBoundsException`
`FileWriter`抛出`IOException`时,运行系统立即停止执行`try`块;正在执行的方法调用未完成。然后,运行时系统开始在方法调用堆栈的顶部搜索适当的异常处理器。在此示例中,当`IOException`发生时,`FileWriter`构造函数位于调用堆栈的顶部。但是,`FileWriter`构造函数没有适当的异常处理器,因此运行时系统会在方法调用堆栈中检查下一个方法 - `writeList`方法。 `writeList`方法有两个异常处理器:一个用于`IOException`,另一个用于`IndexOutOfBoundsException`
运行时系统按照它们在`try`语句后出现的顺序检查`writeList`的处理程序。第一个异常处理程序的参数是`IndexOutOfBoundsException`。这与抛出的异常类型不匹配,因此运行时系统会检查下一个异常处理程序 - `IOException`。这与抛出的异常类型相匹配,因此运行时系统结束搜索适当的异常处理程序。现在运行时已找到适当的处理程序,执行该`catch`块中的代码。
运行时系统按照它们在`try`语句后出现的顺序检查`writeList`的处理器。第一个异常处理器的参数是`IndexOutOfBoundsException`。这与抛出的异常类型不匹配,因此运行时系统会检查下一个异常处理器 - `IOException`。这与抛出的异常类型相匹配,因此运行时系统结束搜索适当的异常处理器。现在运行时已找到适当的处理器,执行该`catch`块中的代码。
异常处理程序执行后,运行时系统将控制权传递给`finally`块。无论上面捕到的异常如何,`finally`块中的代码都会执行。在这种情况下,`FileWriter`从未打开过,不需要关闭。 `finally`块完成执行后,程序继续`finally`块后的第一个语句。
异常处理执行后,运行时系统将控制权传递给`finally`块。无论上面捕到的异常如何,`finally`块中的代码都会执行。在这种情况下,`FileWriter`从未打开过,不需要关闭。 `finally`块完成执行后,程序继续`finally`块后的第一个语句。
这是抛出`IOException`时出现的`ListOfNumbers`程序的完整输出。
......
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html](https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html)
上一节介绍了如何为`ListOfNumbers`类中的`writeList`方法编写异常处理程序。有时,代码可以捕获可能在其中发生的异常。但是,在其他情况下,最好让调用堆栈中的方法进一步处理异常。例如,如果您将`ListOfNumbers`类作为类包的一部分提供,则可能无法预测包的所有用户的需求。在这种情况下,最好 _ 而不是 _ 捕获异常并允许进一步调用堆栈的方法来处理它。
上一节介绍了如何为`ListOfNumbers`类中的`writeList`方法编写异常处理。有时,代码可以捕获可能在其中发生的异常。但是,在其他情况下,最好让调用堆栈中的方法进一步处理异常。例如,如果您将`ListOfNumbers`类作为类包的一部分提供,则可能无法预测包的所有用户的需求。在这种情况下,最好 _ 而不是 _ 捕获异常并允许进一步调用堆栈的方法来处理它。
如果`writeList`方法没有捕获可能在其中发生的已检查异常,则`writeList`方法必须指定它可以抛出这些异常。让我们修改原始的`writeList`方法来指定它可以抛出而不是捕获它们的异常。提醒您,这是无法编译的`writeList`方法的原始版本。
......
......@@ -27,11 +27,11 @@ try {
```
在此示例中,当捕获`IOException`时,会创建一个新的`SampleException`异常,并附加原始原因,并将异常链抛出到下一个更高级别的异常处理程序
在此示例中,当捕获`IOException`时,会创建一个新的`SampleException`异常,并附加原始原因,并将异常链抛出到下一个更高级别的异常处理
## 访问堆栈跟踪信息
现在让我们假设更高级别的异常处理程序想要以自己的格式转储堆栈跟踪。
现在让我们假设更高级别的异常处理想要以自己的格式转储堆栈跟踪。
* * *
......
......@@ -17,7 +17,7 @@
* **`firstObject()`** - 返回列表中的第一个对象。如果列表不包含任何对象,则抛出异常。
* **`indexOf(Object o)`** - 在列表中搜索指定的`Object`并返回其在列表中的位置。如果传递给方法的对象不在列表中,则抛出异常。
链表类可以抛出多个异常,并且能够通过一个异常处理程序捕获链表所引发的所有异常是很方便的。此外,如果您计划在包中分发链接列表,则应将所有相关代码打包在一起。因此,链表应该提供自己的一组异常类。
链表类可以抛出多个异常,并且能够通过一个异常处理捕获链表所引发的所有异常是很方便的。此外,如果您计划在包中分发链接列表,则应将所有相关代码打包在一起。因此,链表应该提供自己的一组异常类。
下一个图说明了链表引发的异常的一个可能的类层次结构。
......
......@@ -170,7 +170,7 @@ method3 throws exception {
因为在程序中抛出的所有异常都是对象,所以异常的分组或分类是类层次结构的自然结果。 Java 平台中一组相关异常类的示例是`java.io` - `IOException`及其后代中定义的那些。 `IOException`是最常用的,表示执行 I / O 时可能发生的任何类型的错误。它的后代表示更具体的错误。例如,`FileNotFoundException`表示文件无法位于磁盘上。
方法可以编写可以处理非常特定异常的特定处理程序。 `FileNotFoundException`类没有后代,因此以下处理程序只能处理一种类型的异常。
方法可以编写可以处理非常特定异常的特定处理器。 `FileNotFoundException`类没有后代,因此以下处理器只能处理一种类型的异常。
```
catch (FileNotFoundException e) {
......@@ -179,7 +179,7 @@ catch (FileNotFoundException e) {
```
方法可以通过在`catch`语句中指定任何异常的超类来基于其组或常规类型捕获异常。例如,要捕获所有 I / O 异常,无论其特定类型如何,异常处理程序都指定`IOException`参数。
方法可以通过在`catch`语句中指定任何异常的超类来基于其组或常规类型捕获异常。例如,要捕获所有 I / O 异常,无论其特定类型如何,异常处理都指定`IOException`参数。
```
catch (IOException e) {
......@@ -188,7 +188,7 @@ catch (IOException e) {
```
此处理程序将能够捕获所有 I / O 异常,包括`FileNotFoundException``EOFException`等。您可以通过查询传递给异常处理程序的参数来查找有关所发生情况的详细信息。例如,使用以下命令打印堆栈跟踪。
此处理器将能够捕获所有 I / O 异常,包括`FileNotFoundException``EOFException`等。您可以通过查询传递给异常处理器的参数来查找有关所发生情况的详细信息。例如,使用以下命令打印堆栈跟踪。
```
catch (IOException e) {
......@@ -200,7 +200,7 @@ catch (IOException e) {
```
你甚至可以设置一个异常处理程序来处理任何带有处理程序`Exception`
你甚至可以设置一个异常处理器来处理任何带有处理器`Exception`
```
// A (too) general exception handler
......@@ -210,8 +210,8 @@ catch (Exception e) {
```
`Exception`类靠近`Throwable`类层次结构的顶部。因此,除了处理程序要捕获的那些异常之外,此处理程序还将捕获许多其他异常。如果您希望程序执行所有操作,您可能希望以这种方式处理异常,例如,为用户打印出错误消息然后退出。
`Exception`类靠近`Throwable`类层次结构的顶部。因此,除了处理器要捕获的那些异常之外,此处理器还将捕获许多其他异常。如果您希望程序执行所有操作,您可能希望以这种方式处理异常,例如,为用户打印出错误消息然后退出。
但是,在大多数情况下,您希望异常处理程序尽可能具体。原因是处理程序必须做的第一件事是确定在确定最佳恢复策略之前发生了什么类型的异常。实际上,通过不捕获特定错误,处理程序必须适应任何可能性。过于笼统的异常处理程序可以通过捕获和处理程序员未预料到并且处理程序不是意图的异常来使代码更容易出错。
但是,在大多数情况下,您希望异常处理器尽可能具体。原因是处理器必须做的第一件事是确定在确定最佳恢复策略之前发生了什么类型的异常。实际上,通过不捕获特定错误,处理器必须适应任何可能性。过于笼统的异常处理器可以通过捕获和处理器员未预料到并且处理器不是意图的异常来使代码更容易出错。
如上所述,您可以创建异常组并以一般方式处理异常,或者您可以使用特定的异常类型来区分异常并以精确的方式处理异常。
\ No newline at end of file
......@@ -7,7 +7,7 @@
程序可以通过使用`try``catch``finally`块的组合来捕获异常。
* `try`块标识可能发生异常的代码块。
* `catch`块标识一个代码块,称为异常处理程序,可以处理特定类型的异常。
* `catch`块标识一个代码块,称为异常处理,可以处理特定类型的异常。
* `finally`块标识一个保证执行的代码块,并且是在`try`块中包含的代码之后关闭文件,恢复资源和清理的正确位置。
`try`语句应包含至少一个`catch`块或`finally`块,并且可能包含多个`catch`块。
......
......@@ -15,7 +15,7 @@
```
2. 以下处理程序可以捕获哪些异常类型?
2. 以下处理可以捕获哪些异常类型?
```
catch (Exception e) {
......@@ -24,8 +24,8 @@
```
使用这种类型的异常处理程序有什么问题?
3. 写入以下异常处理程序有什么问题吗?这段代码会编译吗?
使用这种类型的异常处理有什么问题?
3. 写入以下异常处理有什么问题吗?这段代码会编译吗?
```
try {
......
......@@ -18,7 +18,7 @@ Java 编程语言定义了以下几种变量:
* **实例变量(非静态字段)**从技术上讲,对象将它们各自的状态存储在“非静态字段”中,即没有`static`关键字声明的字段。非静态字段也称为 _ 实例变量 _,因为它们的值对于类的每个 _ 实例 _ 是唯一的(换句话说,对于每个对象);一辆自行车的`currentSpeed`独立于另一辆自行车的`currentSpeed`
* **类变量(静态字段)** _ 类变量 _ 是使用`static`修饰符声明的任何字段;这告诉编译器这个变量只有一个副本存在,无论该类被实例化多少次。定义特定种类自行车的齿轮数的字段可以标记为`static`,因为从概念上讲,相同数量的齿轮将适用于所有情况。代码`static int numGears = 6;`将创建这样的静态字段。此外,可以添加关键字`final`以指示齿轮的数量永远不会改变。
* **局部变量**类似于对象如何在字段中存储其状态,方法通常会将其临时状态存储在 _ 局部变量 _ 中。声明局部变量的语法类似于声明字段(例如,`int count = 0;`)。没有特殊的关键字将变量指定为本地变量;该决定完全来自声明变量的位置 - 它位于方法的开始和结束括号之间。因此,局部变量只对声明它们的方法可见;他们无法从班上其他人那里获得。
* **参数**您已经在`Bicycle`类和“Hello World!”的`main`方法中看到了参数示例。应用。回想一下`main`方法的签名是`public static void main(String[] args)`。这里,`args`变量是此方法的参数。要记住的重要一点是参数总是被分类为“变量”而不是“字段”。这也适用于其他参数接受构造(例如构造函数和异常处理程序),您将在本教程后面学习。
* **参数**您已经在`Bicycle`类和“Hello World!”的`main`方法中看到了参数示例。应用。回想一下`main`方法的签名是`public static void main(String[] args)`。这里,`args`变量是此方法的参数。要记住的重要一点是参数总是被分类为“变量”而不是“字段”。这也适用于其他参数接受构造(例如构造函数和异常处理),您将在本教程后面学习。
话虽如此,本教程的其余部分在讨论字段和变量时使用以下一般准则。如果我们谈论的是“一般的字段”(不包括局部变量和参数),我们可以简单地说“字段”。如果讨论适用于“以上所有”,我们可以简单地说“变量”。如果上下文要求区分,我们将酌情使用特定术语(静态字段,局部变量等)。您也可能偶尔会看到使用“成员”一词。类型的字段,方法和嵌套类型统称为 _ 成员 _。
......
# 使用事件处理程序处理初始化状态
# 使用事件处理处理初始化状态
> 原文: [https://docs.oracle.com/javase/tutorial/deployment/applet/appletStatus.html](https://docs.oracle.com/javase/tutorial/deployment/applet/appletStatus.html)
在初始化 applet 之前,applet 无法处理网页中 JavaScript 代码的请求。在 applet 的`init()`方法完成或 applet 首次从部署它的网页调用 JavaScript 代码之前,将阻止调用 applet 方法或从 JavaScript 代码访问 applet 变量。由于 JavaScript 实现在许多浏览器中都是单线程的,因此在 applet 启动期间可能会冻结网页。
从 JDK 7 发行版开始,您可以在加载时检查 applet 的`status`变量,以确定 applet 是否已准备好处理来自 JavaScript 代码的请求。您还可以注册在 applet 初始化的各个阶段自动调用的事件处理程序。要利用此功能,应在将`java_status_events`参数设置为`"true"`的情况下部署 applet。
从 JDK 7 发行版开始,您可以在加载时检查 applet 的`status`变量,以确定 applet 是否已准备好处理来自 JavaScript 代码的请求。您还可以注册在 applet 初始化的各个阶段自动调用的事件处理。要利用此功能,应在将`java_status_events`参数设置为`"true"`的情况下部署 applet。
在状态和事件处理程序示例中,JavaScript 代码使用 applet 注册`onLoad`处理程序。初始化 applet 时,Java Plug-in 软件会自动调用`onLoad`处理程序。 `onLoad`处理程序调用 applet 的其他方法在网页上绘制图形。 [``DrawingApplet`` ](examples/applet_StatusAndCallback/src/DrawingApplet.java)类的`init`方法休眠两秒钟以模拟长小程序初始化期。
在状态和事件处理器示例中,JavaScript 代码使用 applet 注册`onLoad`处理器。初始化 applet 时,Java Plug-in 软件会自动调用`onLoad`处理器。 `onLoad`处理器调用 applet 的其他方法在网页上绘制图形。 [``DrawingApplet`` ](examples/applet_StatusAndCallback/src/DrawingApplet.java)类的`init`方法休眠两秒钟以模拟长小程序初始化期。
以下步骤描述了如何注册事件处理程序和检查 applet 的状态。有关可以注册事件处理程序的 applet 状态值和 applet 事件的完整列表,请参阅 [Applet 状态和事件处理程序](https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/applet_dev_guide.html#JSDPG719)
以下步骤描述了如何注册事件处理器和检查 applet 的状态。有关可以注册事件处理器的 applet 状态值和 applet 事件的完整列表,请参阅 [Applet 状态和事件处理器](https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/applet_dev_guide.html#JSDPG719)
1. 创建一个 JavaScript 函数来注册事件处理程序。以下代码片段显示了`registerAppletStateHandler`函数,如果尚未加载 applet,则该函数会注册`onLoad`事件处理程序
1. 创建一个 JavaScript 函数来注册事件处理器。以下代码片段显示了`registerAppletStateHandler`函数,如果尚未加载 applet,则该函数会注册`onLoad`事件处理器
```
&lt; script&gt; &lt;! - ... - &gt; var READY = 2; function registerAppletStateHandler() {//如果 applet 已经//尚未加载,则注册 onLoad 处理程序 if(drawApplet.status&lt; READY){drawApplet.onLoad = onLoadHandler; } else if(drawApplet.status&gt; = READY){// applet 已经加载或者//是错误 document.getElementById(“mydiv”)。innerHTML =“Applet 事件处理程序未注册,因为 applet 状态为:”+ drawApplet.status; function onLoadHandler() {//就绪状态 document.getElementById(“mydiv”)的事件处理程序.innerHTML =“Applet 已加载”;画(); }&lt;! - ... - &gt; &LT; /脚本&GT;
&lt; script&gt; &lt;! - ... - &gt; var READY = 2; function registerAppletStateHandler() {//如果 applet 已经//尚未加载,则注册 onLoad 处理器 if(drawApplet.status&lt; READY){drawApplet.onLoad = onLoadHandler; } else if(drawApplet.status&gt; = READY){// applet 已经加载或者//是错误 document.getElementById(“mydiv”)。innerHTML =“Applet 事件处理器未注册,因为 applet 状态为:”+ drawApplet.status; function onLoadHandler() {//就绪状态 document.getElementById(“mydiv”)的事件处理器.innerHTML =“Applet 已加载”;画(); }&lt;! - ... - &gt; &LT; /脚本&GT;
```
2.`body`标签的 onload 方法中调用先前创建的`registerAppletStateHandler`功能。这确保了在注册 applet 的事件处理程序之前,已在网页的文档对象模型(DOM)树中创建了 applet 的 HTML 标记。
2.`body`标签的 onload 方法中调用先前创建的`registerAppletStateHandler`功能。这确保了在注册 applet 的事件处理之前,已在网页的文档对象模型(DOM)树中创建了 applet 的 HTML 标记。
```
&lt;body onload="registerAppletStateHandler()"&gt;
......@@ -29,7 +29,7 @@
&lt; script src =“https://www.java.com/js/deployJava.js"&gt;&lt;/script&gt; &LT;脚本&GT; //将 java_status_events 参数设置为 true var attributes = {id:'drawApplet',code:'DrawingApplet.class',archive:'applet_StatusAndCallback.jar',width:600,height:400}; var parameters = { java_status_events:'true',permissions:'sandbox'}; deployJava.runApplet(attributes,parameters,'1.7'); &LT; /脚本&GT;
```
在浏览器中打开 [``AppletPage.html``](examples/dist/applet_StatusAndCallback/AppletPage.html)以查看 applet 事件处理程序的行为。在 [``AppletPageUpdatedDuringLoading.html``](examples/dist/applet_StatusAndCallback/AppletPageUpdatedDuringLoading.html)页面中,检查 applet 的`status`变量以确定是否已加载 applet。根据状态,在加载 applet 时不断更新网页。
在浏览器中打开 [``AppletPage.html``](examples/dist/applet_StatusAndCallback/AppletPage.html)以查看 applet 事件处理的行为。在 [``AppletPageUpdatedDuringLoading.html``](examples/dist/applet_StatusAndCallback/AppletPageUpdatedDuringLoading.html)页面中,检查 applet 的`status`变量以确定是否已加载 applet。根据状态,在加载 applet 时不断更新网页。
* * *
......@@ -43,4 +43,4 @@
* * *
[下载 _ 状态和事件处理程序 _ 示例的源代码](examplesIndex.html#StatusEventHandler)以进一步试验。
\ No newline at end of file
[下载 _ 状态和事件处理器 _ 示例的源代码](examplesIndex.html#StatusEventHandler)以进一步试验。
\ No newline at end of file
......@@ -13,11 +13,11 @@
## 动态下载 HTTPS 证书
Java Web Start 会像浏览器一样动态导入证书。为此,Java Web Start 使用`java.protocol.handler.pkgs`系统属性设置自己的`https`处理程序,以初始化 [`SSLSocketFactory`](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLSocketFactory.html)[`HostnameVerifier`](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/HostnameVerifier.html) 的默认值。它使用方法 [`HttpsURLConnection.setDefaultSSLSocketFactory`](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/HttpsURLConnection.html#setDefaultSSLSocketFactory-javax.net.ssl.SSLSocketFactory-)[`HttpsURLConnection.setDefaultHostnameVerifier`](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/HttpsURLConnection.html#setDefaultHostnameVerifier-javax.net.ssl.HostnameVerifier-) 设置默认值。
Java Web Start 会像浏览器一样动态导入证书。为此,Java Web Start 使用`java.protocol.handler.pkgs`系统属性设置自己的`https`处理,以初始化 [`SSLSocketFactory`](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLSocketFactory.html)[`HostnameVerifier`](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/HostnameVerifier.html) 的默认值。它使用方法 [`HttpsURLConnection.setDefaultSSLSocketFactory`](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/HttpsURLConnection.html#setDefaultSSLSocketFactory-javax.net.ssl.SSLSocketFactory-)[`HttpsURLConnection.setDefaultHostnameVerifier`](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/HttpsURLConnection.html#setDefaultHostnameVerifier-javax.net.ssl.HostnameVerifier-) 设置默认值。
如果您的应用程序使用这两种方法,请确保在 Java Web Start 初始化`https`处理程序后调用它们,否则您的自定义处理程序将被 Java Web Start 默认处理程序替换。
如果您的应用程序使用这两种方法,请确保在 Java Web Start 初始化`https`处理器后调用它们,否则您的自定义处理器将被 Java Web Start 默认处理器替换。
您可以通过执行以下操作之一来确保使用您自己的自定义`SSLSocketFactory``HostnameVerifiter`
* 安装自己的`https`处理程序,以替换 Java Web Start `https`处理程序。
* 在您的应用程序中,仅在创建第一个`https URL`对象后调用`HttpsURLConnection.setDefaultSSLSocketFactory``HttpsURLConnection.setDefaultHostnameVerifier`,该对象首先执行 Java Web Start `https`处理程序初始化代码。
\ No newline at end of file
* 安装自己的`https`处理器,以替换 Java Web Start `https`处理器。
* 在您的应用程序中,仅在创建第一个`https URL`对象后调用`HttpsURLConnection.setDefaultSSLSocketFactory``HttpsURLConnection.setDefaultHostnameVerifier`,该对象首先执行 Java Web Start `https`处理器初始化代码。
\ No newline at end of file
......@@ -76,7 +76,7 @@
| 桌面 &lt;sup&gt;[父](#information)&lt;/sup&gt; | | 可用于指示 RIA 在用户桌面上放置快捷方式的偏好。 | 1.5.0 | |
| 菜单 &lt;sup&gt;[父](#information)&lt;/sup&gt; | | 可用于指示 RIA 将菜单项放在用户的开始菜单中的首选项。 | 1.5.0 | |
| | 子菜单 | 可用于指示 RIA 对放置菜单项的位置的偏好。 | 1.5.0 | |
| 关联 &lt;sup&gt;[亲本](#information)&lt;/sup&gt; | | 可用于向 JNLP 客户端提示 RIA 希望在操作系统中注册为某些扩展和某个 mime 类型的主要处理程序。如果包含此元素,则还必须包含 offline-allowed 元素,或者必须为 jnlp 元素设置 href 属性。 | 1.5.0 | |
| 关联 &lt;sup&gt;[亲本](#information)&lt;/sup&gt; | | 可用于向 JNLP 客户端提示 RIA 希望在操作系统中注册为某些扩展和某个 mime 类型的主要处理。如果包含此元素,则还必须包含 offline-allowed 元素,或者必须为 jnlp 元素设置 href 属性。 | 1.5.0 | |
| | 扩展 | RIA 请求注册处理的文件扩展名列表(以空格分隔)。 | 1.5.0 | |
| | MIME 类型 | RIA 要求它注册处理的 mime 类型。 | 1.5.0 | |
| 相关内容 &lt;sup&gt;[父](#information)&lt;/sup&gt; | | 另外一条可与 RIA 集成的相关内容。 | 1.5.0 | |
......
......@@ -22,7 +22,7 @@
[![trail icon](img/3ad2324f4cd442b2e4d15b73cdbe16a5.jpg) **拖放和数据传输**](./dnd/index.html) 告诉您在应用程序中实现数据传输需要了解的内容。
[![trail icon](img/3ad2324f4cd442b2e4d15b73cdbe16a5.jpg) **写作事件监听器**](./events/index.html) 告诉您如何处理程序中的事件。
[![trail icon](img/3ad2324f4cd442b2e4d15b73cdbe16a5.jpg) **写作事件监听器**](./events/index.html) 告诉您如何处理中的事件。
[![trail icon](img/3ad2324f4cd442b2e4d15b73cdbe16a5.jpg) **执行自定义绘画**](./painting/index.html) 为您提供有关绘制自己的 Swing 组件的信息。它讨论了特定于 Swing 组件的绘画问题,提供了绘画概念的概述,并提供了自己绘制的自定义组件的示例。
......
......@@ -145,7 +145,7 @@ public void propertyChange(PropertyChangeEvent evt) {
代码中的其他更改与字符串显示有关。显示字符串的进度条可能比没有显示字符串的进度条高,并且,作为演示设计者,我们已经任意决定此进度条仅在其处于默认的确定模式时才显示字符串。但是,我们希望避免在更改模式时进度条更改高度时可能导致的布局丑陋。因此,代码在`setStringPainted(true)`的调用中离开但添加了对`setString("")`的调用,因此不会显示任何文本。稍后,当进度条从不确定模式切换到确定模式时,调用`setString(null)`会使进度条显示其默认字符串。
我们做的一个改变 _ 而不是 _ make 正在从`progress`事件处理程序中删除对`progressBar.setValue`的调用。该调用不会造成任何伤害,因为不确定的进度条不使用其 value 属性,除非可能在状态字符串中显示它。事实上,尽可能保持进度条的数据是最新的,因为一些外观可能不支持不确定模式。
我们做的一个改变 _ 而不是 _ make 正在从`progress`事件处理中删除对`progressBar.setValue`的调用。该调用不会造成任何伤害,因为不确定的进度条不使用其 value 属性,除非可能在状态字符串中显示它。事实上,尽可能保持进度条的数据是最新的,因为一些外观可能不支持不确定模式。
* * *
......
......@@ -845,7 +845,7 @@ public class ColorEditor extends AbstractCellEditor
```
如您所见,代码非常简单。唯一有点棘手的部分是在编辑器按钮的动作处理程序末尾调用`fireEditingStopped`。如果没有此调用,编辑器将保持活动状态,即使模式对话框不再可见。对`fireEditingStopped`的调用使表知道它可以取消激活编辑器,让渲染器再次处理单元格。
如您所见,代码非常简单。唯一有点棘手的部分是在编辑器按钮的动作处理末尾调用`fireEditingStopped`。如果没有此调用,编辑器将保持活动状态,即使模式对话框不再可见。对`fireEditingStopped`的调用使表知道它可以取消激活编辑器,让渲染器再次处理单元格。
如果单元格的默认编辑器允许文本输入,则如果将单元格的类型指定为`String``Object`以外的其他类型,则会免费检查一些错误。错误检查是将输入的文本转换为适当类型的对象的副作用。
......
......@@ -158,8 +158,8 @@ public void valueChanged(TreeSelectionEvent e) {
上述代码执行以下任务:
* 获取树的默认 [`TreeSelectionModel`](https://docs.oracle.com/javase/8/docs/api/javax/swing/tree/TreeSelectionModel.html) ,然后将其设置为一次最多可以选择一个树节点。
* 在树上注册事件处理程序。事件处理程序是实现 [`TreeSelectionListener`](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionListener.html) 接口的对象。
* 在事件处理程序中,通过调用树的`getLastSelectedPathComponent`方法确定选择了哪个节点。
* 在树上注册事件处理器。事件处理器是实现 [`TreeSelectionListener`](https://docs.oracle.com/javase/8/docs/api/javax/swing/event/TreeSelectionListener.html) 接口的对象。
* 在事件处理中,通过调用树的`getLastSelectedPathComponent`方法确定选择了哪个节点。
* 使用`getUserObject`方法获取与节点关联的数据。
有关处理树选择事件的更多详细信息,请参见[如何编写树选择侦听器](../events/treeselectionlistener.html)
......@@ -302,7 +302,7 @@ class MyRenderer extends DefaultTreeCellRenderer {
您可能想知道单元格渲染器的工作原理。当树绘制每个节点时,`JTree`及其特定于外观的实现实际上都不包含绘制节点的代码。相反,树使用单元格渲染器的绘制代码来绘制节点。例如,要绘制具有字符串“The Java Programming Language”的叶节点,树会要求其单元格渲染器返回可以使用该字符串绘制叶节点的组件。如果单元格渲染器是`DefaultTreeCellRenderer`,则它返回一个标签,该标签绘制默认的叶子图标,后跟字符串。
单元格渲染器仅绘制;它无法处理事件。如果要将事件处理添加到树中,则需要在树上注册处理程序,或者,如果仅在选择节点时进行处理,则需要树的 _ 单元格编辑器 _。有关单元格编辑器的信息,请参阅[概念:编辑器和渲染器](table.html#editrender)。该部分讨论了表格单元格编辑器和渲染器,它们类似于树单元格编辑器和渲染器。
单元格渲染器仅绘制;它无法处理事件。如果要将事件处理添加到树中,则需要在树上注册处理,或者,如果仅在选择节点时进行处理,则需要树的 _ 单元格编辑器 _。有关单元格编辑器的信息,请参阅[概念:编辑器和渲染器](table.html#editrender)。该部分讨论了表格单元格编辑器和渲染器,它们类似于树单元格编辑器和渲染器。
下图显示了一个名为 DynamicTreeDemo 的应用程序,它允许您向可见树添加节点和从中删除节点。您还可以编辑每个节点中的文本。
......@@ -371,7 +371,7 @@ class MyTreeModelListener implements TreeModelListener {
```
以下是**添加**按钮的事件处理程序用于向树添加新节点的代码:
以下是**添加**按钮的事件处理用于向树添加新节点的代码:
```
treePanel.addObject("New Node " + newNodeSuffix++);
......
......@@ -18,7 +18,7 @@
![Converter screenshot in the Metal look and feel](img/94f6458d5ed6bedaf2e380fdf4430b56.jpg)
这个程序的重点是确保只有一个模型控制数据的价值。有多种方法可以实现这一目标;我们通过推迟到顶部滑块的模型来做到这一点。底部滑块的模型(称为`FollowerRangeModel`的自定义类的实例)将所有数据查询转发到顶部滑块的模型(称为`ConverterRangeModel`的自定义类的实例)。每个文本字段与其滑块保持同步,反之亦然,由侦听值变化的事件处理程序保持同步。注意确保顶部滑块的模型具有关于显示距离的最终说法。
这个程序的重点是确保只有一个模型控制数据的价值。有多种方法可以实现这一目标;我们通过推迟到顶部滑块的模型来做到这一点。底部滑块的模型(称为`FollowerRangeModel`的自定义类的实例)将所有数据查询转发到顶部滑块的模型(称为`ConverterRangeModel`的自定义类的实例)。每个文本字段与其滑块保持同步,反之亦然,由侦听值变化的事件处理保持同步。注意确保顶部滑块的模型具有关于显示距离的最终说法。
当我们开始实现自定义滑块模型时,我们首先查看[如何使用滑块](../components/slider.html)的 API 部分。它通知我们所有滑块数据模型必须实现`BoundedRangeModel`接口。 [`BoundedRangeModel` API 文档](https://docs.oracle.com/javase/8/docs/api/javax/swing/BoundedRangeModel.html)告诉我们该接口有一个名为`DefaultBoundedRangeModel`的实现类。 `DefaultBoundedRangeModel`[API 文档显示它是`BoundedRangeModel`的通用实现。](https://docs.oracle.com/javase/8/docs/api/javax/swing/DefaultBoundedRangeModel.html)
......
......@@ -242,7 +242,7 @@ public void installUI(JComponent c) {
```
进入`JLayer`子类的所有事件都将路由到名称与事件类型匹配的事件处理程序方法。例如,您可以通过覆盖相应的方法来响应鼠标和鼠标运动事件:
进入`JLayer`子类的所有事件都将路由到名称与事件类型匹配的事件处理方法。例如,您可以通过覆盖相应的方法来响应鼠标和鼠标运动事件:
```
protected void processMouseEvent(MouseEvent e, JLayer l) {
......
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/uiswing/dnd/transferhandler.html](https://docs.oracle.com/javase/tutorial/uiswing/dnd/transferhandler.html)
数据传输机制的核心是 [`TransferHandler`](https://docs.oracle.com/javase/8/docs/api/javax/swing/TransferHandler.html) 类。顾名思义,`TransferHandler`提供了一种简单的机制,用于与`JComponent`之间传输数据 - 所有细节都包含在此类及其支持类中。大多数组件都提供了默认的传输处理程序。您可以在任何组件上创建和安装自己的传输处理程序
数据传输机制的核心是 [`TransferHandler`](https://docs.oracle.com/javase/8/docs/api/javax/swing/TransferHandler.html) 类。顾名思义,`TransferHandler`提供了一种简单的机制,用于与`JComponent`之间传输数据 - 所有细节都包含在此类及其支持类中。大多数组件都提供了默认的传输处理器。您可以在任何组件上创建和安装自己的传输处理器
有三种方法用于在组件上使用`TransferHandler`
......@@ -10,7 +10,7 @@
* [`setDropMode(DropMode)`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JList.html#setDropMode-javax.swing.DropMode-) - 配置确定丢弃位置的方式。该方法定义为`JList``JTable``JTree`;该链接将您带到`JList`的文档。
* [`setTransferHandler(TransferHandler)`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JComponent.html#setTransferHandler-javax.swing.TransferHandler-) - 用于插入自定义数据导入和导出。此方法在`JComponent`上定义,因此它由每个 Swing 组件继承。
如前所述,默认的 Swing 传输处理程序(例如文本组件和颜色选择器使用的处理程序)提供了对数据导入和导出最有用的支持。但是,默认情况下,列表,表和树不支持删除。这样做的原因是没有通用的方法来处理这些组件的丢弃。例如,放在`JTree`的特定节点上意味着什么?它是替换节点,在其下面插入还是作为该节点的子节点插入?此外,我们不知道树后面的模型类型 - 它可能不是可变的。
如前所述,默认的 Swing 传输处理器(例如文本组件和颜色选择器使用的处理器)提供了对数据导入和导出最有用的支持。但是,默认情况下,列表,表和树不支持删除。这样做的原因是没有通用的方法来处理这些组件的丢弃。例如,放在`JTree`的特定节点上意味着什么?它是替换节点,在其下面插入还是作为该节点的子节点插入?此外,我们不知道树后面的模型类型 - 它可能不是可变的。
虽然 Swing 无法为这些组件提供默认实现,但是 drop 的框架就在那里。您只需提供管理实际数据导入的自定义`TransferHandler`
......
......@@ -23,4 +23,4 @@ DropLocation Methods for JList, JTree, JTable and JTextComponent
| | | [`getRow`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.DropLocation.html#getRow--) | |
| | | [`getColumn`](https://docs.oracle.com/javase/8/docs/api/javax/swing/JTable.DropLocation.html#getColumn--) | |
接下来是一个演示,它为列表组件实现自定义传输处理程序,以便它完全参与拖放操作。
\ No newline at end of file
接下来是一个演示,它为列表组件实现自定义传输处理器,以便它完全参与拖放操作。
\ No newline at end of file
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/uiswing/dnd/dropmodedemo.html](https://docs.oracle.com/javase/tutorial/uiswing/dnd/dropmodedemo.html)
现在我们将看一个使用自定义传输处理程序来实现列表组件的 drop 的演示。虽然列表的默认传输处理程序实现导出,因为我们正在创建自定义传输处理程序来实现导入,我们也必须重新实现导出。
现在我们将看一个使用自定义传输处理器来实现列表组件的 drop 的演示。虽然列表的默认传输处理器实现导出,因为我们正在创建自定义传输处理器来实现导入,我们也必须重新实现导出。
从屏幕截图中可以看出,`DropDemo`包含一个可编辑的文本区域,一个列表和一个组合框,允许您选择列表的放置模式。
......@@ -23,7 +23,7 @@
这是 [``ListTransferHandler``](../examples/dnd/DropDemoProject/src/dnd/ListTransferHandler.java)``DropDemo.java`` 的实现方案。
此列表的传输处理程序支持复制和移动,并且它重新实现默认情况下列表提供的拖动支持。
此列表的传输处理支持复制和移动,并且它重新实现默认情况下列表提供的拖动支持。
```
public class ListTransferHandler extends TransferHandler {
......
......@@ -18,7 +18,7 @@
3. 放下物品。它被插入到目标列表中,但不会从源中删除 - 根据需要。
4. 再次从源列表中拖动,但这次进入较低的目标列表。放下物品。它将插入目标列表并从源列表中删除。
5. 在源列表中选择另一个项目,并在按 Control 键指示 COPY 操作的首选项时,将项目拖动到下一个目标列表。
6. 将项目放入列表中。未插入项目 - 拒绝丢弃。传输处理程序`canImport`方法被编码为拒绝 COPY 操作,但它可以被实现为返回 true,在这种情况下,用户操作将占优势并且将发生复制。
6. 将项目放入列表中。未插入项目 - 拒绝丢弃。传输处理`canImport`方法被编码为拒绝 COPY 操作,但它可以被实现为返回 true,在这种情况下,用户操作将占优势并且将发生复制。
* * *
......
......@@ -4,11 +4,11 @@
到目前为止,我们主要专注于将`TransferHandler`附加到`JComponent`子类之一。但您也可以直接在顶级容器上设置`TransferHandler`,例如`JFrame``JDialog`
这对于导入文件的应用程序特别有用,例如编辑器,IDE,图像处理程序,CD 刻录程序。这种应用程序通常包括菜单,工具栏,用于编辑文档的区域,以及可能用于在打开的文档之间切换的列表或机制。
这对于导入文件的应用程序特别有用,例如编辑器,IDE,图像处理,CD 刻录程序。这种应用程序通常包括菜单,工具栏,用于编辑文档的区域,以及可能用于在打开的文档之间切换的列表或机制。
我们有这样的例子但是因为这个演示读取文件,我们不提供 Java Web Start 版本 - 你必须自己下载并编译演示。
正如您在下面的屏幕截图中看到的,`TopLevelTransferHandlerDemo`有一个菜单(空的,Demo 子菜单除外),一个(非功能性)工具栏,一个显示打开文档列表的区域(左侧),以及显示每个打开文档内容的区域(右侧)。启动时,蓝色文档区域已分配了一个支持文件导入的传输处理程序 - 因此是唯一可以接受删除的地方。
正如您在下面的屏幕截图中看到的,`TopLevelTransferHandlerDemo`有一个菜单(空的,Demo 子菜单除外),一个(非功能性)工具栏,一个显示打开文档列表的区域(左侧),以及显示每个打开文档内容的区域(右侧)。启动时,蓝色文档区域已分配了一个支持文件导入的传输处理 - 因此是唯一可以接受删除的地方。
![A snapshot of the TopLevelTransferHandlerDemo demo.](img/a65f2abf141191b7371fed7ce5a184a2.jpg)
......@@ -17,18 +17,18 @@
**Try this:** 
1. 编译并运行 [``TopLevelTransferHandlerDemo``](../examples/dnd/TopLevelTransferHandlerDemoProject/src/dnd/TopLevelTransferHandlerDemo.java)示例,如果要下载为 NetBeans 构建的 zip 文件,请查阅[示例索引](../examples/dnd/index.html#TopLevelTransferHandlerDemo)
2. 从原生桌面或文件系统中拖出文件,然后将其放在右侧的蓝色文档区域中。该文件将打开,并显示一个填充其内容的框架。文档区域`JDesktopPane`包含支持导入`javaFileListFlavor`的传输处理程序
3. 拖动另一个文件并尝试将其放在文档区域上。您会发现无法将其放在显示最后一个文件的框架顶部。您也不能将其放在列表,菜单或工具栏上。您可以删除的唯一位置是文档区域的蓝色部分或以前打开的框架的菜单栏上。在每个内容框架内部都有一个文本组件的传输处理程序,它不理解文件丢弃 - 您可以将文本拖放到该区域,但不能删除文件。
4. 从菜单中选择 Demo-&gt;使用 Top-Level TransferHandler 在顶级容器上安装传输处理程序 - `JFrame`
5. 尝试再次拖动演示。接受跌落的区域数量增加了。您现在可以删除应用程序上的大多数位置,包括菜单栏,工具栏,框架的标题栏,列表(左侧)或以前打开的文件的内容区域除外。 `JList`和文本区域的传输处理程序都不知道如何导入文件。
6. 通过从菜单中选择 Demo-&gt;从列表和文本中删除 TransferHandler,禁用这些剩余组件上的传输处理程序
2. 从原生桌面或文件系统中拖出文件,然后将其放在右侧的蓝色文档区域中。该文件将打开,并显示一个填充其内容的框架。文档区域`JDesktopPane`包含支持导入`javaFileListFlavor`的传输处理
3. 拖动另一个文件并尝试将其放在文档区域上。您会发现无法将其放在显示最后一个文件的框架顶部。您也不能将其放在列表,菜单或工具栏上。您可以删除的唯一位置是文档区域的蓝色部分或以前打开的框架的菜单栏上。在每个内容框架内部都有一个文本组件的传输处理,它不理解文件丢弃 - 您可以将文本拖放到该区域,但不能删除文件。
4. 从菜单中选择 Demo-&gt;使用 Top-Level TransferHandler 在顶级容器上安装传输处理 - `JFrame`
5. 尝试再次拖动演示。接受跌落的区域数量增加了。您现在可以删除应用程序上的大多数位置,包括菜单栏,工具栏,框架的标题栏,列表(左侧)或以前打开的文件的内容区域除外。 `JList`和文本区域的传输处理都不知道如何导入文件。
6. 通过从菜单中选择 Demo-&gt;从列表和文本中删除 TransferHandler,禁用这些剩余组件上的传输处理
7. 再次拖动演示。您现在可以在应用程序的任何位置删除文件 _!_
8. 从菜单中选择 Demo-&gt; Use COPY Action。
9. 再次拖动演示。请注意,鼠标光标现在显示 COPY 光标 - 这提供了更准确的反馈,因为成功的删除不会从源中删除文件。目标可以编程为从[选择放下动作](dropaction.html)中描述的可用放下动作中进行选择。
* * *
请注意禁用文本组件上的默认传输处理程序的一个不良副作用:您无法再在编辑区域内拖放(或剪切/复制/粘贴)文本。要解决此问题,您需要为接受文件丢弃的文本组件实现自定义传输处理程序,并重新实现缺少的文本传输支持。您可能想要观看 [RFE 4830695](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4830695) ,这将允许在现有`TransferHandler`之上添加数据导入。
请注意禁用文本组件上的默认传输处理器的一个不良副作用:您无法再在编辑区域内拖放(或剪切/复制/粘贴)文本。要解决此问题,您需要为接受文件丢弃的文本组件实现自定义传输处理器,并重新实现缺少的文本传输支持。您可能想要观看 [RFE 4830695](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4830695) ,这将允许在现有`TransferHandler`之上添加数据导入。
这是 [`TopLevelTransferHandlerDemo.java`](../examples/dnd/TopLevelTransferHandlerDemoProject/src/dnd/TopLevelTransferHandlerDemo.java) 的源代码:
......
......@@ -2,9 +2,9 @@
> 原文: [https://docs.oracle.com/javase/tutorial/uiswing/dnd/cutpaste.html](https://docs.oracle.com/javase/tutorial/uiswing/dnd/cutpaste.html)
到目前为止,我们的讨论主要围绕拖放支持。但是,将剪切或复制或粘贴(ccp)连接到传输处理程序是一件容易的事。这需要以下步骤:
到目前为止,我们的讨论主要围绕拖放支持。但是,将剪切或复制或粘贴(ccp)连接到传输处理是一件容易的事。这需要以下步骤:
* 确保在组件上安装了传输处理程序
* 确保在组件上安装了传输处理
* 创建一种可以调用`TransferHandler`的 ccp 支持的方式。通常,这涉及向输入和动作映射添加绑定,以响应特定的击键调用`TransferHandler`的 ccp 动作。
* 创建 ccp 菜单项和/或按钮。 (此步骤是可选的,但建议使用。)这对于文本组件很容易,但需要对其他组件进行更多的工作,因为您需要逻辑来确定触发操作的组件。有关详细信息,请参阅非文本组件中的 [CCP。](listpaste.html)
* 确定要执行粘贴的位置。也许高于或低于当前选择。在`importData`方法中安装逻辑。
......
......@@ -12,7 +12,7 @@
## [关于写作事件听众的一般信息](generalrules.html)
本节提供了有助于处理所有类型事件的信息。其中一个主题包括有关使用适配器和内部类来实现事件处理程序的信息。
本节提供了有助于处理所有类型事件的信息。其中一个主题包括有关使用适配器和内部类来实现事件处理的信息。
## [Swing Components 支持的监听器](eventsandcomponents.html)
......
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/uiswing/events/generalrules.html](https://docs.oracle.com/javase/tutorial/uiswing/events/generalrules.html)
本节讨论在应用程序中实现事件处理程序时要记住的几个设计注意事项。然后,我们向您介绍描述每个事件的事件对象小对象。特别是,我们讨论`EventObject`,它是所有 AWT 和 Swing 事件的超类。接下来,我们介绍低级事件和语义事件的概念,建议您在可能的情况下更喜欢语义事件。本节的其余部分讨论了您可能在某些事件侦听器中使用的实现技术,或者在由其他人或 GUI 构建器创建的事件侦听器中查看的实现技术。
本节讨论在应用程序中实现事件处理时要记住的几个设计注意事项。然后,我们向您介绍描述每个事件的事件对象小对象。特别是,我们讨论`EventObject`,它是所有 AWT 和 Swing 事件的超类。接下来,我们介绍低级事件和语义事件的概念,建议您在可能的情况下更喜欢语义事件。本节的其余部分讨论了您可能在某些事件侦听器中使用的实现技术,或者在由其他人或 GUI 构建器创建的事件侦听器中查看的实现技术。
* [设计注意事项](#design)
* [获取活动信息:活动对象](#eventobjects)
......
......@@ -2,20 +2,20 @@
> 原文: [https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html](https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html)
动作侦听器可能是最容易实现的 - 也是最常见的 - 事件处理程序。您可以实现一个动作侦听器来定义用户执行某些操作时应该执行的操作。
动作侦听器可能是最容易实现的 - 也是最常见的 - 事件处理。您可以实现一个动作侦听器来定义用户执行某些操作时应该执行的操作。
只要用户执行了某个操作,就会发生操作事件。示例:当用户单击[按钮](../components/button.html)时,选择[菜单项](../components/menu.html),在[文本字段](../components/textfield.html)中按 Enter 键。结果是`actionPerformed`消息被发送到在相关组件上注册的所有动作侦听器。
要编写动作侦听器,请按照以下步骤操作:
1. 声明一个事件处理程序类,并指定该类实现 ActionListener 接口或扩展实现 ActionListener 接口的类。例如:
1. 声明一个事件处理类,并指定该类实现 ActionListener 接口或扩展实现 ActionListener 接口的类。例如:
```
public class MyClass implements ActionListener {
```
2. 将事件处理程序类的实例注册为一个或多个组件上的侦听器。例如:
2. 将事件处理类的实例注册为一个或多个组件上的侦听器。例如:
```
someComponent.addActionListener(instanceOfMyClass);
......@@ -43,7 +43,7 @@ private int numClicks = 0;
```
在上面的示例中,事件处理程序类是 AL,它实现了 ActionListener。
在上面的示例中,事件处理类是 AL,它实现了 ActionListener。
我们想处理按钮单击事件,因此我们向按钮 b 添加一个动作侦听器,如下所示:
......@@ -53,7 +53,7 @@ b.addActionListener(this);
```
在上面的代码中,Button b 是一个组件,在该组件上注册了事件处理程序类 AL 的实例。
在上面的代码中,Button b 是一个组件,在该组件上注册了事件处理类 AL 的实例。
现在,我们要显示用户单击按钮的次数的文本。我们可以通过编写如下代码来完成此操作:
......
......@@ -56,7 +56,7 @@ public class MouseMotionEventDemo extends JPanel
```
SelectionDemo 示例绘制一个矩形,说明用户当前的拖动。要绘制矩形,应用程序必须为三种鼠标事件实现事件处理程序:鼠标按下,鼠标拖动和鼠标释放。要获知所有这些事件,处理程序必须同时实现`MouseListener``MouseMotionListener`接口,并注册为鼠标侦听器和鼠标移动侦听器。为了避免必须定义空方法,处理程序不直接实现任何一个侦听器接口。相反,它扩展了`MouseInputAdapter`,如下面的代码片段所示。
SelectionDemo 示例绘制一个矩形,说明用户当前的拖动。要绘制矩形,应用程序必须为三种鼠标事件实现事件处理器:鼠标按下,鼠标拖动和鼠标释放。要获知所有这些事件,处理器必须同时实现`MouseListener``MouseMotionListener`接口,并注册为鼠标侦听器和鼠标移动侦听器。为了避免必须定义空方法,处理器不直接实现任何一个侦听器接口。相反,它扩展了`MouseInputAdapter`,如下面的代码片段所示。
```
...//where initialization occurs:
......
......@@ -21,7 +21,7 @@ _tree-will-expand_ 侦听器可防止[树](../components/tree.html)节点扩展
4. 尝试展开另一个节点,但这次按对话框中的“取消扩展”按钮。
节点不扩展。文本区域中的消息告诉您发生了 tree-will-expand 事件,并且您取消了树扩展。
5. 折叠 **Potrero Hill** 节点。
节点在没有出现对话框的情况下折叠,因为事件处理程序`treeWillCollapse`方法允许崩溃发生,无争议。
节点在没有出现对话框的情况下折叠,因为事件处理`treeWillCollapse`方法允许崩溃发生,无争议。
* * *
......
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html](https://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html)
本节介绍如何实现三种与窗口相关的事件处理程序:`WindowListener``WindowFocusListener``WindowStateListener`。所有三个侦听器都处理`WindowEvent`对象。所有三个事件处理程序中的方法都是由 abstract `WindowAdapter`类实现的。
本节介绍如何实现三种与窗口相关的事件处理器:`WindowListener``WindowFocusListener``WindowStateListener`。所有三个侦听器都处理`WindowEvent`对象。所有三个事件处理器中的方法都是由 abstract `WindowAdapter`类实现的。
当在窗口(例如[](../components/frame.html)[对话框](../components/dialog.html))上注册了适当的侦听器时,窗口事件在窗口活动或状态发生后立即触发。如果此窗口接收键盘输入,则窗口被视为“焦点所有者”。
......@@ -31,7 +31,7 @@
窗口侦听器通常用于实现自定义窗口关闭行为。例如,窗口侦听器用于在关闭窗口之前保存数据,或在最后一个窗口关闭时退出程序。
用户不一定需要实现窗口侦听器来指定用户关闭窗口时应该执行的操作。默认情况下,当用户关闭窗口时,窗口变为不可见。要指定不同的行为,请使用`JFrame`或`JDialog`类的`setDefaultCloseOperation`方法。要实现窗口关闭处理程序,请使用`setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)`方法使窗口侦听器能够提供所有窗口关闭任务。有关如何使用`setDefaultCloseOperation`的详细信息,请参见[对窗口关闭事件](../components/frame.html#windowevents)的响应。
用户不一定需要实现窗口侦听器来指定用户关闭窗口时应该执行的操作。默认情况下,当用户关闭窗口时,窗口变为不可见。要指定不同的行为,请使用`JFrame`或`JDialog`类的`setDefaultCloseOperation`方法。要实现窗口关闭处理,请使用`setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)`方法使窗口侦听器能够提供所有窗口关闭任务。有关如何使用`setDefaultCloseOperation`的详细信息,请参见[对窗口关闭事件](../components/frame.html#windowevents)的响应。
When the last displayable window within the Java virtual machine (VM) is disposed of, the VM may terminate. Note, however, that there can be a delay before the program exits automatically, and that under some circumstances the program might keep running. It is quicker and safer to explicitly exit the program using `System.exit(int)`. See [AWT Threading Issues](https://docs.oracle.com/javase/8/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown) for more information.
......
......@@ -8,7 +8,7 @@
* 首先,确保您注册了正确的侦听器来检测事件。查看另一种侦听器是否可以检测到您需要的事件类型。
* 确保在正确的对象上注册了侦听器。
* 您是否正确实现了事件处理程序?例如,如果扩展了适配器类,请确保使用了正确的方法签名。确保每个事件处理方法都是`public void`,名称拼写正确并且参数的类型正确。
* 您是否正确实现了事件处理?例如,如果扩展了适配器类,请确保使用了正确的方法签名。确保每个事件处理方法都是`public void`,名称拼写正确并且参数的类型正确。
**问题:**我的组合框没有生成焦点事件等低级事件。
......
......@@ -102,11 +102,11 @@ class MyPanel extends JPanel {
```
此更改首先从`java.awt.event`包导入各种鼠标类,使应用程序能够响应用户的鼠标活动。已更新构造函数以注册鼠标按下和拖动的事件侦听器。每当收到`MouseEvent`时,它将被转发到`moveSquare`方法,该方法更新方块的坐标并以智能方式重新绘制组件。请注意,默认情况下,放置在这些事件处理程序中的任何代码都将在 Event Dispatch Thread 上执行。
此更改首先从`java.awt.event`包导入各种鼠标类,使应用程序能够响应用户的鼠标活动。已更新构造函数以注册鼠标按下和拖动的事件侦听器。每当收到`MouseEvent`时,它将被转发到`moveSquare`方法,该方法更新方块的坐标并以智能方式重新绘制组件。请注意,默认情况下,放置在这些事件处理中的任何代码都将在 Event Dispatch Thread 上执行。
但最重要的变化是`repaint`方法的调用。此方法由`java.awt.Component`定义,并且是允许您以编程方式重绘任何给定组件的表面的机制。它有一个无参数版本(重新绘制整个组件)和一个多参数版本(仅重新绘制指定区域。)此区域也称为 _ 剪辑 _。调用`repaint`的多 arg 版本需要一些额外的努力,但保证您的绘图代码不会浪费重新绘制未更改的屏幕区域的周期。
因为我们手动设置剪辑,所以我们的`moveSquare`方法不是一次调用重绘方法,而是调用两次。第一次调用告诉 Swing 重新绘制以前之前的方块 _ 所在的组件区域(继承的行为使用 UI 委托以当前背景颜色填充该区域。)第二次调用绘制了区域广场 _ 目前 _ 所在的组件。值得注意的一点是,尽管我们在同一个事件处理程序中连续两次调用了重绘,但 Swing 足够聪明,可以在一次绘制操作中获取该信息并重新绘制屏幕的这些部分。换句话说,Swing 不会连续两次重新绘制该组件,即使这是代码似乎正在执行的操作。_
因为我们手动设置剪辑,所以我们的`moveSquare`方法不是一次调用重绘方法,而是调用两次。第一次调用告诉 Swing 重新绘制以前之前的方块 _ 所在的组件区域(继承的行为使用 UI 委托以当前背景颜色填充该区域。)第二次调用绘制了区域广场 _ 目前 _ 所在的组件。值得注意的一点是,尽管我们在同一个事件处理中连续两次调用了重绘,但 Swing 足够聪明,可以在一次绘制操作中获取该信息并重新绘制屏幕的这些部分。换句话说,Swing 不会连续两次重新绘制该组件,即使这是代码似乎正在执行的操作。_
练习:
......
......@@ -6,6 +6,6 @@
* 通过调用组件的`repaint`方法完成程序重绘。 _ 不是 _ 直接调用`paintComponent`。调用`repaint`会使绘制子系统采取必要的步骤,以确保在适当的时间调用`paintComponent`方法。
* `repaint`的多参数版本允许您缩小组件的 _ 剪辑矩形 _(受绘画操作影响的屏幕部分),以便绘画变得更有效。我们在`moveSquare`方法中使用了这种技术,以避免重新绘制未更改的屏幕部分。此方法还有一个无参数版本,它将重新绘制组件的整个表面区域。
* 因为我们缩小了剪辑矩形,我们的`moveSquare`方法不会调用`repaint`一次,而是调用两次。第一次调用重新绘制以前之前的方块 _ 所在的组件区域(继承的行为是用当前背景颜色填充区域。)第二次调用绘制正方形组件的区域 _ 目前 _ 是。_
* 您可以在同一个事件处理程序中多次调用`repaint`,但 Swing 将获取该信息并在一次操作中重新绘制该组件。
* 您可以在同一个事件处理中多次调用`repaint`,但 Swing 将获取该信息并在一次操作中重新绘制该组件。
* 对于具有 UI 委托的组件,您应该将`Graphics`参数与行`super.paintComponent(g)`作为`paintComponent`覆盖中的第一行代码传递。如果不这样做,那么您的组件将负责手动绘制其背景。您可以通过注释掉该行并重新编译来查看背景不再被绘制来进行实验。
* 通过将我们的新代码分解为单独的`RedSquare`类,应用程序维护面向对象的设计,这使得`MyPanel`类的`paintComponent`方法不会混乱。绘画仍然有效,因为我们通过调用`paintSquare(Graphics g)`方法将`Graphics`对象传递到红色方块。请记住,此方法的名称是我们从头开始创建的名称;我们没有从 Swing API 中的任何地方覆盖`paintSquare`
\ No newline at end of file
......@@ -42,4 +42,4 @@ Set<String> s = new HashSet<String>(64);
```
`CopyOnWriteArraySet`是由写时复制阵列备份的`Set`实现。所有的变异操作,例如`add``set``remove`,都是通过制作数组的新副本来实现的;不需要锁定。甚至迭代也可以安全地与元素插入和删除同时进行。与大多数`Set`实现不同,`add``remove``contains`方法需要与集合大小成比例的时间。这种实现仅适用于适用于很少修改但经常迭代的集合。它非常适合维护必须防止重复的事件处理程序列表。
\ No newline at end of file
`CopyOnWriteArraySet`是由写时复制阵列备份的`Set`实现。所有的变异操作,例如`add``set``remove`,都是通过制作数组的新副本来实现的;不需要锁定。甚至迭代也可以安全地与元素插入和删除同时进行。与大多数`Set`实现不同,`add``remove``contains`方法需要与集合大小成比例的时间。这种实现仅适用于适用于很少修改但经常迭代的集合。它非常适合维护必须防止重复的事件处理器列表。
\ No newline at end of file
......@@ -14,7 +14,7 @@
## 专用列表实现
[`CopyOnWriteArrayList`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html) 是由写时复制阵列备份的`List`实现。该实现在本质上类似于`CopyOnWriteArraySet`。即使在迭代期间也不需要同步,并且保证迭代器永远不会抛出`ConcurrentModificationException`。此实现非常适合维护事件处理程序列表,其中更改很少发生,并且遍历频繁且可能耗时。
[`CopyOnWriteArrayList`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html) 是由写时复制阵列备份的`List`实现。该实现在本质上类似于`CopyOnWriteArraySet`。即使在迭代期间也不需要同步,并且保证迭代器永远不会抛出`ConcurrentModificationException`。此实现非常适合维护事件处理列表,其中更改很少发生,并且遍历频繁且可能耗时。
如果需要同步,`Vector`将比`Collections.synchronizedList`同步的`ArrayList`略快。但`Vector`有大量遗留操作,因此请务必使用`List`接口操作`Vector`,否则您将无法在以后更换实现。
......
......@@ -369,7 +369,7 @@ roster
有关聚合操作的更全面讨论,请参阅[聚合操作](../../collections/streams/index.html)课程。
要处理图形用户界面(GUI)应用程序中的事件(例如键盘操作,鼠标操作和滚动操作),通常会创建事件处理程序,这通常涉及实现特定接口。通常,事件处理程序接口是函数式接口;他们往往只有一种方法。
要处理图形用户界面(GUI)应用程序中的事件(例如键盘操作,鼠标操作和滚动操作),通常会创建事件处理器,这通常涉及实现特定接口。通常,事件处理器接口是函数式接口;他们往往只有一种方法。
在 JavaFX 示例 [`HelloWorld.java`](https://docs.oracle.com/javase/8/javafx/get-started-tutorial/hello_world.htm) (在上一节[匿名类](anonymousclasses.html)中讨论过)中,您可以在此语句中用 lambda 表达式替换突出显示的匿名类:
......
......@@ -194,7 +194,7 @@ table.setModel(myCoffeesTableModel);
方法`CoffeesFrame.getContentsOfCoffeesTable`检索表`COFFEES`的内容。
方法`CoffeesTableModel.addEventHandlersToRowSet``CoffeesFrame`类中定义的事件处理程序(方法`rowChanged`)添加到行集成员变量`CoffeesTableModel.coffeesRowSet`。这使得类`CoffeesFrame`能够通知任何事件的行集`coffeesRowSet`,特别是当用户单击按钮**将行添加到表****更新数据库****放弃更改**。当行集`coffeesRowSet`被通知其中一个变化时,调用方法`CoffeesFrame.rowChanged`
方法`CoffeesTableModel.addEventHandlersToRowSet``CoffeesFrame`类中定义的事件处理(方法`rowChanged`)添加到行集成员变量`CoffeesTableModel.coffeesRowSet`。这使得类`CoffeesFrame`能够通知任何事件的行集`coffeesRowSet`,特别是当用户单击按钮**将行添加到表****更新数据库****放弃更改**。当行集`coffeesRowSet`被通知其中一个变化时,调用方法`CoffeesFrame.rowChanged`
语句`table.setModel(myCoffeesTableModel)`指定它使用`CoffeesTableModel`对象`myCoffeesTableModel`填充`JTable` Swing 组件`table`
......
......@@ -27,7 +27,7 @@ public class Client {
## 创建通知侦听器
JMX 客户端需要一个通知处理程序,以侦听和处理可能由在 JMX 代理的 MBean 服务器中注册的 MBean 发送的任何通知。 JMX 客户端的通知处理程序[`NotificationListener`](https://docs.oracle.com/javase/8/docs/api/javax/management/NotificationListener.html) 接口的实例,如下所示。
JMX 客户端需要一个通知处理器,以侦听和处理可能由在 JMX 代理的 MBean 服务器中注册的 MBean 发送的任何通知。 JMX 客户端的通知处理器[`NotificationListener`](https://docs.oracle.com/javase/8/docs/api/javax/management/NotificationListener.html) 接口的实例,如下所示。
```
...
......
......@@ -18,11 +18,11 @@ SAX 解析 API 的基本概要如[图 1-1](#gcezl) 所示。要启动该过程
`SAXParser`
`SAXParser` 接口定义了几种 `parse()`方法。通常,您将 XML 数据源和 `DefaultHandler` 对象传递给解析器,解析器处理 XML 并调用处理程序对象中的相应方法。
`SAXParser` 接口定义了几种 `parse()`方法。通常,您将 XML 数据源和 `DefaultHandler` 对象传递给解析器,解析器处理 XML 并调用处理对象中的相应方法。
`SAXReader`
`SAXParser` 包装 `SAXReader` 。通常,你不关心这一点,但每隔一段时间你需要使用 `SAXParser``getXMLReader()`来掌握它,以便你可以配置它。 `SAXReader` 与您定义的 SAX 事件处理程序进行对话。
`SAXParser` 包装 `SAXReader` 。通常,你不关心这一点,但每隔一段时间你需要使用 `SAXParser``getXMLReader()`来掌握它,以便你可以配置它。 `SAXReader` 与您定义的 SAX 事件处理进行对话。
`DefaultHandler`
......@@ -34,7 +34,7 @@ SAX 解析 API 的基本概要如[图 1-1](#gcezl) 所示。要启动该过程
`ErrorHandler`
方法 `error()``fatalError()``warning()`被调用以响应各种解析错误。默认错误处理程序会抛出致命错误的异常并忽略其他错误(包括验证错误)。这是您需要了解 SAX 解析器的一个原因,即使您使用的是 DOM。有时,应用程序可能能够从验证错误中恢复。其他时候,可能需要生成异常。为确保正确处理,您需要为解析器提供自己的错误处理程序
方法 `error()``fatalError()``warning()`被调用以响应各种解析错误。默认错误处理器会抛出致命错误的异常并忽略其他错误(包括验证错误)。这是您需要了解 SAX 解析器的一个原因,即使您使用的是 DOM。有时,应用程序可能能够从验证错误中恢复。其他时候,可能需要生成异常。为确保正确处理,您需要为解析器提供自己的错误处理器
`DTDHandler`
......@@ -67,5 +67,5 @@ SAX 解析器在以下[表](#gceyy)中列出的包中定义。
| :-- | :-- |
| `org.xml.sax` | 定义 SAX 接口。名称 `org.xml` 是由定义 SAX API 的组确定的包前缀。 |
| `org.xml.sax.ext` | 定义用于执行更复杂的 SAX 处理的 SAX 扩展 - 例如,处理文档类型定义(DTD)或查看文件的详细语法。 |
| `org.xml.sax.helpers` | 包含可以更容易使用 SAX 的辅助类 - 例如,通过定义一个对所有接口都有 null 方法的默认处理程序,这样您只需要覆盖实际想要实现的那些。 |
| `org.xml.sax.helpers` | 包含可以更容易使用 SAX 的辅助类 - 例如,通过定义一个对所有接口都有 null 方法的默认处理,这样您只需要覆盖实际想要实现的那些。 |
| `javax.xml.parsers` | 定义 `SAXParserFactory` 类,它返回 `SAXParser` 。还定义了报告错误的异常类。 |
\ No newline at end of file
......@@ -10,7 +10,7 @@
`TransformerFactory` 对象被实例化并用于创建 `Transformer` 。源对象是转换过程的输入。可以从 SAX 读取器,DOM 或输入流创建源对象。
同样,结果对象是转换过程的结果。该对象可以是 SAX 事件处理程序,DOM 或输出流。
同样,结果对象是转换过程的结果。该对象可以是 SAX 事件处理,DOM 或输出流。
创建变换器时,可以从一组变换指令创建变换器,在这种情况下执行指定的变换。如果在没有任何特定指令的情况下创建它,则转换器对象只是将源复制到结果。
......@@ -27,5 +27,5 @@ XSLT API 在[表](#gcfbf)中显示的包中定义。
| :-- | :-- |
| `javax.xml.transform` | 定义 `TransformerFactory``Transformer` 类,用于获取能够进行转换的对象。创建变换器对象后,调用其 `transform()`方法,为其提供输入(源)和输出(结果)。 |
| `javax.xml.transform.dom` | 用于从 DOM 创建输入(源)和输出(结果)对象的类。 |
| `javax.xml.transform.sax` | 用于从 SAX 解析器创建输入(源)对象以及从 SAX 事件处理程序创建输出(结果)对象的类。 |
| `javax.xml.transform.sax` | 用于从 SAX 解析器创建输入(源)对象以及从 SAX 事件处理创建输出(结果)对象的类。 |
| `javax.xml.transform.stream` | 用于从 I / O 流创建输入(源)对象和输出(结果)对象的类。 |
\ No newline at end of file
......@@ -221,7 +221,7 @@ JAXP SAX API 还允许您使用 `ContentHandler.characters()`方法处理解
初始文本`本段包含`,由`&lt; bold&gt;的开头终止。` 元素。文本`重要`由结束标记终止,`&lt; / bold&gt;` ,以及最终文字,`的想法。` 由结束标记终止,`&lt; / para&gt;`
为了严格准确,字符处理程序应扫描&符号(&amp;)和左角括号字符(&lt;)并用字符串`&amp; amp;替换它们。` 或`&amp; lt;` ,视情况而定。这将在下一节中解释。
为了严格准确,字符处理应扫描&符号(&amp;)和左角括号字符(&lt;)并用字符串`&amp; amp;替换它们。` 或`&amp; lt;` ,视情况而定。这将在下一节中解释。
### 处理特殊字符
......@@ -278,11 +278,11 @@ xmlReader.parse(convertToFileURL(filename));
```
在这里,通过调用 `SAXParser` 实例的 `getXMLReader()`方法,为解析器获取 `XMLReader` 实例。然后 `XMLReader` 将 `SAXLocalNameCount` 类注册为其内容处理程序,以便解析器执行的操作将是 `startDocument()`,`的操作。 [处理内容事件](#gclnc)中显示的 startElement()`和 `endDocument()`方法。最后, `XMLReader` 以 `convertToFileURL 生成的 `File` URL 的形式告诉解析器通过传递相关 XML 文件的位置来解析哪个文档( )` [设置 I / O](#gcnsk) 中定义的方法。
在这里,通过调用 `SAXParser` 实例的 `getXMLReader()`方法,为解析器获取 `XMLReader` 实例。然后 `XMLReader` 将 `SAXLocalNameCount` 类注册为其内容处理,以便解析器执行的操作将是 `startDocument()`,`的操作。 [处理内容事件](#gclnc)中显示的 startElement()`和 `endDocument()`方法。最后, `XMLReader` 以 `convertToFileURL 生成的 `File` URL 的形式告诉解析器通过传递相关 XML 文件的位置来解析哪个文档( )` [设置 I / O](#gcnsk) 中定义的方法。
## 设置错误处理
您现在可以开始使用解析器,但实现一些错误处理会更安全。解析器可以生成三种错误:致命错误,错误和警告。发生致命错误时,解析器无法继续。因此,如果应用程序不生成异常,则默认的错误事件处理程序会生成一个异常。但是对于非致命错误和警告,默认错误处理程序永远不会生成异常,也不会显示任何消息。
您现在可以开始使用解析器,但实现一些错误处理会更安全。解析器可以生成三种错误:致命错误,错误和警告。发生致命错误时,解析器无法继续。因此,如果应用程序不生成异常,则默认的错误事件处理器会生成一个异常。但是对于非致命错误和警告,默认错误处理器永远不会生成异常,也不会显示任何消息。
如[文档事件](#gclmb)所示,应用程序的事件处理方法抛出 `SAXException` 。例如, `ContentHandler` 接口中 `startDocument()`方法的签名被定义为返回 `SAXException` 。
......@@ -334,7 +334,7 @@ private static class MyErrorHandler implements ErrorHandler {
```
以与[设置解析器](#gclmt)相同的方式,显示 `XMLReader` 指向正确的内容处理程序,这里 `XMLReader` 指向新的错误处理程序通过调用其 `setErrorHandler()`方法。
以与[设置解析器](#gclmt)相同的方式,显示 `XMLReader` 指向正确的内容处理器,这里 `XMLReader` 指向新的错误处理器通过调用其 `setErrorHandler()`方法。
`MyErrorHandler` 类实现标准 `org.xml.sax.ErrorHandler` 接口,并定义一种方法来获取由生成的任何 `SAXParseException` 实例提供的异常信息由解析器。这个方法, `getParseExceptionInfo()`,通过调用标准 `SAXParseException` 方法,只需获取 XML 文档中发生错误的行号和运行它的系统的标识符 `getLineNumber()`和 `getSystemId()`。然后将此异常信息反馈到基本 SAX 错误处理方法`错误()`,`警告()`和 `fatalError()`的实现中,这些实现更新为发送有关文档中错误的性质和位置的相应消息。
......
......@@ -26,7 +26,7 @@
当存在 DTD 时,解析器将不再在它知道不相关的空白区域上调用 `characters()`方法。从对仅处理 XML 数据感兴趣的应用程序的角度来看,这是一件好事,因为应用程序永远不会受到仅仅为了使 XML 文件可读而存在的空白空间的困扰。
另一方面,如果您正在编写一个过滤 XML 数据文件的应用程序,并且如果您想输出同样可读的文件版本,那么该空格将不再是无关紧要的:它将是必不可少的。要获取这些字符,您可以将 `ignorableWhitespace` 方法添加到您的应用程序中。要处理解析器看到的任何(通常)可忽略的空白区域,您需要添加类似以下代码的内容来实现 `ignorableWhitespace` 事件处理程序
另一方面,如果您正在编写一个过滤 XML 数据文件的应用程序,并且如果您想输出同样可读的文件版本,那么该空格将不再是无关紧要的:它将是必不可少的。要获取这些字符,您可以将 `ignorableWhitespace` 方法添加到您的应用程序中。要处理解析器看到的任何(通常)可忽略的空白区域,您需要添加类似以下代码的内容来实现 `ignorableWhitespace` 事件处理
`public void ignorableWhitespace (char buf[], int start, int length) throws SAXException { emit("IGNORABLE"); }`
......@@ -102,7 +102,7 @@ static public void main(String[] args) throws Exception {
要收到 XML 文档中验证错误的通知,必须将解析器工厂配置为创建验证解析器,如上一节所示。此外,必须满足以下条件:
* 必须在 SAX 解析器上设置适当的属性。
* 必须设置适当的错误处理程序
* 必须设置适当的错误处理
* 该文档必须与架构相关联。
## 设置 SAX 分析器属性
......@@ -230,7 +230,7 @@ public void fatalError(SAXParseException spe) throws SAXException {
```
如果不抛出这些异常,则忽略验证错误。通常,SAX 解析错误是验证错误,但如果文件指定解析器未准备处理的 XML 版本,也可以生成它。请记住,除非您提供错误处理程序(如此处的错误处理程序),否则您的应用程序不会生成验证异常
如果不抛出这些异常,则忽略验证错误。通常,SAX 解析错误是验证错误,但如果文件指定解析器未准备处理的 XML 版本,也可以生成它。请记住,除非您提供错误处理器(如此处的错误处理器),否则您的应用程序不会生成验证异常
## DTD 警告
......
......@@ -38,7 +38,7 @@
告知何时处理 DTD 并识别它。
要激活 Lexical Handler,您的应用程序必须扩展 `DefaultHandler` 并实现 `LexicalHandler` 接口。然后,您必须配置解析器委派给的 `XMLReader` 实例,并将其配置为将词法事件发送到词法处理程序,如下所示。
要激活 Lexical Handler,您的应用程序必须扩展 `DefaultHandler` 并实现 `LexicalHandler` 接口。然后,您必须配置解析器委派给的 `XMLReader` 实例,并将其配置为将词法事件发送到词法处理,如下所示。
```
// ...
......@@ -99,4 +99,4 @@ private void echoText() {
```
此代码将您的解析应用程序转换为词法处理程序。剩下要做的就是给这些新方法中的每一个执行一个动作。
\ No newline at end of file
此代码将您的解析应用程序转换为词法处理器。剩下要做的就是给这些新方法中的每一个执行一个动作。
\ No newline at end of file
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/jaxp/sax/using.html](https://docs.oracle.com/javase/tutorial/jaxp/sax/using.html)
本节介绍剩余的两个 SAX 事件处理程序`DTDHandler``EntityResolver` 。当 DTD 遇到未解析的实体或符号声明时,将调用 `DTDHandler` 。当必须将 URN(公共 ID)解析为 URL(系统 ID)时, `EntityResolver` 才会起作用。
本节介绍剩余的两个 SAX 事件处理`DTDHandler``EntityResolver` 。当 DTD 遇到未解析的实体或符号声明时,将调用 `DTDHandler` 。当必须将 URN(公共 ID)解析为 URL(系统 ID)时, `EntityResolver` 才会起作用。
## `DTDHandler` API
......
......@@ -138,7 +138,7 @@ private static class MyErrorHandler implements ErrorHandler {
```
如您所见, `DomEcho` 类的错误处理程序使用 `PrintWriter` 实例生成其输出。
如您所见, `DomEcho` 类的错误处理使用 `PrintWriter` 实例生成其输出。
### 实例化工厂
......@@ -237,7 +237,7 @@ public static void main(String[] args) throws Exception {
* * *
以下代码将文档构建器配置为使用[句柄错误](readingXML.html#gestm)中定义的错误处理程序
以下代码将文档构建器配置为使用[句柄错误](readingXML.html#gestm)中定义的错误处理
```
DocumentBuilder db = dbf.newDocumentBuilder();
......@@ -364,7 +364,7 @@ public class DOMEcho {
```
[句柄错误](readingXML.html#gestm)中定义的错误处理程序一样, `DOMEcho` 程序将其输出创建为 `PrintWriter` 实例。
[句柄错误](readingXML.html#gestm)中定义的错误处理一样, `DOMEcho` 程序将其输出创建为 `PrintWriter` 实例。
### 词汇控制
......
......@@ -8,7 +8,7 @@
要收到 XML 文档中验证错误的通知,必须满足以下条件:
* 必须配置工厂,并设置相应的错误处理程序
* 必须配置工厂,并设置相应的错误处理
* 该文档必须与至少一个模式相关联,甚至可能更多。
## 配置 `DocumentBuilder` Factory
......
......@@ -242,7 +242,7 @@ public class AddressBookReader02 implements XMLReader {
```
SAX `ContentHandler` 是获取解析器生成的 SAX 事件的对象。为了使应用程序进入 `XmlReader` ,应用程序定义了 `setContentHandler` 方法。处理程序变量将保存对 `setContentHandler` 被调用时发送的对象的引用。
SAX `ContentHandler` 是获取解析器生成的 SAX 事件的对象。为了使应用程序进入 `XmlReader` ,应用程序定义了 `setContentHandler` 方法。处理变量将保存对 `setContentHandler` 被调用时发送的对象的引用。
当解析器生成 SAX 元素事件时,它将需要提供命名空间和属性信息。因为这是一个简单的应用程序,所以它为这两个应用程序定义了空值。
......@@ -379,7 +379,7 @@ public ContentHandler getContentHandler() {
```
必须实现其他几种方法才能满足 `XmlReader` 接口。出于本练习的目的,将为所有这些方法生成 null 方法。但是,生产应用程序需要实现错误处理程序方法以生成更强大的应用程序。但是,对于此示例,以下代码为它们生成 null 方法:
必须实现其他几种方法才能满足 `XmlReader` 接口。出于本练习的目的,将为所有这些方法生成 null 方法。但是,生产应用程序需要实现错误处理方法以生成更强大的应用程序。但是,对于此示例,以下代码为它们生成 null 方法:
```
// Allow an application to register an error event handler.
......
......@@ -23,7 +23,7 @@ catch (IOException e) {
```
每次通过调用此 URL 的协议处理程序`openConnection`方法创建新的`URLConnection`对象。
每次通过调用此 URL 的协议处理`openConnection`方法创建新的`URLConnection`对象。
您并不总是需要显式调用`connect`方法来启动连接。如果需要,依赖于连接的操作(如`getInputStream``getOutputStream`等)将隐式执行连接。
......
......@@ -2,7 +2,7 @@
> 原文: [https://docs.oracle.com/javase/tutorial/networking/cookies/index.html](https://docs.oracle.com/javase/tutorial/networking/cookies/index.html)
虽然您可能已经熟悉了 cookie,但您可能不知道如何在 Java 应用程序中利用它们。本课程将指导您完成 Cookie 的概念,并说明如何设置 Cookie 处理程序,以便您的 HTTP URL 连接将使用它。
虽然您可能已经熟悉了 cookie,但您可能不知道如何在 Java 应用程序中利用它们。本课程将指导您完成 Cookie 的概念,并说明如何设置 Cookie 处理,以便您的 HTTP URL 连接将使用它。
Java SE 为此功能提供了一个主类, [`java.net.CookieHandler`](https://docs.oracle.com/javase/8/docs/api/java/net/CookieHandler.html) ,以及以下支持类和接口: [`java.net.CookieManager`](https://docs.oracle.com/javase/8/docs/api/java/net/CookieManager.html)[`java.net.CookiePolicy`](https://docs.oracle.com/javase/8/docs/api/java/net/CookiePolicy.html)[`java.net.CookieStore`](https://docs.oracle.com/javase/8/docs/api/java/net/CookieStore.html)[`java.net.HttpCookie`](https://docs.oracle.com/javase/8/docs/api/java/net/HttpCookie.html)
......@@ -12,11 +12,11 @@ Java SE 为此功能提供了一个主类, [`java.net.CookieHandler`](https://
## [CookieHandler 回调机制](cookiehandler.html)
此页面说明了访问网站时如何调用 cookie 处理程序以及如何设置 cookie 处理程序
此页面说明了访问网站时如何调用 cookie 处理器以及如何设置 cookie 处理器
## [默认 CookieManager](cookiemanager.html)
Java SE 提供了一个默认的 cookie 处理程序实现,在大多数情况下都足够并且可以高度自定义。
Java SE 提供了一个默认的 cookie 处理实现,在大多数情况下都足够并且可以高度自定义。
## [自定义 CookieManager](custom.html)
......
......@@ -2,12 +2,12 @@
> 原文: [https://docs.oracle.com/javase/tutorial/networking/cookies/cookiehandler.html](https://docs.oracle.com/javase/tutorial/networking/cookies/cookiehandler.html)
HTTP 状态管理通过 [`java.net.CookieHandler`](https://docs.oracle.com/javase/8/docs/api/java/net/CookieHandler.html) 类在 Java SE 中实现。 `CookieHandler`对象提供回调机制,以在 HTTP 协议处理程序中提供 HTTP 状态管理策略实现。也就是说,使用 HTTP 作为协议的 URL(例如,`new URL("http://example.com")`)将使用 HTTP 协议处理程序。此协议处理程序回调`CookieHandler`对象(如果已设置)以处理状态管理。
HTTP 状态管理通过 [`java.net.CookieHandler`](https://docs.oracle.com/javase/8/docs/api/java/net/CookieHandler.html) 类在 Java SE 中实现。 `CookieHandler`对象提供回调机制,以在 HTTP 协议处理器中提供 HTTP 状态管理策略实现。也就是说,使用 HTTP 作为协议的 URL(例如,`new URL("http://example.com")`)将使用 HTTP 协议处理器。此协议处理器回调`CookieHandler`对象(如果已设置)以处理状态管理。
`CookieHandler`类是一个抽象类,有两对相关方法。第一对`getDefault()``setDefault(cookieHandler)`是静态方法,使您能够发现已安装的当前处理程序并安装自己的处理程序
`CookieHandler`类是一个抽象类,有两对相关方法。第一对`getDefault()``setDefault(cookieHandler)`是静态方法,使您能够发现已安装的当前处理器并安装自己的处理器
没有安装默认处理程序,并且在系统范围内安装处理程序。对于在安全环境中运行的应用程序,即安装了安全管理器的应用程序,您必须具有获取和设置处理程序的特殊权限。有关更多信息,请参见 [`java.net.CookieHandler.getDefault`](https://docs.oracle.com/javase/8/docs/api/java/net/CookieHandler.html#getDefault--)
没有安装默认处理器,并且在系统范围内安装处理器。对于在安全环境中运行的应用程序,即安装了安全管理器的应用程序,您必须具有获取和设置处理器的特殊权限。有关更多信息,请参见 [`java.net.CookieHandler.getDefault`](https://docs.oracle.com/javase/8/docs/api/java/net/CookieHandler.html#getDefault--)
第二对相关方法`put(uri, responseHeaders)``get(uri, requestHeaders)`使您能够分别在响应/请求标头中为指定 URI 设置和获取 cookie 缓存中的所有适用 cookie。这些方法是抽象的,`CookieHandler`的具体实现必须提供实现。
Java Web Start 和 Java Plug-in 安装了默认的`CookieHandler`。但是,如果您正在运行独立应用程序并且想要启用 HTTP 状态管理,则必须设置系统范围的处理程序。本课程接下来的两页将向您展示如何操作。
\ No newline at end of file
Java Web Start 和 Java Plug-in 安装了默认的`CookieHandler`。但是,如果您正在运行独立应用程序并且想要启用 HTTP 状态管理,则必须设置系统范围的处理器。本课程接下来的两页将向您展示如何操作。
\ No newline at end of file
......@@ -12,7 +12,7 @@ java.net.CookieHandler.setDefault(cm);
```
第一行调用默认的`CookieManager`构造函数来创建实例。第二行调用`CookieHandler`的静态`setDefault`方法来设置系统范围的处理程序
第一行调用默认的`CookieManager`构造函数来创建实例。第二行调用`CookieHandler`的静态`setDefault`方法来设置系统范围的处理
默认的`CookieManager`构造函数使用默认的 cookie 存储和接受策略创建新的`CookieManager`实例。 `CookieStore`是存储任何已接受的 HTTP cookie 的位置。如果在创建时未指定,则`CookieManager`实例将使用内部内存实现。此实现不是持久性的,仅在 Java 虚拟机的生命周期内存在。需要持久存储的用户必须实现自己的商店。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册