java.lang.Objectjava.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.text.JTextComponent
javax.swing.JTextField
javax.swing.JFormattedTextField
public class JFormattedTextField
JFormattedTextField 扩展了 JTextField,添加了对格式化任意值的支持,以及一旦用户编辑了文本就检索特定对象的支持。以下代码说明了如何配置 JFormattedTextField 来编辑日期:
JFormattedTextField ftf = new JFormattedTextField(); ftf.setValue(new Date());
一旦创建了 JFormattedTextField,就可以通过添加 PropertyChangeListener 的方式来侦听编辑更改,并且使用属性名 value 来侦听 PropertyChangeEvent。
JFormattedTextField 允许配置在失去焦点时应该采取的措施。可能的值为:
值 |
描述 |
|---|---|
| JFormattedTextField.REVERT | 恢复显示以匹配 getValue,这可能丢失当前的编辑内容。 |
| JFormattedTextField.COMMIT | 提交当前值。如果 AbstractFormatter 不认为所编辑的值是合法值,则抛出 ParseException,然后不更改该值并保留已编辑的值。 |
| JFormattedTextField.COMMIT_OR_REVERT | 与 COMMIT 类似,但是如果该值不是合法的,则其行为类似于 REVERT。 |
| JFormattedTextField.PERSIST | 不执行任何操作,不获取新的 AbstractFormatter 也不更新该值。 |
JFormattedTextField.COMMIT_OR_REVERT,有关此内容的更多信息,请参阅
setFocusLostBehavior(int)。
JFormattedTextField 允许焦点离开,即使当前编辑的值是无效的也是如此。要在 JFormattedTextField 处于无效编辑状态时锁定焦点,可以附加一个 InputVerifier。以下代码片断显示了这种 InputVerifier 的可能实现:
public class FormattedTextFieldVerifier extends InputVerifier {
public boolean verify(JComponent input) {
if (input instanceof JFormattedTextField) {
JFormattedTextField ftf = (JFormattedTextField)input;
AbstractFormatter formatter = ftf.getFormatter();
if (formatter != null) {
String text = ftf.getText();
try {
formatter.stringToValue(text);
return true;
} catch (ParseException pe) {
return false;
}
}
}
return true;
}
public boolean shouldYieldFocus(JComponent input) {
return verify(input);
}
}
或者,也可以调用 commitEdit,这也会提交该值。
JFormattedTextField 本身不执行格式化,而是通过从 JFormattedTextField.AbstractFormatterFactory 实例获得的 JFormattedTextField.AbstractFormatter 实例完成格式化。通过 install 方法的方式使 JFormattedTextField.AbstractFormatter 的实例处于激活状态时会通知它们,此时 JFormattedTextField.AbstractFormatter 可以安装其所需的任何内容,通常是 DocumentFilter。类似地,当 JFormattedTextField 不再需要 AbstractFormatter 时,它会调用 uninstall。
JFormattedTextField 通常在获得或丢失焦点时查询 AbstractFormatterFactory 以找到 AbstractFormat。但根据焦点丢失策略也可以更改此行为。如果焦点丢失策略是 JFormattedTextField.PERSIST 并且已编辑了 JFormattedTextField,则在值提交之前不会查询 AbstractFormatterFactory。类似地,如果焦点丢失策略是 JFormattedTextField.COMMIT 并且从 stringToValue 中抛出异常,则丢失或获得焦点时不查询 AbstractFormatterFactory。
JFormattedTextField.AbstractFormatter 还负责确定何时将值提交给 JFormattedTextField。某些 JFormattedTextField.AbstractFormatter 在每次编辑时都提供新值,而其他的则从不提交该值。可以强行从当前的 JFormattedTextField.AbstractFormatter 获得当前值,方法是调用 commitEdit。每当在 JFormattedTextField 中按下了 return 键,就调用 commitEdit。
如果尚未显式地设置 AbstractFormatterFactory,则在调用 setValue 后(假定 value 是非 null 的),根据 value 类型的 Class 设置该值。例如,在以下代码中将创建一个合适的 AbstractFormatterFactory 和 AbstractFormatter,以处理数字的格式化:
JFormattedTextField tf = new JFormattedTextField(); tf.setValue(new Number(100));
警告:由于 AbstractFormatter 通常在 Document 上安装一个 DocumentFilter,在 JFormattedTextField 上安装一个 NavigationFilter,所以您不应安装自己的过滤器。如果您安装了,则会看到奇怪的行为,因为将无法强制执行 AbstractFormatter 的编辑策略。
警告:Swing 不是线程安全的。有关更多信息,请参阅 Swing's Threading Policy。
警告:此类的序列化对象与以后的 Swing 版本不兼容。当前序列化支持适用于短期存储,或适用于在运行相同 Swing 版本的应用程序之间进行 RMI(Remote Method Invocation,远程方法调用)。从 1.4 版本开始,已在 java.beans 包中添加了支持所有 JavaBeansTM 长期存储的功能。请参见 XMLEncoder。
| 嵌套类摘要 | |
|---|---|
static class |
JFormattedTextField.AbstractFormatter JFormattedTextField 所使用的 AbstractFormatter 实例,用于处理从 Object 到 String 和从 String 到 Object 的转换。 |
static class |
JFormattedTextField.AbstractFormatterFactory JFormattedTextField 使用的 AbstractFormatterFactory 实例,用来获得 AbstractFormatter 实例,依次使用该实例格式化各个值。 |
| 从类 javax.swing.JTextField 继承的嵌套类/接口 |
|---|
JTextField.AccessibleJTextField |
| 从类 javax.swing.text.JTextComponent 继承的嵌套类/接口 |
|---|
JTextComponent.AccessibleJTextComponent, JTextComponent.DropLocation, JTextComponent.KeyBinding |
| 从类 javax.swing.JComponent 继承的嵌套类/接口 |
|---|
JComponent.AccessibleJComponent |
| 从类 java.awt.Container 继承的嵌套类/接口 |
|---|
Container.AccessibleAWTContainer |
| 从类 java.awt.Component 继承的嵌套类/接口 |
|---|
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy |
| 字段摘要 | |
|---|---|
static int |
COMMIT 标识丢失焦点时,应该调用 commitEdit 的常量。 |
static int |
COMMIT_OR_REVERT 标识丢失焦点时,应该调用 commitEdit 的常量。 |
static int |
PERSIST 标识丢失焦点时,应该保留编辑值的常量。 |
static int |
REVERT 标识丢失焦点时,应该将编辑的值恢复为 JFormattedTextField 上所设当前值的常量。 |
| 从类 javax.swing.JTextField 继承的字段 |
|---|
notifyAction |
| 从类 javax.swing.text.JTextComponent 继承的字段 |
|---|
DEFAULT_KEYMAP, FOCUS_ACCELERATOR_KEY |
| 从类 javax.swing.JComponent 继承的字段 |
|---|
accessibleContext, listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW |
| 从类 java.awt.Component 继承的字段 |
|---|
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT |
| 从接口 javax.swing.SwingConstants 继承的字段 |
|---|
BOTTOM, CENTER, EAST, HORIZONTAL, LEADING, LEFT, NEXT, NORTH, NORTH_EAST, NORTH_WEST, PREVIOUS, RIGHT, SOUTH, SOUTH_EAST, SOUTH_WEST, TOP, TRAILING, VERTICAL, WEST |
| 从接口 java.awt.image.ImageObserver 继承的字段 |
|---|
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH |
| 构造方法摘要 | |
|---|---|
JFormattedTextField() 创建一个没有 AbstractFormatterFactory 的 JFormattedTextField。 |
|
JFormattedTextField(Format format) 创建一个 JFormattedTextField。 |
|
JFormattedTextField(JFormattedTextField.AbstractFormatter formatter) 创建一个具有指定 AbstractFormatter 的 JFormattedTextField。 |
|
JFormattedTextField(JFormattedTextField.AbstractFormatterFactory factory) 创建一个具有指定 AbstractFormatterFactory 的 JFormattedTextField。 |
|
JFormattedTextField(JFormattedTextField.AbstractFormatterFactory factory, Object currentValue) 创建一个具有指定 AbstractFormatterFactory 和初始值的 JFormattedTextField。 |
|
JFormattedTextField(Object value) 创建一个具有指定值的 JFormattedTextField。 |
|
| 方法摘要 | |
|---|---|
void |
commitEdit() 强制从 AbstractFormatter 获得当前值并将其设置为当前值。 |
Action[] |
getActions() 获取编辑器的命令列表。 |
int |
getFocusLostBehavior() 返回丢失焦点时的行为。 |
JFormattedTextField.AbstractFormatter |
getFormatter() 返回用于格式化和分析当前值的 AbstractFormatter。 |
JFormattedTextField.AbstractFormatterFactory |
getFormatterFactory() 返回当前的 AbstractFormatterFactory。 |
String |
getUIClassID() 获得 UI 的类 ID。 |
Object |
getValue() 返回最后一个有效值。 |
protected void |
invalidEdit() 用户输入无效值时调用。 |
boolean |
isEditValid() 如果所编辑的当前值有效,则返回 true。 |
protected void |
processFocusEvent(FocusEvent e) 处理所有的焦点事件,如 FocusEvent.FOCUS_GAINED 或 FocusEvent.FOCUS_LOST。 |
protected void |
processInputMethodEvent(InputMethodEvent e) 处理所有的输入法事件,如 InputMethodEvent.INPUT_METHOD_TEXT_CHANGED 或 InputMethodEvent.CARET_POSITION_CHANGED。 |
void |
setDocument(Document doc) 将该编辑器与某个文本文档关联。 |
void |
setFocusLostBehavior(int behavior) 设置丢失焦点时的行为。 |
protected void |
setFormatter(JFormattedTextField.AbstractFormatter format) 设置当前的 AbstractFormatter。 |
void |
setFormatterFactory(JFormattedTextField.AbstractFormatterFactory tf) 设置 AbstractFormatterFactory。 |
void |
setValue(Object value) 设置值,该值由从当前 AbstractFormatterFactory 获得的 AbstractFormatter 进行格式化。 |