Установка Focusable Window на JPanel из другого командного класса JPanel by Frame не работает [дублировать]

Ну, простыми словами:

Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

195
задан Ben 20 October 2011 в 13:17
поделиться

5 ответов

Вам нужно вызвать repaint() и revalidate(). Первый говорит Swing, что область окна грязная (что необходимо для удаления изображения старых детей, удаленных с помощью removeAll()); последний сообщает менеджеру компоновки пересчитать макет (что необходимо при добавлении компонентов). Это должно привести к тому, что children панели будут перерисовываться, но не могут заставить панель сделать это (см. this для списка триггеров repaint).

В более общем примечании: вместо повторного использования исходной панели я бы рекомендовал создать новую панель и поменять ее у родителя.

147
ответ дан kdgregory 28 August 2018 в 00:25
поделиться

revalidate вызывается в контейнере после добавления новых компонентов или удаления старых. этот вызов является инструкцией, чтобы сообщить диспетчеру макета сбросить его на основе нового списка компонентов. revalidate вызовет вызов, чтобы перекрасить то, что компонент считает «грязными регионами». Очевидно, что не все области на вашем JPanel считаются грязными RepaintManager.

repaint используется, чтобы сообщить компоненту перекрасить себя. Часто бывает так, что вам нужно позвонить этому, чтобы очистить условия, такие как ваши.

56
ответ дан akf 28 August 2018 в 00:25
поделиться

Каждый раз, когда вы выполняете remove () или removeAll (), вы должны вызвать

  validate();
  repaint();

после завершения добавления () новых компонентов.

Вызов validate () или revalidate () является обязательным, когда вы делаете remove () - см. Соответствующие javadocs.

Мое собственное тестирование указывает, что также требуется перерисовать (). Я точно не знаю, почему.

81
ответ дан Noel Grandin 28 August 2018 в 00:25
поделиться

revalidate() просто запросить компоновку контейнера, когда вы столкнулись просто с вызовом revalidate(), это может быть вызвано обновлением границ дочерних компонентов, триггерами repaint(), когда их границы изменяются во время повторной компоновки. В случае, о котором вы упомянули, только удаленный компонент и никакие границы компонентов изменены, в этом случае нет repaint() «случайно».

2
ответ дан Poorna Senani Gamage 28 August 2018 в 00:25
поделиться

да вам нужно вызвать repaint (); перепроверить (); когда вы вызываете removeAll (), вы должны вызвать repaint () и revalidate ()

-3
ответ дан Som Adhikari 28 August 2018 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: