这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发行说明,了解有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
使用本课程的表格、组件如何部分和事件监听器如何部分来完成这些问题和练习。
问题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
示例,在其中添加一个文本字段。实现当用户输入完数据后,系统发出哔哔声。
答案 1: 参见Beeper1.java
练习 2. 参考Beeper.java
示例,在其中添加一个可选择的组件,允许用户输入一个从 1 到 10 的数字。例如,您可以使用下拉框、一组单选按钮或一个微调器。实现当用户选择数字后,系统发出对应次数的哔哔声。
答案 2: 参见Beeper2.java