在master/detail视图中,我有一系列文本字段(以及一个或两个其他控件)都与当前选定项的细节相关。它们都共享相同的DocumentListener,因此如果您更改其中任何一个,就会启用一对“保存/放弃”按钮。按钮调用一个方法,我可以很高兴地保存/丢弃项目。
但是,当我使用InputMapActionMap将共享的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。

10-02 06:22