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

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

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

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

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

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

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

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

Ещё можно переопределить TreeSelectionModel и там контролировать вызов TreeSelectionListener.
...
Рейтинг: 0 / 0
23.03.2016, 10:54
    #39198579
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очередь обработки событий
AndronovMV,
Фокусом занимается операционка, и очередность верная.
Т.е. возможно баг компонента.
Но, действительно, зачем вам потеря фокуса?
Попробуйте вобще без него. Оно специфичное.
...
Рейтинг: 0 / 0
23.03.2016, 11:11
    #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
Форумы / Java [игнор отключен] [закрыт для гостей] / Очередь обработки событий / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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