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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемы с setVisible(true) у JDialog, невоспроизводимая ошибка 
:(
    Опции темы
_Y_
  Дата 26.1.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



Странная проблема у меня возникла. Сделал я прогресс монитор на базе описанного в древней ветке этого форума. Чуть модифицировал, но незначительно. Весь код повторять не буду, только главное: самодельное модальное окошко с прогресс баром хранится в переменной JProgressDlg progress, а JProgressDlg это подкласс JDialog. Показывается же этот диалог таким образом:
Код

public void run() {    
        try {
            progress.setVisible(true);
        }
    });

Проблема в том, что, если повторно вызывать длительные вычисления "украшенные" этим монитором, вылезает ошибка. При этом ошибка вылезает не всегда (но чаще, чем не вылезает), да еще и разная, однако всегда указыает на строку progress.setVisible(true);

Вот примеры сообщений:
java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
.....
java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
.....
java.util.NoSuchElementException: Vector Enumeration
.....
java.util.NoSuchElementException: Vector Enumeration
.....
java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
.....
java.lang.ArrayIndexOutOfBoundsException: 3 >= 1
.....
java.lang.ArrayIndexOutOfBoundsException: 3 >= 2


Что за Array, что за Vector? Совершенно непонятно.

Подбросьте, пожалуйста, идею как ловить ошибку.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
powerOn
Дата 26.1.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(_Y_ @  26.1.2007,  21:19 Найти цитируемый пост)
public void run() {    
        try {
            progress.setVisible(true);
        }
    });


Что это за код такой? Что за блок try? Выкладывайте нормальный, на такое даже смотреть не хочется.


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



Цитата(powerOn @ 26.1.2007,  21:35)
Что это за код такой? Что за блок try? Выкладывайте нормальный, на такое даже смотреть не хочется.

Так он весь выложен. Сылка на другую ветку и там все целиком. Я привел только фрагмент, чтобы понятно было о какой строке я говорю.

Это сообщение отредактировал(а) _Y_ - 26.1.2007, 23:43


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
LSD
Дата 27.1.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(_Y_ @  26.1.2007,  23:43 Найти цитируемый пост)
Так он весь выложен. Сылка на другую ветку и там все целиком. Я привел только фрагмент, чтобы понятно было о какой строке я говорю.

Приведи полный стек трейс ошибки, и фрагмент кода где она возникает (с указанием строки).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
_Y_
Дата 29.1.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



Цитата(LSD @ 27.1.2007,  12:16)
Приведи полный стек трейс ошибки, и фрагмент кода где она возникает (с указанием строки).

Вот фрагмент кода. По существу тот же, что описал DarkDS только сделан абстрактным, чтобы разные его наследники выполняли разные вычисления и операции.
Код
/**
 * The class has been created modifying class WorkThread that was downloaded from 
 * http://forum.vingrad.ru/index.php?showtopic=46213&view=findpost&p=358160
 * (post of DarkDS 23.3.2005, 00:08).
 */
public abstract class ProgressMonitoredThread extends Thread {
    protected JProgressDlg progress;   
    //CONSTRUCTORS
    /**
     * This empty constructor is used if the same calculations have to be performed
     * without reflecting them by a progress monitor.
     */
    public ProgressMonitoredThread() {
    }
    public ProgressMonitoredThread(JProgressDlg progress) {    
         this.progress = progress;
    }
    //PUBLIC METHODS
    public void run() {    
        try {
           SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            progress.setVisible(true);
                        }
                    });
            //call method that actually performs the work
         performWork();        
            //DarkDS: Close the dialog
            SwingUtilities.invokeLater( new Runnable()  {
                    public void run()  {
                        progress.dispose();
                    }
                });
        }
        catch(Exception ex)
        {
         ex.printStackTrace();
        }
    }
    
    //PROTECTED METHODS
    
    /**
     * This method must be owerwritten in each sub-class. It should contain the time-consuming
     * procedure (multiple calculations, i/o, etc.). If the progress bar is NOT Indeterminate,
     * the method should contain calls of setProgressByInvokeLater(intValue) to update the bar.
     */
    protected abstract void performWork() throws InterruptedException;
    protected void setProgressByInvokeLater(int p) {
            final int pr = p
        SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        progress.setProgress(pr);
                    }
                });         
    }
}

