Вызов setVisible(true)
вызовет поток рассылки событий (EDT). После запуска все пользовательские интерфейсы обновления вызовов должны запускаться внутри EDT, например, позвонив по номеру SwingUtilities.invokeLater()
.
Существуют некоторые исключения из этого правила, заметно вызывающие обновления пользовательского интерфейса в конструкторах, когда объект не виден (следовательно, не отображается). Как только это становится видимым, такие вызовы должны быть отложены до EDT.
Таким образом, вы должны расположить свой GUI в конструкторе и вызывать setVisible(true)
только в конце, как только все будет готово к визуализации.
Как отмечает @camickr, все здания объекта пользовательского интерфейса также должны быть перенесены на EDT. Невыполнение этого требования может привести к неопределенному поведению (т. Е. Оно может работать или не работать, так как оно не указано в JSR)
Относительно почему это не показывалось, я снова цитирую комментарий @ camickr:
Причина, по которой код не работает, заключается в том, что компоненты добавляются после , когда отображается графический интерфейс. По умолчанию компоненты имеют размер по умолчанию (0, 0). Так что красить нечего. Если вы добавляете компоненты в видимый графический интерфейс, вам нужно revalidate()
и repaint()
Контейнер, в который был добавлен компонент, чтобы можно было вызвать диспетчер компоновки.