Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使两个文档根据彼此的输入进行实时更新?_Java_Actionevent_Documentlistener_Readwritelock - Fatal编程技术网

Java 如何使两个文档根据彼此的输入进行实时更新?

Java 如何使两个文档根据彼此的输入进行实时更新?,java,actionevent,documentlistener,readwritelock,Java,Actionevent,Documentlistener,Readwritelock,假设有两个抽象文档对应于JTextFields(两个JTextFields都是不同的变量) 假设用户在JtextField1(文档A)中输入数值,它应该在运行时相应地更新另一个JTextField2(文档B)。如果用户在同一程序运行时在JTextField2(文档B)中输入数值,则应更新JTextField1(文档A) 我尝试通过使用Document Listener来解决这个问题,但是,它在运行时只会更新一个文档(A更新B,反之亦然),而不会同时更新两个文档(确切地说是彼此),因为它会导致死锁

假设有两个抽象文档对应于JTextFields(两个JTextFields都是不同的变量)

假设用户在JtextField1(文档A)中输入数值,它应该在运行时相应地更新另一个JTextField2(文档B)。如果用户在同一程序运行时在JTextField2(文档B)中输入数值,则应更新JTextField1(文档A)

我尝试通过使用Document Listener来解决这个问题,但是,它在运行时只会更新一个文档(A更新B,反之亦然),而不会同时更新两个文档(确切地说是彼此),因为它会导致死锁。我应该使用DocumentFilter解决此问题吗?不过,我不知道如何将其应用于这种情况。我试图通过使用FocusListeners和在字段不在焦点时禁用DocumentListener来避免死锁/写锁问题,但这是一种非常幼稚的方法,因为它完全不处理线程(如果这是问题的话)。当选择另一个字段时,创建一个单独的线程就足够了吗?不过,我对多线程没有真正的了解。如果你能就这个问题给我一些建议,我将不胜感激

代码:

我正在尝试重新创建photoshop的类似GUI功能,该功能以像素为单位更新宽度/高度大小,以便在运行时根据用户输入保持AR(图片:)

我应该使用DocumentFilter解决此问题吗

更简单的解决方案是只共享文档:

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
正常工作,然后将解决方案应用到您的实际代码中。我让代码正常工作,您是对的唯一问题是我没有将私有侦听器定义为变量,以便可以正确添加和删除它们,相反,我制作了匿名侦听器,并试图删除甚至不存在的侦听器。谢谢你的帮助,我花了一段时间才意识到,但我做到了。