Ошибки же выглядят так:
Exception occurred during event dispatching:
java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
    at java.util.Vector.elementAt(Vector.java:432)
    at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:276)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1968)
    at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1895)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
    at javax.swing.JComponent.paintComponent(JComponent.java:742)
    at javax.swing.JComponent.paint(JComponent.java:1005)
    at javax.swing.JComponent.paintChildren(JComponent.java:842)
    at javax.swing.JComponent.paint(JComponent.java:1014)
    at javax.swing.JViewport.paint(JViewport.java:728)
    at javax.swing.JComponent.paintChildren(JComponent.java:842)
    at javax.swing.JComponent.paint(JComponent.java:1014)
    at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4963)
    at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4916)
    at javax.swing.JComponent._paintImmediately(JComponent.java:4859)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4666)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:451)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:114)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:153)
    at java.awt.Dialog$1.run(Dialog.java:517)
    at java.awt.Dialog$2.run(Dialog.java:545)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Dialog.show(Dialog.java:543)
    at java.awt.Component.show(Component.java:1300)
    at java.awt.Component.setVisible(Component.java:1253)
    at atherodecode.ProgressMonitoredThread$1.run(ProgressMonitoredThread.java:51)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Единственная строка в стеке, указывающая на мой код, выделена жирным шрифтом. Строка 51 это
Код
progress.setVisible(true);

Вот другой вариант: ругается два раза подряд:
Exception occurred during event dispatching:
java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
    at java.util.Vector.elementAt(Vector.java:432)
    at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:276)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1968)
    at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1895)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
    at javax.swing.JComponent.paintComponent(JComponent.java:742)
    at javax.swing.JComponent.paint(JComponent.java:1005)
    at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4963)
    at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4916)
    at javax.swing.JComponent._paintImmediately(JComponent.java:4859)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4666)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:451)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:114)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:153)
    at java.awt.Dialog$1.run(Dialog.java:517)
    at java.awt.Dialog$2.run(Dialog.java:545)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Dialog.show(Dialog.java:543)
    at java.awt.Component.show(Component.java:1300)
    at java.awt.Component.setVisible(Component.java:1253)
    at atherodecode.ProgressMonitoredThread$1.run(ProgressMonitoredThread.java:51)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Exception occurred during event dispatching:
java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
    at java.util.Vector.elementAt(Vector.java:432)
    at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:276)
    at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:337)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
    at javax.swing.JComponent.paintComponent(JComponent.java:742)
    at javax.swing.JComponent.paint(JComponent.java:1005)
    at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4963)
    at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4916)
    at javax.swing.JComponent._paintImmediately(JComponent.java:4859)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4666)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:451)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:114)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:153)
    at java.awt.Dialog$1.run(Dialog.java:517)
    at java.awt.Dialog$2.run(Dialog.java:545)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Dialog.show(Dialog.java:543)
    at java.awt.Component.show(Component.java:1300)
    at java.awt.Component.setVisible(Component.java:1253)
    at atherodecode.ProgressMonitoredThread$1.run(ProgressMonitoredThread.java:51)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)


А вот вариант, когда недовольна не Array-ем, Vector-ом:
Exception occurred during event dispatching:
java.util.NoSuchElementException: Vector Enumeration
    at java.util.Vector$1.nextElement(Vector.java:308)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(BasicTableHeaderUI.java:475)
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1615)
    at javax.swing.ViewportLayout.preferredLayoutSize(ViewportLayout.java:78)
    at java.awt.Container.preferredSize(Container.java:1558)
    at java.awt.Container.getPreferredSize(Container.java:1543)
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1617)
    at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:702)
    at java.awt.Container.layout(Container.java:1401)
    at java.awt.Container.doLayout(Container.java:1390)
    at java.awt.Container.validateTree(Container.java:1473)
    at java.awt.Container.validate(Container.java:1448)
    at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:379)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:113)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:153)
    at java.awt.Dialog$1.run(Dialog.java:517)
    at java.awt.Dialog$2.run(Dialog.java:545)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Dialog.show(Dialog.java:543)
    at java.awt.Component.show(Component.java:1300)
    at java.awt.Component.setVisible(Component.java:1253)
    at atherodecode.ProgressMonitoredThread$1.run(ProgressMonitoredThread.java:51)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Exception occurred during event dispatching:
