![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| armixx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 16.8.2010 Репутация: нет Всего: нет |
После замены модели данных у таблицы JFrame, содержащая панель с JTable перестаёт реагировать на все события.
Точнее: реагирует следующим образом: - окно свернули - окно развернули Все события обработались. И по новой. |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Приведите, пожалуйста, код обновления модели.
-------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| armixx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 16.8.2010 Репутация: нет Всего: нет |
Виноват. Привожу часть кода:
В обработке фрейма вызываю FTPanel.changeTable(). Модель создаётся нормально. Это сообщение отредактировал(а) jk1 - 17.8.2010, 12:21 |
|||
|
||||
| armixx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 16.8.2010 Репутация: нет Всего: нет |
Пока даже не представляю, где копать.
Все сообщения поступают в очередь, но отрабатываются только в процессе сворачивания/разворачивания окна. Такое ощущение, что очередь событий перескочила от JFrame к кому-то ещё. Как бы понять к кому? Как вернуть её назад? Почему? |
|||
|
||||
| mgarin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 19.8.2009 Где: Санкт-Петербург Репутация: 2 Всего: 3 |
armixx, попробуйте у самой таблицы после замены модели вызвать updateUI()
Я обычно так "оживляю" свинговые компоненты после изменения их модели. Иначе могут происходить разные "странности", как например у вас P.S. А при сворачивании-разворачивании происходит обновление потому, что происходит полная перерисовка, которая задействует новую модель. Вы еще можете попробовать поресайзить окно - думаю будет такой же резуьтат |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
armixx,
а отрисовка у вас точно на EDT выполняется? -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| armixx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 16.8.2010 Репутация: нет Всего: нет |
to Mgarin:
Спасибо. updateUI() попробовал. Сделал так: public void changeModel() { tabm=new MyTableModel(); setModel(tabm); tabm.fireTableDataChanged(); updateUI(); } Увы! Не помогает. to jk1: Прошу прощения, я ещё не очень силён в терминологии и аббревиатурах JAVы. Что такое EDT? |
|||
|
||||
| armixx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 16.8.2010 Репутация: нет Всего: нет |
1. Очередь событий "разряжается" при наступлении оконного события.
2. Под управлением DEBUGGERа (я использую JDEV11) всё работает. Может быть существенно вот что (приношу свои извинения, я сперва это упустил из виду): Мой FRAME наследует интерфейс AWTEventListener, и смену модели я произвожу из функции eventDispatched. Не знаю, как это влияет? Сейчас пытаюсь копать в этом направлении. |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
EDT - event dispatching thread. Вся отрисовка и обработка событий в Swing приложении должна происходить на нем. Чтобы понять, где выполняется код, посмотрите вывод
1. там, где назначаете таблице новую модель 2. в конструкторе вашего окна -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| armixx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 16.8.2010 Репутация: нет Всего: нет |
Не знаю, правильно ли я Вас понял?
Сделал так: public void changeModel() { ..... setModel(tabm); tabm.fireTableDataChanged(); SwingUtilities.isEventDispatchThread(); Ничего не происходит. |
|||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
И не должно. Этот метод возвращает булевское значение. Его и надо узнать, например в консоль вывести
И написать это надо в двух указанных выше местах кода. -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| armixx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 16.8.2010 Репутация: нет Всего: нет |
Сделал так:
class MyFrame extends JFrame implements AWTEventListener { ..... Toolkit.getDefaultToolkit().addAWTEventListener(this,AWTEvent.KEY_EVENT_MASK); System.out.println("MyFrame: isEDT="+SwingUtilities.isEventDispatchThread()); setVisible(true); } public void changeModel() { ..... tabm.fireTableDataChanged(); System.out.println("change Model: isEDT="+SwingUtilities.isEventDispatchThread()); } Получил: MyFrame: isEDT=false change Model: isEDT=true |
|||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Ага. А должно быть true в обоих случаях. Исправить это можно так: в том месте, где вы создаете окно вместо
нужно написать
-------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| armixx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 16.8.2010 Репутация: нет Всего: нет |
Спасибо. Сделал. Получил сообщения
MyFrame: isEDT=true change Model: isEDT=true Всё равно не работает До этого сделал вот так: public void eventDispatched(AWTEvent event) { ..... // Вызываем смену модели: tabPanel.changeTable(); System.out.println("eventDispatch: isEDT="+SwingUtilities.isEventDispatchThread()); SwingUtilities.invokeLater ( new Runnable() { public void run(){ MyFrame.this.repaint();} } ); ..... Получил: 1) eventDispatch: isEDT=true 2) смена модели отрисовалась и опять всё зависло |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
А зачем вам понадобился implements AWTEventListener? Есть подозрение что он просто зацикливается на обработке событий после такого
-------------------- Opinions are like assholes — everybody has one |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |