gpt4 book ai didi

Java AbstractAction 有时不检测转义键 - 奇怪的行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:19:00 26 4
gpt4 key购买 nike

在主视图/详细 View 中,我有一系列文本字段(以及一个或两个其他控件),它们都与当前所选项目的详细信息有关。它们都共享相同的 DocumentListener,因此如果您更改其中任何一个,将启用一对“保存”/“丢弃”按钮。这些按钮调用一个方法,我可以愉快地保存/丢弃项目。

但是,当我使用 InputMapActionMap 将共享的 saveAction 附加到回车键并将共享的 discardAction 附加到转义键时,discardAction 仅适用于某些字段( saveAction 对他们都有效)。

在记录日志时,我可以看到对于有效的字段,discardAction 首先被触发,然后是 removeUpdate 和 insertUpdate 的适当组合。

对于不起作用的字段,永远不会触发 discardAction。够多的喋喋不休,喋喋不休 - 这是相关的代码(复制和粘贴,而不是解释):

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 SEEMS 首先为有效的字段触发,但无效的字段都有共同的自定义验证。

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 方法的一个简单问题,由于缺乏 sleep 而被我忽略了,但此刻我完全被难住了。

最佳答案

您遇到的问题与工具提示文本的设置有关。执行此操作后,ToolTipManager 会用它自己的 hideTip 击键替换 inputMap 中的丢弃操作键,也就是 VK_ESCAE。

关于Java AbstractAction 有时不检测转义键 - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3074161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com