java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
    at java.util.Vector.elementAt(Vector.java:432)
    at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:276)
    at javax.swing.JTable$2.getMidPointAt(JTable.java:2403)
    at javax.swing.JTable$5.getLowerBoundAt(JTable.java:2501)
    at javax.swing.JTable.adjustSizes(JTable.java:2523)
    at javax.swing.JTable.adjustSizes(JTable.java:2507)
    at javax.swing.JTable.setWidthsFromPreferredWidths(JTable.java:2419)
    at javax.swing.JTable.doLayout(JTable.java:2307)
    at java.awt.Container.validateTree(Container.java:1473)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validate(Container.java:1448)
    at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:379)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:113)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:153)
    at java.awt.Dialog$1.run(Dialog.java:517)
    at java.awt.Dialog$2.run(Dialog.java:545)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Dialog.show(Dialog.java:543)
    at java.awt.Component.show(Component.java:1300)
    at java.awt.Component.setVisible(Component.java:1253)
    at atherodecode.ProgressMonitoredThread$1.run(ProgressMonitoredThread.java:51)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)


Как я уже писал, может и вообще не ругаться. Непонятно мне как ловить такую ошибку smile 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
LSD
Дата 29.1.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Судя по ошибке проблема в DefaultTableColumnModel, т.е. в таблице а не прогрес баре.
Ты используешь какую нибудь JTable с самописной моделью?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
_Y_
Дата 29.1.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



Цитата(LSD @ 29.1.2007,  12:18)
Судя по ошибке проблема в DefaultTableColumnModel, т.е. в таблице а не прогрес баре.
Ты используешь какую нибудь JTable с самописной моделью?

1) Рассчет действительно берет данные из одной навороченной JTable и пишет в другую навороченную JTable. Но модели там только DefaultTableModel.

2) Рассчет у меня вызывается так, как описано у DarkDS:
Код

            JProgressDlg dlg = new JProgressDlg(mainFrame, "Calculate Pvalues");
            ThreadCalculatePvalues threadCalculatePvalues = new ThreadCalculatePvalues(dlg);
            threadCalculatePvalues.start();

Как Вы понимаете, ThreadCalculatePvalues здесь подкласс ProgressMonitoredThread.

