文档

Java™ 教程
路径: 使用Swing创建GUI
首页 > 使用Swing创建GUI

答案:编写事件监听器

使用本课程的表格、组件如何部分事件监听器如何部分来完成这些问题和练习。

问题

问题1:当特定组件出现在屏幕上时,你将实现哪个监听器来接收通知?哪个方法告诉你这个信息?
答案1:你可以在组件上注册一个ComponentListener。这个方法被调用时,窗口首次显示或取消图标化。

问题2:当用户通过按下Enter键完成文本字段的编辑时,你将实现哪个监听器来接收通知?当每个字符输入到文本字段时,你将实现哪个监听器来接收通知?请注意,你不应该实现一个通用的键监听器,而是一个特定于文本的监听器。
答案2:要在用户按下Enter键时接收通知,你可以在文本字段上注册一个ActionListener;当用户键入Enter时,actionPerformed方法被调用。请注意,Enter字符不是结果字符串的一部分。要在每个字符输入时接收通知,你可以在文本字段的Document上注册一个DocumentListener;然后,insertUpdate方法在每个字符输入时被调用。请注意,这不是实现输入验证的正确方法。关于此行为,你应该查看输入验证API部分和如何使用焦点子系统

问题3:当微调器的值发生变化时,你将实现哪个监听器来接收通知?你将如何获取微调器的新值?
答案3:要在值发生变化时接收通知,你可以在微调器上注册一个ChangeListener;你可以通过事件的源在stateChanged方法中获取新值。以下代码片段展示了如何实现:

public void stateChanged(ChangeEvent e) {
    JSpinner mySpinner = (JSpinner)(e.getSource());
    SpinnerNumberModel model = (SpinnerNumberModel)(mySpinner.getModel());
    Number currentValue = model.getNumber();
    ...
}

问题4:焦点子系统的默认行为是消耗焦点遍历键,如Tab和Shift Tab。假设你想要阻止一个应用程序组件中的这种行为,你将如何实现?
答案4:你可以在特定的组件上调用setFocusTraversalKeysEnabled(false)。请注意,你必须手动处理焦点遍历。有关更多信息,请参阅如何编写键监听器如何使用焦点子系统

练习

练习 1. 参考Beeper.java(在一个 .java 源文件中)示例,在其中添加一个文本字段。实现当用户输入完数据后,系统发出哔哔声。
答案 1: 参见Beeper1.java(在一个 .java 源文件中)

练习 2. 参考Beeper.java(在一个 .java 源文件中)示例,在其中添加一个可选择的组件,允许用户输入一个从 1 到 10 的数字。例如,您可以使用下拉框、一组单选按钮或一个微调器。实现当用户选择数字后,系统发出对应次数的哔哔声。
答案 2: 参见Beeper2.java(在一个 .java 源文件中)


上一页:问题和练习:编写事件监听器