Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JFrame не обрабатывает события, Замена модели данных у JTable 
V
    Опции темы
armixx
Дата 16.8.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



После замены модели данных у таблицы JFrame, содержащая панель с JTable перестаёт реагировать на все события.
Точнее: 
реагирует следующим образом:
- окно свернули
- окно развернули 
Все события обработались. И по новой.
PM MAIL   Вверх
jk1
Дата 16.8.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Приведите, пожалуйста, код обновления модели.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
armixx
Дата 17.8.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



 Виноват. Привожу часть кода:
    
Код

     // Это панель с таблицей
     public class FTPanel extends JPanel
     {
       .....
       private MyTable tbl=null;
       .....
       public FTPanel(File dir,int sn) 
       {     
         tbl=new MyTable();
         tbl.setFocusable(false);
         tbl.addMouseListener
         (
           new MouseAdapter()
           {  
             public void mouseClicked(MouseEvent me) 
             {
               ....
              }
           }
         );
        sp=new JScrollPane(tbl); 
        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        tbwidth=tbl.getVWidth()+20; tbheight=tbl.getVHeight()+30;
        sp.setPreferredSize(new Dimension(tbwidth,tbl.getVHeight()));
        sp.setSize(tbwidth,tbl.getVHeight());    
        add(sp);
       }

       public void changeTable()
       {     
          tbl.changeModel();
        }
       ......
      }
     
     // Сама таблица
     public class MyTable extends JTable
     {
       private MyTableModel tabm=null;
       
       public MyTable() 
       {
         // Так создаю таблицу
         tabm=new MyTableModel();
         setModel(tabm);
         setDefaultRenderer(Icon.class,new IconRenderer());
         setDefaultRenderer(String.class,new FNameRenderer());
         setDefaultRenderer(FSize.class,new FSizeRenderer());
         setDefaultRenderer(Dates.class,new DirsRenderer());
         setDefaultRenderer(Dirs.class,new DateRenderer());
        }

       // Так меняю модель
       public void changeModel() 
       {
         tabm=new MyTableModel();
         setModel(tabm); 
         tabm.fireTableDataChanged();
        }
      ... 
      // Сама модель
      class MyTableModel extends DefaultTableModel 
      {
         protected String[] cnames={ "Имя","Размер","Дата","Тип"};
         protected Class[] cclass=new Class[]
                                  {
                                    String.class,FSize.class,Dates.class,Dirs.class
                                   };
     
         public MyTableModel(){ ... }
         public Object getValueAt(int row,int col){ ... }
         public void setValueAt(Object value,int row,int col){ return; }
         public boolean isCellEditable(int row,int col){ return false; }
         public Class getColumnClass(int col){ return cclass[col]; }
         public String getColumnName(int col){ return cnames[col]; }
        } 

 
В обработке фрейма вызываю FTPanel.changeTable().
Модель создаётся нормально.
     

Это сообщение отредактировал(а) jk1 - 17.8.2010, 12:21
PM MAIL   Вверх
armixx
Дата 17.8.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



Пока даже не представляю, где копать.
Все сообщения поступают в очередь, но отрабатываются только в процессе сворачивания/разворачивания окна.
Такое ощущение, что очередь событий перескочила от JFrame к кому-то ещё.
Как бы понять к кому?
Как вернуть её назад?
Почему?
PM MAIL   Вверх
mgarin
Дата 17.8.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 19.8.2009
Где: Санкт-Петербург

Репутация: 2
Всего: 3



armixx, попробуйте у самой таблицы после замены модели вызвать updateUI()
Я обычно так "оживляю" свинговые компоненты после изменения их модели.
Иначе могут происходить разные "странности", как например у вас

P.S. А при сворачивании-разворачивании происходит обновление потому, 
что происходит полная перерисовка, которая задействует новую модель.
Вы еще можете попробовать поресайзить окно - думаю будет такой же резуьтат
PM MAIL WWW ICQ   Вверх
jk1
Дата 17.8.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



armixx,

а отрисовка у вас точно на EDT выполняется? 


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
armixx
Дата 17.8.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



to Mgarin:
Спасибо. 
updateUI() попробовал. 
Сделал так:
 public void changeModel() 
 {
     tabm=new MyTableModel();
     setModel(tabm); 
     tabm.fireTableDataChanged();
     updateUI();
   }
Увы! Не помогает.
to jk1: 
Прошу прощения, я ещё не очень силён в терминологии и аббревиатурах JAVы. 
Что такое EDT?
PM MAIL   Вверх
armixx
Дата 17.8.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



1. Очередь событий "разряжается" при наступлении оконного события.
2. Под управлением DEBUGGERа (я использую JDEV11) всё работает.
Может быть существенно вот что (приношу свои извинения, я сперва это упустил из виду):
Мой FRAME наследует интерфейс AWTEventListener, и смену модели я произвожу из функции eventDispatched. 
Не знаю, как это влияет? 
Сейчас пытаюсь копать в этом направлении.
PM MAIL   Вверх
jk1
Дата 17.8.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



EDT - event dispatching thread. Вся отрисовка и обработка событий в Swing приложении должна происходить на нем. Чтобы понять, где выполняется код, посмотрите вывод
Код

SwingUtilities.isEventDispatchingThread();

1. там, где назначаете таблице новую модель
2. в конструкторе вашего окна


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
armixx
Дата 17.8.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



Не знаю, правильно ли я Вас понял?
Сделал так:

   public void changeModel()
   {
      ..... 
      setModel(tabm); 
      tabm.fireTableDataChanged();
      SwingUtilities.isEventDispatchThread();

Ничего не происходит.
PM MAIL   Вверх
jk1
Дата 17.8.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Цитата

Ничего не происходит. 

И не должно. Этот метод возвращает булевское значение. Его и надо узнать, например в консоль вывести
Код

System.out.println(SwingUtilities.isEventDispatchThread());

И написать это надо в двух указанных выше местах кода.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
armixx
Дата 17.8.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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

PM MAIL   Вверх
jk1
Дата 17.8.2010, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Ага. А должно быть true в обоих случаях. Исправить это можно так: в том месте, где вы создаете окно вместо
Код

Frame myFrame = new MyFrame();

нужно написать
Код

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        Frame myFrame = new MyFrame();
    }
});



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
armixx
Дата 17.8.2010, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 16.8.2010

Репутация: нет
Всего: нет



Спасибо. Сделал. Получил сообщения
MyFrame: isEDT=true
change Model: isEDT=true
Всё равно не работает smile 


До этого сделал вот так:

   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) смена модели отрисовалась и опять всё зависло

PM MAIL   Вверх
jk1
Дата 17.8.2010, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



А зачем вам понадобился implements AWTEventListener? Есть подозрение что он просто зацикливается на обработке событий после такого


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.