Как заставить два документа обновлять друг друга в режиме реального времени в зависимости от входных данных друг друга?

Предположительно есть два абстрактных документа, которые соответствуют 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.

Другие вопросы по тегам