powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Очередь обработки событий
6 сообщений из 6, страница 1 из 1
Очередь обработки событий
    #39198548
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Не знаю правильно-ли сформулировал тему, но прошу понять-простить, если сломал вам моск))
Смысл следующий:

1. Есть Дерево (JTree) и текстовое поле (JTextField)
2. Есть событие выбора (addTreeSelectionListener) нода (node) на дереве, где из него достается UserObject и мапится на текстовое поле
3. В текстовом поле отображается UserObject нода и там-же его можно редактировать.
4. Событие при котором информация с текстового поля кладется в ноду называется LostFocus, а обработчик соответственно назначен на текстовое поле.
5. Так вот если уйти с текстового поля (потерять фокус) на любой другой элемент кроме самого дерева, то нормально, а если уйти с текстового поля на дерево, то почему то сначала сработает событие выбора нода на дереве, а потом только LostFocus на текс. поле, что кардинально меняет ситуацию и результат.

Итого: Нужно при тыкании на дерево сначала обработать событие потери фокуса на текстовом поле, что инфа положилась в ноду, а только потом обрабатывать событие выбора нового нода и соответственно мапить с него инфу на текст. поле.

Как?
...
Рейтинг: 0 / 0
Очередь обработки событий
    #39198562
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

Да, всё просто вроде. Перед тем как текстовому полю задать новый UserObject, надо убедиться, что текстовое значение в старый сохранено. Подсистемы фокуса и выбора очень разные. Поэтому рассчитывать на их синхронизацию никак нельзя.
...
Рейтинг: 0 / 0
Очередь обработки событий
    #39198565
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

Ну можно ещё грязный трюк с invokeLater провернуть. То есть в TreeSelectionListener ваше "достается UserObject и мапится на текстовое поле" выполнять не сразу, а поместить в EventQueue через invokeLater. Тогда все остальные события UI в очереди обработаются и только после этого запуститься процесс обновления поля.

Но я бы не рекомендовал так делать. Уж очень оно не надежно.
...
Рейтинг: 0 / 0
Очередь обработки событий
    #39198574
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

Кстати. По факту вы изобретаете свой TreeCellEditor. Можно попробовать просто переопределить layout и поместить editingComponent в нужную вам позицию. Либо, если за пределами дерева отрисовать не выйдет, то просто связать TreeCellEditor.editingComponent с вашим JTextField. Хотя "просто" здесь по факту не так уж и "просто".

Ещё можно переопределить TreeSelectionModel и там контролировать вызов TreeSelectionListener.
...
Рейтинг: 0 / 0
Очередь обработки событий
    #39198579
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,
Фокусом занимается операционка, и очередность верная.
Т.е. возможно баг компонента.
Но, действительно, зачем вам потеря фокуса?
Попробуйте вобще без него. Оно специфичное.
...
Рейтинг: 0 / 0
Очередь обработки событий
    #39198606
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл указать, что JTree и JTextField изолированны друг от друга, т.е. они работаю через посредника и друг о друге ничего не знают.

типа:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
tree.addTreeSelectionListener(new TreeSelectionListener() {

            @Override
            public void valueChanged(TreeSelectionEvent e) {
                if (e.getPath() != null) {
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
                    if (node.getUserObject() instanceof IRecord) {
                        IRecord record = (IRecord) node.getUserObject();
                        DataSet.this.setCurrentRecord(record);
                    } else {
                        DataSet.this.setCurrentRecord(null);
                    }
                }
            }
        });



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
dataSet.addDataSetSelectionListener(new IDataSetSelectionListener() {

            @Override
            public void selectionChanged(IRecord newRecord, IRecord oldRecord) {
                if(newRecord == null) {
                    field.setText("");
                    field.setEditable(false);
                    return;
                }
                
                field.setEditable(col.isEditable());
                if(col.isKey()) field.setEditable(false);
                
                Object value = newRecord.getField(col.getName()).getDisplayValue();
                if(value == null) {
                    field.setText("");
                    return;
                }
                field.setText(value.toString());
            }
        });



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
field.addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent e) {}

            @Override
            public void focusLost(FocusEvent e) {
                if(!field.isEditable()) return;
                IRecord record = dataSet.getCurrentRecord();
                
                if (record == null) return;
                if (record.getField(col.getName()) == null) return;
                
                String text = field.getText();
                record.setValue(col.getName(), text);

            }
        });



Если коротко, то реализован некий DataSet, в котором помимо функционала для работы с данными БД сделал перегруженные методы bind.

Код: java
1.
2.
3.
4.
5.
6.
public void bind(final JTable table)
public void bind(final JComboBox comboBox, String column)
public void bind(final JTextField field, String column)
public void bind(final JCheckBox checkBox, String column)
public void bind(final JTree tree, final String displayColumn)
и т.д.



вот в них и заключен код по работе с контролами и как видите контролы не видят друг друга.

Вот примерно так все это вызывается:
Код: java
1.
2.
3.
4.
5.
getDataSet().bind(jTree1, "name");
getDataSet().bind(jTextField1, "name");
getDataSet().bind(jTextField3, "report_code");
getDataSet().bind(jComboBox1, "file");
getDataSet().bind(jCheckBox1, "is_active");



Я пробовал с invokeLater, там после нескольких тыканий по нодам дерева начинается "светомузыка" в jTree.
Сейчас чуть изменил код с тем же invokeLater, вроде стал работать нормально:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
tree.addTreeSelectionListener(new TreeSelectionListener() {

            @Override
            public void valueChanged(TreeSelectionEvent e) {
                if (e.getPath() != null) {
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
                    if (node.getUserObject() instanceof IRecord) {
                        final IRecord record = (IRecord) node.getUserObject();
                        if(record != getCurrentRecord()) {
                            SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                    DataSet.this.setCurrentRecord(record);
                                }
                            });
                        }
                    } else {
                        if(null != getCurrentRecord()) {
                            SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                    DataSet.this.setCurrentRecord(null);
                                }
                            });
                        }
                    }
                }
            }
        });
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Очередь обработки событий
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]