Ну, во-первых, если вы используете метод paintComponent(Graphics g)
, первая строка, которую вы должны иметь внутри: super.paintComponent(g)
в противном случае вы разрываете цепочку краски.
Это позволитродительский компонент для рисования компонента по умолчанию, перед любые настройки, которые вы делаете для него.Если вы этого не сделаете, это все равно что нарисовать на листе бумаги, представьте круг, затем обрежьте этот круг, а затем попытайтесь нарисовать снаружи.
Вот более подробный ответна Как работает super.paintComponent(g)
Однако я бы не стал писать
this.setOpaque(true);
this.setBackground(COLOR.BLACK);
внутри метода paintComponent(...)
, так как он вызывается несколько раз, и вы можетене контролировать, когда это когда-либо будет вызвано.Я бы поместил эти строки в конструктор, если только вы не захотите изменить его позже в вашей программе, пока она будет рисоваться, в зависимости от состояния вашей программы или, возможно, градиента.
Для этой части:
почему метод setBackground при написании перед добавлением JPanel в JFrame меняет цвет фона JPanel
Честно говоря, я не понимаю, что вы имеете в виду.
Почему вы говорите, что если я не буду вызывать super.paintComponent (), он разорвет цепочку?Он по-прежнему рисует все формы и линии, которые я хочу, используя графический объект.
Из документов :
У JPanel
есть делегат пользовательского интерфейса, который выполняетФоновая живопись для себя.Вы вызываете его с помощью super.paintComponent(g)
, а мы пропускаем компонент Graphics
для предотвращения безвозвратных изменений, таких как Graphics.translate
Ваш JPanel
знает, как рисовать свои дочерние элементы, но требует некоторой помощи для рисования сам,и эта помощь исходит от ее родителя.
Когда я упоминал "разорвать цепь рисования", я не имел в виду, что ничто не закрасит, но что вы получите странное поведение, такое как у JPanel
фон исчезает или не устанавливается.
Кроме того, происходит что-то странное, если аргумент, который я посылаю методу setBackground, является случайным цветом (используя объект Random).JPanel меняет цвет очень быстро, хотя я ничего не делаю (не сворачиваю, не изменяю размер и т. Д.). Можете ли вы подумать, почему?
Как я уже говорил, paintComponent
вызывается несколько раз иВы не можете контролировать, когда он будет вызываться, даже движение мыши или что-то еще вызовет перекрашивание панели.