Если же я, в порядке теста, изменяю код так, чтобы вести рассчет не показывая прогресс монитор:
Код

         ThreadCalculatePvalues threadCalculatePvalues = new ThreadCalculatePvalues();
            try {
                threadCalculatePvalues.performWork();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

никакой ошибки не возникает. Обе таблицы прекрасно работают. Т.е. метод performWork(), занимающийся рассчетом и обращающийся к таблицам, сам по себе работает без проблем.




--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
_Y_
Дата 29.1.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



Эксперименты показывают, что ошибка возникает не когда окошку прогресс монитора действительно присваивается значение setVisible(true), а когда уже рассчеты отработаны. Видимо, когда окошко это пора закрыть. И, самое смешное, что окошко все равно закрывается и никаких проблем ни с рассчетами, ни с таблицами не наблюдается.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
w1nd
Дата 29.1.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

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



Stacktrace показывает, что какая-то таблица пытается нарисовать себя одновременно с изменением модели этой таблицы в другом потоке. Блокируйте EventDispatchThread в момент изменения.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
_Y_
Дата 29.1.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



Цитата(w1nd @ 29.1.2007,  15:37)
Stacktrace показывает, что какая-то таблица пытается нарисовать себя одновременно с изменением модели этой таблицы в другом потоке. Блокируйте EventDispatchThread в момент изменения.

По логике вещей (в моей программе) Ваше предположение выглядит правильно. Дело в том, что рассчет запускается по клику на закладке у JTabbedPane и таблица, содержание которой изменяется, находится именно на открываемой закладке. Но встает вопрос: а КАК грамотно заблокировать EventDispatchThread? Форум обыскал - не нашел. 

ЗЫ: В порядке эксперимента вставил в свой код Thread.sleep там где вызывается поток рассчетов:
Код

JProgressDlg dlg = new JProgressDlg(mainFrame, "Calculate Pvalues");
ThreadCalculatePvalues threadCalculatePvalues = new ThreadCalculatePvalues(dlg);
threadCalculatePvalues.start();
    
try {
    Thread.sleep(120000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

Ошибка вроде больше не появляется. Но это, конечно, не решение т.к. блокируется GUI.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
w1nd
Дата 29.1.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

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



Цитата(_Y_ @ 29.1.2007,  16:48)
Но встает вопрос: а КАК грамотно заблокировать EventDispatchThread? Форум обыскал - не нашел.

Блокировка EDT (Event Dispatch Thread) блокирует GUI, разумеется. Если операция длительная, разбейте её на короткие. Блокируется так:
Код
synchronized (component.getTreeLock()) {
    ... // ваше обновление таблицы
}



Это сообщение отредактировал(а) w1nd - 29.1.2007, 21:30


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
LSD
Дата 29.1.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



А как данные в этих JTable меняются? С использованием InvokeLater или без?
Дело в том, что DefaultTableModel не синхронизированна.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
_Y_
Дата 30.1.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



Цитата(LSD @ 29.1.2007,  22:27)
А как данные в этих JTable меняются? С использованием InvokeLater или без?

Честно говоря, я в этот раз еще слабо разобрался в тонкостях потоков. Поэтому на вопрос ответить трудно. Пишу что кого как вызывает:
1). Имеется GUI на нем JTabbedPane с закладками. На закладках таблицы. Огромные и поэтому работа с ними требует времени.
2) По клику на второй закладке проверяется были ли внесены изменения в первую таблицу и, если да, идет пересчет значений для рассчета второй таблицы (находящейся на второй закладке). Тут то и нужен прогресс монитор.
3) Создаю JProgressDlg dlg как видно из приведенного раньше кода, передаю его объекту класса ThreadCalculatePvalues, т.е. подклассу ProgressMonitoredThread.  
4) Класс ThreadCalculatePvalues содержит метод performWork(), который, в частности, изменяет содержимое второй таблицы. Изменение происходит просто присвоением нового вектора данных:
Код

Vector data = new Vector();
//Заполнение data векторами строк
.....
table2.setData(data);
 
Т.е. эти действия происходят в потоке принадлежащем объекту класса ThreadCalculatePvalues. По версии, основанной на любезном ответе w1nd, довольно часто в это же время Event Dispatch Thread меняет закладку и .... ошибка smile 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
LSD
Дата 30.1.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Код
Vector data = new Vector();
//Заполнение data векторами строк
.....
table2.setData(data);

1. Происходят ли изменения в data после того как он был установлен в table2?
2. Если сделать так:
Код
Vector data = new Vector();
//Заполнение data векторами строк
SwingUtilities.invokeLater(new Runnable()
{
  public void run()
  {
    table2.setData(data);
  }
});

ошибка останется?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
_Y_
Дата 30.1.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



Цитата(LSD @ 30.1.2007,  12:01)
1. Происходят ли изменения в data после того как он был установлен в table2?

Нет, до того таблица заполнена другим вектором данных.

Цитата(LSD @ 30.1.2007,  12:01)
2. Если сделать так:
Код
Vector data = new Vector();
//Заполнение data векторами строк
SwingUtilities.invokeLater(new Runnable()
{
  public void run()
  {
    table2.setData(data);
  }
});

ошибка останется?

Попробовал. Пришлось сделать final Vector data = new Vector(); Получилось!!!!  Раз 50 кликнул да еще и с разными наборами данных - ошибка не лезетsmile

LSD, w1nd! Огромное спасибо! 

Последний вопрос уже чисто для повышения моего образовательного уровня: Почему все-таки единственная строка программы, на которую показывал стек ошибок была progress.setVisible(true); а не table2.setData(data);?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0880 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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