Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > NPE at java.awt.Window.pack()


Автор: coolin 26.3.2007, 07:27
java.lang.NullPointerException
    at java.awt.Dimension.<init>(Dimension.java:91)
    at java.awt.Component.getMaximumSize(Component.java:2343)
    at java.awt.Container.getMaximumSize(Container.java:1627)
    at javax.swing.JComponent.getMaximumSize(JComponent.java:1652)
    at javax.swing.BoxLayout.checkRequests(BoxLayout.java:435)
    at javax.swing.BoxLayout.preferredLayoutSize(BoxLayout.java:251)
    at javax.swing.JToolBar$DefaultToolBarLayout.preferredLayoutSize(JToolBar.java:769)
    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 java.awt.BorderLayout.layoutContainer(BorderLayout.java:798)
    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.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    at java.awt.Container.validateTree(Container.java:1480)
    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 java.awt.Window.pack(Window.java:495)

JFrame.pack();


иногда падает при паковке фрейма. Иногда при установке размеров. Зависимостей не нашел, похоже валиться от случая.
используеться jre 1.5.0_08

Автор: powerOn 26.3.2007, 08:17
На других версиях JDK пробовал выполнять?
Код можешь показать? Поскольку так совершенно непонятно что могло послужить причиной.

Автор: coolin 26.3.2007, 08:44
Проблема появилась с переходом с 1.4.0 на 1.5.0
код показать не могу, так как кода много. На фрейме несколько вкладок, на вкладках много элементов, используються все лэйауты. Построение всех компонентов происходит в нескольких десятков классов.
В инете есть несколько багов похожих на мой

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6337517
http://jalbum.net/forum/thread.jspa?threadID=1475&tstart=0&messageID=100158
http://line6.com/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=22&t=001076

но связи какими-то темами или еще с чем не нахожу...

Автор: coolin 26.3.2007, 09:10
складываеться впечатление что при построении лэйаута используеться не совершенный алгоритм, который время от времени сыпиться.

Автор: powerOn 26.3.2007, 09:14
Так трудно сказать в чем причина: в твоем ли коде ошибка или в JDK. Если можешь, то напиши небольшой пример, где это поведение имеет место, иначе, не видя кода, ничего сказать не получится.

Автор: coolin 26.3.2007, 09:39
Я допускаю что где-то неправильно сформирован лэйаут, но при этом должно быть соответсвуещее предупреждение (от JDK).

powerOn, наверное ты прав, нужно это воспроизвести на простом примере, может и решиться сразу.

Автор: w1nd 28.3.2007, 00:16
Причины этой и множества подобных ошибок в одом: вызов не из EDT. Уже чуть не на каждом заборе написано, что все свинговые компоненты рассчитаны на работу только в EDT и никак не защищены от конкурентных вызовов. Запомните: любые методы свинг-компонент можно вызывать только из EDT.

EDT - event dispatch thread

Автор: LSD 28.3.2007, 11:43
Цитата(w1nd @  28.3.2007,  00:16 Найти цитируемый пост)
Запомните: любые методы свинг-компонент можно вызывать только из EDT.

repaint() и revalidate() можно вызывать из любого потока.

Автор: coolin 3.4.2007, 11:44
да нужно быть внимательнее со свингом.

в тулбар засовывалиь кнопки и в процессе построения лэйаута им задавались размеры, перебирая все компоненты тулбара.
раз в 10 раз сам размер еще не был установлен, но флаг о его установке уже был *) - конкуренция потоков.
Присваил все размеры сразу - все ок.

всем пасиба  smile 

Автор: LSD 3.4.2007, 12:03
Не забывай помечать вопрос как решенный.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)