Как устранить ошибку графического интерфейса Swing?

Я работаю над приложением Swing, вроде все работает хорошо, но недавно я столкнулся с некоторыми проблемами с графическим интерфейсом. Проблема в том, что когда я открываю JinternalFrame внутри другого, он работает нормально, но когда я открываю его снова, дочерний JintenalFrame теряет контроль над собой, макет утерян или, возможно, уничтожен, у меня есть несколько фотографий, которые ясно объясняют проблему:

введите описание изображения здесь

Вот это первый JinternalFrame, и когда я нажимаю кнопку обновления, внутри него появляется второй, например:

введите описание изображения здесь

Но когда я закрываю второй и открываю его снова, проблема выглядит так: введите описание изображения здесь

И IDE вызывает упоминание NPE:

Hibernate: select modalite0_.id_mod as id1_6_, modalite0_.libele as libele6_ from   
Modalite modalite0_
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.JTable.prepareRenderer(JTable.java:5735)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2016)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at javax.swing.JComponent.paintComponent(JComponent.java:778)
at javax.swing.JComponent.paint(JComponent.java:1054)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JViewport.paint(JViewport.java:731)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:585)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JComponent.paintChildren(JComponent.java:887)
at javax.swing.JComponent.paint(JComponent.java:1063)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:585)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)

Итак, я спрашиваю, есть ли способ отследить эту ошибку?

Я использую Netbeans7.2 как ide с jre 7.


person Zakaria Marrah    schedule 15.03.2013    source источник
comment
пожалуйста, вставьте межкадровый код ur. Я хочу посмотреть, как вы создаете jinternalframe   -  person Biswajit    schedule 15.03.2013
comment
Подобные вещи обычно обновляют графический интерфейс за пределами потока отправки событий (EDT). По сути, если вы обновляете в любом потоке, кроме выделенного EDT Swing, вы не можете гарантировать, что он будет работать. Есть ли в вашем коде какие-либо другие темы?   -  person Ash    schedule 15.03.2013
comment
пожалуйста, покажите код, но вы устанавливаете опцию DISPOSE_ON_CLOSE ???   -  person Bruce Martin    schedule 15.03.2013
comment
Похоже, вы назначили нулевое средство визуализации одному из столбцов таблицы или что один из классов столбцов, возвращаемых моделью таблицы, имеет значение NULL.   -  person JB Nizet    schedule 15.03.2013
comment
@JB Nizet, это довольно распространенная проблема с prepareRenderer и обновлениями модели вне EDT,   -  person mKorbel    schedule 15.03.2013
comment
И что мне делать, чтобы избавиться от этой проблемы?   -  person Zakaria Marrah    schedule 15.03.2013
comment
Попробуйте вызвать setVisible (false) вместо вызова dispose. Кроме того, попробуйте воссоздать новый кадр по мере необходимости вместо того, чтобы пытаться использовать его повторно.   -  person MadProgrammer    schedule 15.03.2013
comment
Что касается вызова JinternalFrame, новый экземпляр, конечно, создается, и я сделал то, что вы только что сказали мне о вызове setVisible (false) в closeOperation, но ситуация остается той же.   -  person Zakaria Marrah    schedule 15.03.2013
comment
Когда я выбираю флажок, который указан в середине JTable, запускается NPE, если я выбираю все строки или первую, он работает нормально, означает ли это, что модель таблицы вызывает проблему?   -  person Zakaria Marrah    schedule 15.03.2013
comment
Второй кадр должен быть JDialog. Все, что появляется и закрывается нажатием кнопки, является диалогом. Первый кадр должен быть JPanel. В вашем приложении должен быть один и только один JFrame.   -  person Gilbert Le Blanc    schedule 15.03.2013
comment
Хорошо, спасибо, я над этим работаю.   -  person Zakaria Marrah    schedule 15.03.2013
comment
См. Также Использование нескольких JFrames, хорошая / плохая практика?   -  person Andrew Thompson    schedule 16.03.2013


Ответы (1)


@Zakaria Marrah

  • создать JDialog для всплывающего окна, только один JDialog для всего экземпляра JVM, предполагая, что в один момент может быть видно только одно всплывающее окно, установить надлежащий JDialog.setDefaultCloseOperations(HIDE_ON_CLOSE)

  • создать JPanel, в который вложены все JComponents

  • добавить / инициализировать XxxTableModel в JTable, неверно закодированный рендерер и с пустой моделью, вызывающей exceptions из prepareRenderer для всех жестко закодированных ссылок, отливок, сравнения значений, затем необходимо проверить, содержит ли модель данные внутри prepareRenderer, если они переданы, то позволяет работать в рендерере

  • неправильно закодированы renderer и вместе с обновлениями вне EDT, вызывающими исключения из prepareRenderer для всех жестко закодированных ссылок, приведений, сравнений значений,


  • теперь вы будете играть только видимым образом за JDialog и его содержимое

  • скрыть JDialog,

  • используйте CardLayout в случае, если есть несколько представлений, установите, чтобы переключиться на правильную карту,

  • удалить все значения из JComponent (s) или удалить все данные из model (s),

  • никогда не сбрасывать, повторно инициализировать или воссоздавать что-либо на объектах,

  • используйте SwingWorker для данных из любых внешних источников, прослушивая с помощью PropertyChangeListener, нужно проверить, чтобы проверить exceptions by using get() в done ()

  • установить значение (или используя пакет в process, publish) в done() на JComponents, его models

  • затем вызовите JDialog.pack(), переместите JDialog к нужным координатам на экране (относительно JComponents), к Point, а затем, чтобы показать JDialog, завернутый в invokeLater(required)


  • чтобы производственный код использовал Runnable#Thread, но весь вывод в графический интерфейс Swing должен быть заключен в invokeLater, вы можете игнорировать то, что некоторые методы объявлены для Swing as thread safe
person mKorbel    schedule 15.03.2013