java - 如何在不引发异常的情况下强制在 Activity 的 JTextField 中设置文本?

标签 java swing user-interface jtextfield

每当我尝试在字段具有焦点时设置内容时,JTextField 的 SetText 方法都会引发异常。我需要改变它,因为我想输入非常精确的字符数,一旦达到字符数,就需要清除该字段,同时仍然保持焦点,以便可以立即添加下一组字符,而无需按任何按钮。

我尝试创建一个静态方法,它会在每次填满时从头开始重新创建文本字段,从而允许每次递归地重新生成字段。该方法根本没有做任何事情。作为引用,基本上这个程序中的所有内容都是静态的,因为它是一个非常简单的应用程序,我基本上只想访问“main”中的每个重要变量。

尝试在字段具有焦点时设置文本显示如下:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
    at javax.swing.text.AbstractDocument.writeLock(Unknown Source)
    at javax.swing.text.AbstractDocument.replace(Unknown Source)
    at javax.swing.text.JTextComponent.setText(Unknown Source)
    at onlypack.ProgramMain$3.insertUpdate(ProgramMain.java:118)
    at javax.swing.text.AbstractDocument.fireInsertUpdate(Unknown Source)
    at javax.swing.text.AbstractDocument.handleInsertString(Unknown Source)
    at javax.swing.text.AbstractDocument.insertString(Unknown Source)
    at javax.swing.text.PlainDocument.insertString(Unknown Source)
    at javax.swing.text.AbstractDocument.replace(Unknown Source)
    at javax.swing.text.JTextComponent.replaceSelection(Unknown Source)
    at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(Unknown Source)
    at javax.swing.SwingUtilities.notifyAction(Unknown Source)
    at javax.swing.JComponent.processKeyBinding(Unknown Source)
    at javax.swing.JComponent.processKeyBindings(Unknown Source)
    at javax.swing.JComponent.processKeyEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

you can't modify the document from inside a Document LIstener

正确,您需要等到 Document 处于接受输入的状态。

一种方法是将您的代码包装在 SwingUtilties.invokeLater() 中的 DocumentListener 中。这会将代码放在 Event Dispatch Thread 的末尾,它将在 Document 完成自身更新后执行。

另一种选择是使用 DocumentFilter,而不是使用 DocumentListener。这会在将文本添加到文档之前拦截文本。因此,您可以在输入指定数量的字符后简单地清除文档。阅读 Implement a DocumentFilter 上的 Swing 教程部分获取更多信息。

关于java - 如何在不引发异常的情况下强制在 Activity 的 JTextField 中设置文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57170492/

相关文章:

java - XMLEncoder 跳过 ActionListener

css - 模态对话框后面的暗淡背景是否有名称?

java - 将for循环输入的数字相加

java - 创建一个逐步更新 JPanel 的 ActionListener

java - 如何使用 TestNG Framework 和 Selenium WebDriver 在 Excel 文件中写入测试结果(通过/失败)?

java - 这个 JApplet 有问题,不确定它为什么不工作

python - 如何使用 Python Tkinter 实现这种类型的结果?

user-interface - 在 NetLogo 中检测鼠标点击/鼠标松开

java - 将数据添加到java中的通用集合

java - 使用 class.isEnum() 还是 instanceof Enum 更好?