如何在使用文档侦听器时将文本设置为标题?

时间:2015-02-07 08:33:16

标签: java swing jtextfield document illegalstateexception

我有一个JTextField,我需要在其中编辑或添加新内容到文本字段中。能够在使用文档侦听器但不能设置文本之后获取文本。它会抛出错误,如

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: 
    Attempt to mutate in notification

我的代码:

    t_pageno.getDocument().addDocumentListener(new DocumentListener() {
    @Override
    public void changedUpdate(DocumentEvent e) {
        warn();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        warn();
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        warn();
    }

    public void warn() {
        if (
                Integer.parseInt(t_pageno.getText()) > Integer.parseInt(Config.maxpageno) 
                && 
                Integer.parseInt(t_pageno.getText()) < 0
                ) {
            JOptionPane.showMessageDialog(null,
                    "Error: Please enter number bigger than 0 and less than "+Config.maxpageno, "Error Massage",
                    JOptionPane.ERROR_MESSAGE);
        }
        else
        {
        String pageno = t_pageno.getText();
            if (!pageno.equals(new File(Current_index).getName().substring(18, 20))) {
                int Storyidconfirm = JOptionPane.showConfirmDialog(null, "Do You want to change the Page No", "Change PageNo", JOptionPane.YES_NO_OPTION);
                if (Storyidconfirm == JOptionPane.YES_OPTION) {
                    String newidchange = new File(Current_index).getName().substring(0, 18) + pageno + new File(Current_index).getName().substring(21, new File(Current_index).getName().length());
                    JOptionPane.showMessageDialog(null, "Change in page no ??????????");
                }
                else
                {
                   JOptionPane.showMessageDialog(null, "Reversing to old page no");
                   JOptionPane.showMessageDialog(null, "new File(Current_index).getName().substring(18, 20) --> "+new File(Current_index).getName().substring(18, 20));
                   t_pageno.setText(new File(Current_index).getName().substring(18, 20).toString());                             
                }
        }
        }
        }
});

1 个答案:

答案 0 :(得分:2)

DocumentListener不是尝试对Document进行修改的好地方,因为在通知时,Document处于变异状态,因此任何尝试进一步修改它会导致它抛出IllegalStateException

如果要在文本提交到Document之前更改或过滤文本,则应使用DocumentFilter代替,这就是它的设计目标。

有关详细信息,请参阅Implementing a Document FilterDocumentFilter Examples

当您希望在DocumentListener已经提交Document之后收到Document的更改通知时,您应该只使用Document,并且永远不要尝试使用它来过滤或以其他方式修改ActionListener

我强烈建议您不要在每次更新时显示警报,因为这会让人烦恼。相反,我会以某种方式突出显示该字段,指示值值无效(可能提供工具提示以获取更多信息)和/或更新某种状态值/标签。我可能会考虑使用InputVerifier和/或JSpinner来执行物理验证,然后向用户显示错误,因此他们在输入和更正之前可能会犯错误采取行动。

我还建议您查看{{1}}

有关详细信息,请参阅How to Write an Action ListenersValidating InputHow to Use Spinners