Вызовите super.paintComponent()
в начале вашего вызова метода, чтобы дескриптор Swing рисовал остальную часть компонента.См. Эту статью для получения дополнительной информации о компонентах рисования в Swing .Но в основном метод paintComponent()
выполняет реальную работу, рисуя компоненты, которые вы пытаетесь отобразить, и все они отключаются при переопределении.Позвонив по номеру super.paintComponent()
, вы заставляете Swing делать то, что нужно, чтобы все правильно нарисовать, , а затем он также рисует то, что вы хотите нарисовать.
Обновление Мне интересно, не связано ли это с вашей логикой в отношении "нажал".Когда вы звоните repaint()
, он перерисовывает всю панель с нуля.Это означает, что если вы хотите, чтобы что-то сохранялось с течением времени, вам нужно либо a) не вызывать repaint, ни позволять Swing вызывать repaint, например, изменяя размер окна;или б) убедитесь, что ваш метод перекраски всегда рисует то, что вы хотите.Вообще говоря, б) - лучший подход, так как он более устойчивый.
Поэтому я хотел бы, чтобы вы попытались реструктурировать свой код так, чтобы он не имел никаких условий в методе paintComponent()
, так что независимо от того, сколькораз он вызывается, объект все равно рисуется.
Проблема, с которой вы можете столкнуться (вероятно, именно поэтому вы структурировали свой код так, как вы это сделали), - это время, необходимое для создания объекта, который вы хотите нарисоватьможет быть слишком долго, чтобы оправдать перерисовку все время.Если это проблема, вам нужно переделать логику вашей программы так, чтобы вы вычислили то, что хотите нарисовать в другом потоке (см. SwingUtilities.invokeLater()
), а затем, когда вы вызываете paintComponent()
, просто рисуете ранее вычисленное значение.