Java 如何使两个文档根据彼此的输入进行实时更新?
假设有两个抽象文档对应于JTextFields(两个JTextFields都是不同的变量) 假设用户在JtextField1(文档A)中输入数值,它应该在运行时相应地更新另一个JTextField2(文档B)。如果用户在同一程序运行时在JTextField2(文档B)中输入数值,则应更新JTextField1(文档A) 我尝试通过使用Document Listener来解决这个问题,但是,它在运行时只会更新一个文档(A更新B,反之亦然),而不会同时更新两个文档(确切地说是彼此),因为它会导致死锁。我应该使用DocumentFilter解决此问题吗?不过,我不知道如何将其应用于这种情况。我试图通过使用FocusListeners和在字段不在焦点时禁用DocumentListener来避免死锁/写锁问题,但这是一种非常幼稚的方法,因为它完全不处理线程(如果这是问题的话)。当选择另一个字段时,创建一个单独的线程就足够了吗?不过,我对多线程没有真正的了解。如果你能就这个问题给我一些建议,我将不胜感激 代码: 我正在尝试重新创建photoshop的类似GUI功能,该功能以像素为单位更新宽度/高度大小,以便在运行时根据用户输入保持AR(图片:) 我应该使用DocumentFilter解决此问题吗 更简单的解决方案是只共享文档:Java 如何使两个文档根据彼此的输入进行实时更新?,java,actionevent,documentlistener,readwritelock,Java,Actionevent,Documentlistener,Readwritelock,假设有两个抽象文档对应于JTextFields(两个JTextFields都是不同的变量) 假设用户在JtextField1(文档A)中输入数值,它应该在运行时相应地更新另一个JTextField2(文档B)。如果用户在同一程序运行时在JTextField2(文档B)中输入数值,则应更新JTextField1(文档A) 我尝试通过使用Document Listener来解决这个问题,但是,它在运行时只会更新一个文档(A更新B,反之亦然),而不会同时更新两个文档(确切地说是彼此),因为它会导致死锁
JTextField textField1 = new JTextField(...);
JTextField textField2 = new JTextField(...);
textField2.setDocument( textField1.getDocument() );
或者,如果您的代码正在进行某种计算,使两个值不同,那么您可以删除DocumentListener以避免循环。因此,textField2上侦听器的基本代码是:
textField1.getDocument().removeDocumentListener(...);
textField1.setText( ... );
textField1.addDocumentListener(...);
所以要知道,当您更新文本字段1中的文本时,它不会通知文本字段2。您可以用更可读的格式plz分解您的问题吗?这些数据结构由唯一的GUI事件线程管理,而不会锁定。你能解释一下你遇到的僵局吗?哪些线程锁定了什么?如果A的侦听器更新了B,反之亦然:如果要更新的字段中的值与新值相同,则跳过更新。这将打破这个循环。(如果你所说的死锁不是这个意思的话)我的代码肯定是在处理一些计算。基本上,如果一个文档由用户更新,则第二个文档必须相应地更新,反之亦然。问题是,若我使用两个文档监听器,而用户试图对文档进行另一次更新,那个么文档就会被写锁定。有些人建议使用DocumentFilter,但据我所知,在运行时使用DocumentFilter进行跨组件文档编辑并不准确,我正试图实现这一点,即两个文档能够随着用户输入进行更新,而不会被写锁定。此外,我尝试删除documentListener以避免循环和写锁,但是由于某些原因documentListener没有被删除。DocumentFilter不是解决方案。如果您没有删除DocumentListener,那么您的代码有问题。解决问题后,建议应该会起作用。创建一个简单的
SSCCE
来测试概念。让SSCCE
正常工作,然后将解决方案应用到您的实际代码中。我让代码正常工作,您是对的唯一问题是我没有将私有侦听器定义为变量,以便可以正确添加和删除它们,相反,我制作了匿名侦听器,并试图删除甚至不存在的侦听器。谢谢你的帮助,我花了一段时间才意识到,但我做到了。