2011-07-15 2 views
4

У кого-нибудь есть идея, как я мог бы начать отладку этой ошибки в Java Swing?NullPointerException в BoxLayout

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at javax.swing.BoxLayout.preferredLayoutSize(BoxLayout.java:282) 
    at java.awt.Container.preferredSize(Container.java:1599) 
    at java.awt.Container.getPreferredSize(Container.java:1584) 
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1636) 
    at java.awt.BorderLayout.layoutContainer(BorderLayout.java:804) 
    at java.awt.Container.layout(Container.java:1421) 
    at java.awt.Container.doLayout(Container.java:1410) 
    at java.awt.Container.validateTree(Container.java:1507) 
    at java.awt.Container.validateTree(Container.java:1513) 
    at java.awt.Container.validate(Container.java:1480) 
    at javax.swing.plaf.basic.BasicTabbedPaneUI.ensureCurrentLayout(BasicTabbedPaneUI.java:1429) 
    at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabBounds(BasicTabbedPaneUI.java:1449) 
    at javax.swing.plaf.synth.SynthTabbedPaneUI.setRolloverTab(SynthTabbedPaneUI.java:491) 
    at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.layoutContainer(BasicTabbedPaneUI.java:2384) 
    at java.awt.Container.layout(Container.java:1421) 
    at java.awt.Container.doLayout(Container.java:1410) 
    at java.awt.Container.validateTree(Container.java:1507) 
    at java.awt.Container.validate(Container.java:1480) 
    at javax.swing.plaf.basic.BasicTabbedPaneUI.ensureCurrentLayout(BasicTabbedPaneUI.java:1429) 
    at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabBounds(BasicTabbedPaneUI.java:1449) 
    at javax.swing.plaf.synth.SynthTabbedPaneUI.setRolloverTab(SynthTabbedPaneUI.java:498) 
    at javax.swing.plaf.basic.BasicTabbedPaneUI.setRolloverTab(BasicTabbedPaneUI.java:558) 
    at javax.swing.plaf.basic.BasicTabbedPaneUI.access$2000(BasicTabbedPaneUI.java:37) 
    at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.mouseMoved(BasicTabbedPaneUI.java:3645) 
    at java.awt.Component.processMouseMotionEvent(Component.java:6333) 
    at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3285) 
    at java.awt.Component.processEvent(Component.java:6057) 
    at java.awt.Container.processEvent(Container.java:2041) 
    at java.awt.Component.dispatchEventImpl(Component.java:4651) 
    at java.awt.Container.dispatchEventImpl(Container.java:2099) 
    at java.awt.Component.dispatchEvent(Component.java:4481) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4251) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) 
    at java.awt.Container.dispatchEventImpl(Container.java:2085) 
    at java.awt.Window.dispatchEventImpl(Window.java:2478) 
    at java.awt.Component.dispatchEvent(Component.java:4481) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643) 
    at java.awt.EventQueue.access$000(EventQueue.java:84) 
    at java.awt.EventQueue$1.run(EventQueue.java:602) 
    at java.awt.EventQueue$1.run(EventQueue.java:600) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
    at java.awt.EventQueue$2.run(EventQueue.java:616) 
    at java.awt.EventQueue$2.run(EventQueue.java:614) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:613) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

Он выброшен из этого метода в BoxLayout (линия size = ...)

public Dimension preferredLayoutSize(Container target) { 
Dimension size; 
synchronized(this) { 
    checkContainer(target); 
    checkRequests(); 
    size = new Dimension(xTotal.preferred, yTotal.preferred); 
} 
+1

Можно ли увидеть код – RMT

+0

Где xTotal и yTotal инициализированы? – RMT

+0

эта ошибка происходит от GUI startUp или когда вы переключаете ... RTM +1 – mKorbel

ответ

3

Расширение менеджера компоновки для обеспечения синхронизации вряд ли будет эффективным. Убедитесь, что все Компоненты GUI построены на the event dispatch thread. Аналогично, убедитесь, что все модели данных обновлены на the event dispatch thread, используя invokeLater() или SwingWorker.

+0

Я думаю, что я использую 'invokeLater' всякий раз, когда я добавляю компоненты или редактирую их, но не при обновлении моделей. Я думал, что там не нужно. –

+0

«Обратите внимание, что он безопасен для изменения таблицыModel внутри метода процесса, потому что он вызывается в _Event Dispatch Thread_.» - [SwingWorker] (http://download.oracle.com/javase/6/docs/api/javax /swing/SwingWorker.html) – trashgod

+0

trashgod just revalidate() + repaint(); repaint будет создавать EDT по умолчанию, не так ли, но этот поток не ясен для меня, OPs и каждый столбец - это кадры в темноте, потому что невидимый контейнер всегда возвращает null, только getPrefferedSize может возвращать это, мое мнение ничего для вашего добрый человек :-) для альтернативы +1 – mKorbel

0

Если вы можете добраться до этой линии, то вполне вероятно, что xTotal.preferred имеет нулевое значение, или yTotal.preferred является ноль.

+0

Очевидно: p Но это действительно не помогает. –

+0

Вы спросили, как вы можете начать отладку ... это начало :) Что бы я сделал, это установить там точку останова, а затем проверить переменные. Если значение равно null, вам нужно отследить, где они инициализированы, и выяснить, почему. –

1

От количества кода, я могу видеть, я бы предположил, что вы пытаетесь сделать материал с поворотной coponents без использования event dispatch thread ..

Это вызывает уродливые исключения, как один из приведенной выше. У меня была эта проблема в проекте, и я понял, что слишком поздно, чтобы иметь возможность исправить это, поэтому я просто положил все в try cat и не распечатывал всю трассировку стека ...

Если это действительно проблема, может, возможно, поймать и игнорировать пустые исключения указателя ..

Лучший подход заключается в использовании события отправки сообщения

+0

P.s Я считаю, что ваш код может быть fucntional, и измерение может быть создано после того, как исключение не остановит выполнение ... Возможно, я тоже ошибаюсь :) –

+0

+1 для EDT; без него заказ ненадежен. – trashgod

1

Поскольку ошибка произошла «внутри» Swing (только классы), я бы очень внимательно рассмотрел мой код, чтобы убедиться, что все мои вызовы Swing происходят на EDT.