Как заставить два документа обновлять друг друга в режиме реального времени в зависимости от входных данных друг друга?
Предположительно есть два абстрактных документа, которые соответствуют JTextFields (Оба JTextFields являются разными переменными).
Предположим, что пользователь вводит числовое значение в JtextField1(документ A), он должен обновить другой JTextField2(документ B) во время выполнения соответственно. То же самое происходит, если пользователь вводит числовое значение в JTextField2(Документ B) в то же время выполнения программы, он должен обновить JTextField1(Документ A).
Я попытался решить эту проблему с помощью Document Listener, однако он будет работать только при обновлении одного документа (либо обновлений A, B или наоборот) во время выполнения, а не обоих (или, если быть точным, друг друга), поскольку это обеспечивает взаимоблокировку. Должен ли я использовать DocumentFilter для этой проблемы? Я не знаю, как бы я применил это для этой ситуации, хотя. Я пытался избежать проблемы взаимоблокировки / блокировки записи, используя FocusListeners и отключая DocumentListener, когда поле не в фокусе, но это был очень наивный подход, так как он полностью не работает с потоками (если это проблема). Будет ли достаточно создать отдельный поток, когда выбрано другое поле? У меня нет реальных знаний о многопоточности. Буду признателен за совет по этой проблеме.
код: http://pastebin.com/qqYPXcAf
Я пытаюсь воссоздать аналогичную графическую функциональность фотошопа, которая обновляет размер ширины / высоты в пикселях для сохранения AR во время выполнения при вводе пользователем (изображение: http://puu.sh/9L07v/c745e85867.png)
1 ответ
Должен ли я использовать DocumentFilter для этой проблемы?
Более простое решение - просто поделиться документом:
JTextField textField1 = new JTextField(...);
JTextField textField2 = new JTextField(...);
textField2.setDocument( textField1.getDocument() );
Или, если ваш код выполняет какие-то вычисления, чтобы два значения были разными, вы можете просто удалить DocumentListener, чтобы избежать зацикливания. Таким образом, основной код для слушателя на textField2 будет:
textField1.getDocument().removeDocumentListener(...);
textField1.setText( ... );
textField1.addDocumentListener(...);
Так что знайте, что когда вы обновляете текст в текстовом поле, он не будет уведомлять textField2.