在master/detail视图中,我有一系列文本字段(以及一个或两个其他控件)都与当前选定项的细节相关。它们都共享相同的DocumentListener
,因此如果您更改其中任何一个,就会启用一对“保存/放弃”按钮。按钮调用一个方法,我可以很高兴地保存/丢弃项目。
但是,当我使用InputMap
和ActionMap
将共享的saveAction附加到enter键,将共享的discardAction附加到escape键时,discardAction只对某些字段起作用(saveAction对所有字段都起作用)。
当记录时,我可以看到,对于工作的字段,discard操作首先被触发,然后是removeUpdate和insertUpdate的适当组合。
对于不起作用的字段,永远不会触发discard操作。够了,闲聊-这是相关的代码(复制粘贴,而不是转述):
docChangeListener = new DocumentListener() {
public void insertUpdate(DocumentEvent de) {
System.out.println("\t insertUpdate just got triggered");
memberDetailsChanged(de);
}
public void removeUpdate(DocumentEvent de) {
System.out.println("\t removeUpdate just got triggered");
memberDetailsChanged(de);
}
public void changedUpdate(DocumentEvent de) {
// Not a styled document, safely ignore
}
};
saveAction = new AbstractAction() {
public void actionPerformed(ActionEvent ae) {
System.out.println("\t saveAction just got triggered");
saveChanges();
}
};
discardAction = new AbstractAction() {
public void actionPerformed(ActionEvent ae) {
System.out.println("\t discardAction just got triggered");
discardChanges();
}
};
private void registerDetailField(final JTextField field) {
field.getDocument().putProperty("field", field);
field.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "saveActionKey");
field.getActionMap().put("saveActionKey", saveAction);
field.getInputMap().put(KeyStroke.getKeyStroke("ESCAPE"), "discardActionKey");
field.getActionMap().put("discardActionKey", discardAction);
field.getDocument().addDocumentListener(docChangeListener);
}
所有文本字段都以相同的方式注册(使用
registerDetailField()
)。他们还调用了putClientProperty
来为他们分配一个验证类型(见下文)。工作字段和不工作字段之间的唯一区别是实际的验证过程。我会把它剪掉,因为它太长了,但我觉得我必须把它包括在内。DiscardAction似乎首先为工作的字段触发,但不工作的字段都有共同的自定义验证。
private void verifyField(final JTextField field) {
int fieldType = ((Integer)field.getClientProperty("type")).intValue();
String fieldValue = field.getText();
switch (fieldType) {
case STANDARD_FIELD:
return; // No validation at the moment
case MEMBER_NUMBER_FIELD:
if (fieldValue.length() == 0) { // Field is required
field.setBackground(REQUIRED_COLOUR);
field.setToolTipText("This is a required field");
invalidFields.add(field);
return;
}
// Check proposed value is valid
if (customTableModel.memberNumStringIsValid(fieldValue,
selectedMember.getMemberNumber())) {
field.setBackground(NORMAL_COLOUR);
field.setToolTipText(null);
invalidFields.remove(field);
} else {
field.setBackground(ERROR_COLOUR);
field.setToolTipText("This value must be a unique,
positive number");
invalidFields.add(field);
}
return;
/* SNIP */
default:
return;
}
}
希望这是我的verifyfield方法的一个简单问题,由于睡眠不足,我忽略了这个问题,但目前我完全被难住了。
最佳答案
您遇到的问题是工具提示文本的设置。一旦您这样做,ToolTipManager
将用它自己的hideTip
键笔划替换inputmap中的discard action键,也就是vk_escae。