Java 1.0 小程序编写与 Java 可访问性
1. Java 1.0 小程序编写
在 Java 1.0 中编写小程序时,有一些关键的操作和特性需要了解。
1.1 鼠标事件处理
在处理鼠标事件时,
mouseDown()
方法只能处理鼠标点击事件。如果用户点击鼠标并拖动到新位置,
mouseDown()
方法仅在点击的
(x, y)
位置被调用一次。而
mouseDrag()
方法则用于处理鼠标拖动事件,每次鼠标在按下按钮的情况下移动时,该方法都会被调用,因此可以用它来捕获鼠标拖动过程中的每个
(x, y)
位置。
1.2 绘图与重绘
当绘制新点时,
numPoints
会递增 1,然后调用
repaint()
方法,以便在绘制新点后将其显示出来。不过,调用
repaint()
并不保证运行小程序的 Java 解释器会调用
paint()
方法。实际上,调用
repaint()
只是请求重绘小程序,有时某些请求会被忽略。这种情况通常发生在解释器无法像请求到来那样快速重绘时,在 Java 1.0 中比在后续版本中更常见。
1.3 擦除按钮事件处理
小程序中通常包含一个
DrawPanel
对象、一个名为
erase
的按钮以及包含该按钮的面板。当点击
erase
按钮时,会生成一个动作事件。处理该事件的方法会确保生成事件的组件是
erase
按钮。如果是,则将
DrawPanel
对象的
numPoints
变量设置为 -1,这将清除面板上绘制的所有点,然后调用面板的
repaint()
方法,以便在没有任何点的情况下重新绘制面板。
1.4 Java 1.0 的特点
与更现代的 Java 版本相比,Java 1.0 非常简单。Java 1.0 类库中的类和接口数量不到 170 个,因此有可能熟悉所有这些类和接口,但即使是最有经验的程序员在 Java 2 中也很难做到这一点。Java 1.0 在图形用户界面设计方面的选择有限,大多数使用 Java 1.0 编写小程序的程序员会使用自己的界面组件以及其他程序员创建的组件,因为该语言存在一些不足。
1.5 资源推荐
当启动一个严肃的 Java 1.0 小程序编程项目时,最好从寻找其他人为自己项目设计的用户界面组件和其他类开始。网上有两个有价值的资源:Java Applet Ratings Service(http://www.jars.com)和 JavaWorld Magazine(http://www.javaworld.com)。
1.6 Q&A
- 问题 :我的 Java 小程序在 Internet Explorer 中运行正常,但在 Navigator 中崩溃。根据 Java 的“一次编写,到处运行”原则,它不应该在两个浏览器中都运行吗?
-
答案
:Java 1.0 程序员面临的一个现实问题是,Web 浏览器在其内置解释器中对 Java 语言的实现方式不同。存在一些 bug、用户界面不一致等问题,只能通过在尽可能广泛的浏览器和版本中进行测试来解决。一些小程序程序员采用的一种策略是先在 Netscape Navigator 3 和 4 版本中进行测试,因为这些浏览器中的 Java 解释器最有可能在成功运行小程序时遇到问题。另外,在 Java 1.0 中,永远不能仅仅依赖
appletviewer来测试小程序,因为它运行小程序的效果比任何浏览器解释器都要好,它完全支持 Java,并且不包含在浏览器中运行 Java 时遇到的任何主要 bug 或不一致性。
1.7 测验
| 问题 | 选项 | 答案 |
|---|---|---|
| 1. 在 Java 1.0 中,可以使用什么方法来确定小程序窗口的大小? |
a. getSize()
b. size() c. width() |
b. 在 Java 1.0 中使用
size()
方法,该方法在后续版本中被重命名为
getSize()
。
|
| 2. 在 Java 1.0 小程序中应该使用已弃用的方法吗? |
a. 不,因为它们已被更好的技术所取代。
b. 是的,因为在 Java 1.0 中别无选择。 c. 没关系,根本不能使用它们。 | b. 弃用警告适用于使用后续版本语言的人。一个只试图在小程序中使用 Java 1.0 的程序员别无选择,只能使用已弃用的方法,尽管有警告。 |
| 3. 可以使用哪个组件从 12 个项目的列表中选择 3 个项目? |
a. List
b. Choice c. TextArea |
a.
List
组件可以配置为允许选择多个项目。
|
1.8 认证练习
考虑以下代码:
public class Formula {
float xValue = 1.5;
int yValue = 3;
public Formula(Object input) {
Integer zValue = (Integer)input;
float result = (xValue * yValue) / zValue.intValue();
System.out.println(result);
}
public static void main(String[] arguments) {
Object app = new Formula(arguments[0]);
}
}
哪个代码行将阻止该程序成功编译?
a.
float xValue = 1.5;
b.
public Formula(Object input) {
c.
Integer zValue = (Integer)input;
d.
Object app = new Formula(arguments[0]);
答案可在相关网站获取。
1.9 练习
- 编写一个具有图形用户界面的 Java 1.0 小程序,用于收集用户的姓名、地址、城市、州和邮政编码。将州限制为某个地区的五个州,例如 “FL”、“GA”、“AL”、“SC” 和 “NC”。
-
将之前的
Expiration小程序转换为 Java 1.0 版本。
2. Java 可访问性
Java 中的可访问性特性使得程序能够与辅助技术(如盲文终端、屏幕阅读器和语音识别系统)协同工作,同时也为使用 Swing 图形用户界面的所有用户带来了好处。
2.1 可访问性的重要性
Java 可访问性类使得 Java 程序可以通过除鼠标和键盘之外的一系列输入设备进行控制,包括:
- 屏幕阅读器:使用语音合成器大声朗读屏幕内容。
- 屏幕放大镜:将显示器的显示区域放大至正常尺寸的 16 倍。
- 软件键盘:为无法在键盘上打字的人提供语音识别和单词预测功能。
一个使用可访问性类的 Java 程序不需要辅助设备也能正常运行,但它为有需要的人提供了额外的功能。这些功能使得在桌面环境之外进行计算成为可能,这在 Java 被应用于嵌入式设备(如个人信息管理器和信息亭)时变得越来越重要。此外,一些可访问性特性对所有用户都有益,例如汽车仪表盘计算机可以使用可访问性类来接收驾驶员请求交通咨询的语音输入。
2.2 可访问性类的组成
Java 可访问性涵盖三个不同的领域:
-
javax.accessibility
包:用于定义 Java 界面组件与辅助设备的通信方式。当使用标准用户界面组件时,无需直接使用可访问性类,因为 Swing 组件已经实现了这些功能。但在创建新的用户界面组件时,需要使用该包来使组件具有可访问性。
- Swing 类中提供可访问性功能的方法。
- 一组可供辅助技术提供商使用的可访问性实用工具。
javax.accessibility
包中的主要类是
Accessible
接口,用户界面组件必须实现该接口才能与辅助设备兼容。该接口有一个方法
getAccessibleContext()
,它返回一个
AccessibleContext
对象。
AccessibleContext
类描述了可访问对象向其他类提供的必要信息,包括对象的名称、用途描述、在界面中扮演的角色以及当前状态。
2.3 访问 Swing 组件
以一个使用
JComboBox
组件的 Java 应用程序为例,该组件用于从六个职业选择中选择一个职业。该组件具有一些内置的可访问性支持,例如可以切换下拉框的弹出状态。如果下拉框已弹出,则可以看到六个选择的列表;如果未弹出,则只能看到当前选择。
以下是
Combo.java
的完整代码:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.accessibility.*;
public class Combo extends JFrame {
JComboBox job = new JComboBox();
public Combo() {
super("Combo");
setSize(160, 190);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = getContentPane();
FlowLayout flo = new FlowLayout();
job.addItem("Butcher");
job.addItem("Baker");
job.addItem("Candlestick maker");
job.addItem("Fletcher");
job.addItem("Fighter");
job.addItem("Technical writer");
job.setEditable(true);
AccessibleContext ac = job.getAccessibleContext();
ac.setAccessibleDescription(
"Select a profession from a combo box.");
ac.setAccessibleName("Profession");
pane.setLayout(flo);
pane.add(job);
setContentPane(pane);
setVisible(true);
ComboSpy spy = new ComboSpy(job);
}
public static void main(String[] arguments) {
Combo app = new Combo();
}
}
为了测试该应用程序,还需要一个
ComboSpy
类,以下是
ComboSpy.java
的完整代码:
import java.awt.*;
import javax.swing.*;
import javax.accessibility.*;
public class ComboSpy implements Runnable {
Thread runner;
JComboBox profession;
ComboSpy(JComboBox pro) {
profession = pro;
if (runner == null) {
runner = new Thread(this);
runner.start();
}
}
public void run() {
AccessibleContext ac =
profession.getAccessibleContext();
System.out.println("\nName: " +
ac.getAccessibleName());
System.out.println("Description: " +
ac.getAccessibleDescription());
System.out.println("Role: " +
ac.getAccessibleRole());
while (runner != null) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) { }
AccessibleAction aa =
ac.getAccessibleAction();
int count = aa.getAccessibleActionCount();
for (int i = 0; i < count; i++)
System.out.println("ActionDescription: " +
aa.getAccessibleActionDescription(i));
try {
aa.doAccessibleAction(0);
} catch (IllegalComponentStateException e) { }
}
}
}
要测试
Combo
应用程序,编译
ComboSpy
并在命令行中输入:
java Combo
ComboSpy
类实现了
Runnable
接口,并在自己的线程中运行。它创建了一个与
Combo
应用程序的组合框相关联的
AccessibleContext
对象,该对象包含了组件的所有可访问信息。组合框的名称和描述可以通过
AccessibleContext
类的
getAccessibleName()
和
getAccessibleDescription()
方法作为字符串获取。Swing 组合框还支持
AccessibleAction
接口,用于确定组合框操作时可以执行的动作。通过
getAccessibleActionCount()
方法可以确定与可访问组件关联的动作数量,通过
getAccessibleActionDescription(int)
方法可以确定每个动作的文本描述。还可以使用
doAccessibleAction(int)
方法来控制用户界面组件。
2.4 使用可访问性特性
除了上述的基本可访问性支持外,还可以通过以下方法使程序更具可访问性:
-
使用工具提示(ToolTips)
:当鼠标在组件上悬停片刻时,会显示描述组件用途的文本。可以通过调用组件的
setToolTipText(String)
方法来设置工具提示,例如:
JScrollBar speed = new JScrollBar();
speed.setToolTipText("Move to set animation speed");
-
使用键盘助记符(Keyboard Mnemonics)
:也称为快捷键或加速键,是一种可以用来控制用户界面组件的键盘序列。在 Windows 95 及更高版本的计算机上,通过按住
Alt键与另一个键组合来使用键盘助记符。可以通过调用组件的setMnemonic(char)方法来设置键盘助记符,例如:
JButton infoButton = new JButton("Information");
infoButton.setMnemonic('i');
-
关联标签与组件
:对于一些用途不太明显的组件,如
JTextField或JTextArea,通常需要一个文本或图像标签来标识其用途。可以使用组件的setLabelFor(object)方法来建立标签与组件之间的关系,这样标签的键盘助记符也可以作用于它所标识的组件。 -
提供辅助文本描述
:如果组件由
ImageIcon对象而不是文本标签标识,可以使用组件的setDescription()方法提供辅助文本描述。 -
使用容器分组组件
:可以使用容器将逻辑上相关的组件分组在一起,例如将用于启动、停止和暂停动画小程序的三个按钮放在同一个
JPanel容器中。
通过这些方法,可以使 Java 程序更易于所有用户使用,无论是有特殊需求的用户还是普通用户。
下面是一个简单的 mermaid 流程图,展示了 Java 可访问性的主要流程:
graph LR
A[Java 程序] --> B[可访问性类]
B --> C[javax.accessibility 包]
B --> D[Swing 类方法]
B --> E[可访问性实用工具]
C --> F[Accessible 接口]
F --> G[getAccessibleContext()]
G --> H[AccessibleContext 对象]
H --> I[名称、描述、角色、状态]
A --> J[用户界面组件]
J --> K[支持可访问性]
K --> L[工具提示、键盘助记符等]
综上所述,Java 1.0 小程序编写有其独特的特点和注意事项,而 Java 的可访问性特性则为程序的用户体验提供了更多的可能性和包容性。通过合理运用这些知识,可以编写出功能强大且易于使用的 Java 程序。
2.5 键盘助记符的具体应用与效果
键盘助记符在 Java 程序的用户交互中扮演着重要角色,它能让用户更便捷地操作界面组件。在 Windows 95 及以上系统中,使用键盘助记符时,需按住
Alt
键并结合另一个键。下面详细介绍其设置和效果。
设置键盘助记符的步骤如下:
1. 创建需要设置助记符的组件,如
JButton
。
2. 调用组件的
setMnemonic(char)
方法,将作为助记符的字符传入。
示例代码如下:
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.FlowLayout;
public class MnemonicExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Mnemonic Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JButton infoButton = new JButton("Information");
infoButton.setMnemonic('i');
frame.add(infoButton);
frame.setVisible(true);
}
}
在上述代码中,创建了一个名为
infoButton
的按钮,并将字符
'i'
设置为其键盘助记符。当用户在 Windows 系统中按下
Alt + I
时,就相当于鼠标点击了该按钮。
当为带有文本标签的组件设置键盘助记符时,应尽量选择标签中的字符。这样,在界面上该字符会被下划线标记,提示用户该字符为助记符。例如,在上述示例中,按钮标签 “Information” 中的
i
会被下划线标记。
以下是一个简单的表格,总结键盘助记符的相关信息:
| 操作 | 方法 | 示例 |
| ---- | ---- | ---- |
| 设置键盘助记符 |
setMnemonic(char)
|
infoButton.setMnemonic('i');
|
| 适用系统 | Windows 95 及以上 | - |
| 显示效果 | 标签中助记符字符下划线标记 | - |
2.6 工具提示的使用要点
工具提示是提升程序用户友好性的重要手段,它能在用户初次使用程序时提供有用的信息。设置工具提示的步骤如下:
1. 创建需要设置工具提示的组件,如
JScrollBar
。
2. 调用组件的
setToolTipText(String)
方法,传入描述组件用途的文本。
示例代码如下:
import javax.swing.JFrame;
import javax.swing.JScrollBar;
import java.awt.FlowLayout;
public class ToolTipExample {
public static void main(String[] args) {
JFrame frame = new JFrame("ToolTip Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JScrollBar speed = new JScrollBar();
speed.setToolTipText("Move to set animation speed");
frame.add(speed);
frame.setVisible(true);
}
}
在上述代码中,为
JScrollBar
组件
speed
设置了工具提示,当鼠标在该滚动条上悬停片刻时,会显示 “Move to set animation speed” 文本。
需要注意的是,工具提示的文本只能是单行,不能使用换行符
'\n'
进行多行显示。如果为设置了键盘助记符的组件添加工具提示,助记符会与提示信息一同显示。
2.7 标签与组件关联的实际应用
对于一些用途不明确的组件,如
JTextField
或
JTextArea
,关联标签能清晰地表明其用途。以下是关联标签与组件的步骤:
1. 创建标签组件和需要关联的组件。
2. 调用需要关联组件的
setLabelFor(object)
方法,传入作为标签的组件对象。
示例代码如下:
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JFrame;
import java.awt.FlowLayout;
public class LabelAssociationExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Label Association Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JLabel nameLabel = new JLabel("Name:");
JTextField nameField = new JTextField(20);
nameField.setLabelFor(nameLabel);
frame.add(nameLabel);
frame.add(nameField);
frame.setVisible(true);
}
}
在上述代码中,创建了一个标签
nameLabel
和一个文本框
nameField
,并使用
nameField.setLabelFor(nameLabel)
方法将标签与文本框关联起来。这样,标签的键盘助记符(如果有的话)也能作用于文本框。
2.8 容器分组组件的优势
使用容器将逻辑相关的组件分组在一起,能使界面布局更清晰,便于用户理解和操作。例如,在一个动画小程序中,将用于启动、停止和暂停的三个按钮放在同一个
JPanel
容器中。
以下是示例代码:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.FlowLayout;
public class ContainerGroupingExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Container Grouping Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
JButton startButton = new JButton("Start");
JButton stopButton = new JButton("Stop");
JButton pauseButton = new JButton("Pause");
buttonPanel.add(startButton);
buttonPanel.add(stopButton);
buttonPanel.add(pauseButton);
frame.add(buttonPanel);
frame.setVisible(true);
}
}
在上述代码中,创建了一个
JPanel
容器
buttonPanel
,并将启动、停止和暂停按钮添加到该容器中。最后将容器添加到主窗口中。这样,三个按钮在界面上会作为一个整体显示,用户能更直观地理解它们之间的逻辑关系。
下面是一个 mermaid 流程图,展示使用容器分组组件的流程:
graph LR
A[创建 JFrame] --> B[创建 JPanel 容器]
B --> C[创建组件(按钮等)]
C --> D[将组件添加到 JPanel]
D --> E[将 JPanel 添加到 JFrame]
E --> F[显示 JFrame]
2.9 总结
Java 1.0 小程序编写和 Java 可访问性是 Java 编程中重要的两个方面。Java 1.0 虽简单但在图形用户界面设计上有局限,在编写小程序时要注意鼠标事件处理、绘图重绘等操作。而 Java 可访问性则为程序与辅助技术协同工作提供了可能,使程序能适应更多用户的需求。
通过使用键盘助记符、工具提示、关联标签与组件、提供辅助文本描述和使用容器分组组件等方法,可以显著提升 Java 程序的可访问性和用户友好性。无论是对于有特殊需求的用户,还是普通用户,这些特性都能让程序的使用更加便捷和高效。在实际编程中,应充分运用这些知识,编写出功能强大且易于使用的 Java 程序。
超级会员免费看

被折叠的 条评论
为什么被折叠?



