Ну, простыми словами:
Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.
Итак, как это решить:
if (i == null) {
// Handle this
}
Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);
Вам нужно вызвать repaint()
и revalidate()
. Первый говорит Swing, что область окна грязная (что необходимо для удаления изображения старых детей, удаленных с помощью removeAll()
); последний сообщает менеджеру компоновки пересчитать макет (что необходимо при добавлении компонентов). Это должно привести к тому, что children панели будут перерисовываться, но не могут заставить панель сделать это (см. this для списка триггеров repaint).
В более общем примечании: вместо повторного использования исходной панели я бы рекомендовал создать новую панель и поменять ее у родителя.
revalidate
вызывается в контейнере после добавления новых компонентов или удаления старых. этот вызов является инструкцией, чтобы сообщить диспетчеру макета сбросить его на основе нового списка компонентов. revalidate
вызовет вызов, чтобы перекрасить то, что компонент считает «грязными регионами». Очевидно, что не все области на вашем JPanel
считаются грязными RepaintManager
.
repaint
используется, чтобы сообщить компоненту перекрасить себя. Часто бывает так, что вам нужно позвонить этому, чтобы очистить условия, такие как ваши.
Каждый раз, когда вы выполняете remove () или removeAll (), вы должны вызвать
validate();
repaint();
после завершения добавления () новых компонентов.
Вызов validate () или revalidate () является обязательным, когда вы делаете remove () - см. Соответствующие javadocs.
Мое собственное тестирование указывает, что также требуется перерисовать (). Я точно не знаю, почему.
revalidate()
просто запросить компоновку контейнера, когда вы столкнулись просто с вызовом revalidate()
, это может быть вызвано обновлением границ дочерних компонентов, триггерами repaint()
, когда их границы изменяются во время повторной компоновки. В случае, о котором вы упомянули, только удаленный компонент и никакие границы компонентов изменены, в этом случае нет repaint()
«случайно».
да вам нужно вызвать repaint (); перепроверить (); когда вы вызываете removeAll (), вы должны вызвать repaint () и revalidate ()