Не могу понять поведение метода JPanel setBackground - PullRequest
0 голосов
/ 24 июня 2019

JPanel.setBackground метод ничего не делает (хотя атрибут opaque равен true), если super.paintComponent метод отца не вызывается.

Я читал много подобных вопросов здесь об этой проблемеи в каждом из них я нашел только решения без объяснений, которые помогли мне понять, почему метод setBackground при написании перед добавлением JPanel к JFrame меняет цвет фона JPanel, тогда как когда setBackground написано внутри paintComponent ничего не меняется (только при вызове метода отца paintComponent, как уже упоминалось).Это как-то связано с Graphics объектом?

Я попытался изменить атрибут JPanel opaque на true и, используя setBackground(COLOR.BLACK) в paintComponent() методе, который я переопределил в классекоторый расширяется JPanel

  paintComponent(Graphics g)
    {
      this.setOpaque(true);
      this.setBackground(COLOR.BLACK);
    }

Я ожидаю, что JPanel цвет фона будет черным

Вместо этого цвет фона по умолчанию

1 Ответ

1 голос
/ 24 июня 2019

Ну, во-первых, если вы используете метод 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 вызывается несколько раз иВы не можете контролировать, когда он будет вызываться, даже движение мыши или что-то еще вызовет перекрашивание панели.

...