Кто звонит в paintComponent? - PullRequest
3 голосов
/ 20 августа 2010

По какой-то причине мой метод paintComponent (Graphics g) вызывается бесконечно.Кажется, я не могу сказать, кто звонит, даже если я сбросил StackTrace в вызове (это событие отправляется и обрабатывается).

Есть ли какие-нибудь простые способы выяснить, кто вызывает событие?

Обновление: Я нашел причину и теперь я понимаюпричина.Тот, кто ответит правильно, получит ответ на вопрос.

Вот код, который вызывает проблему:

@Override
public void paintComponent(Graphics g)
{
    myJButton.setIcon(ResourceLoader.getImageIconWithLocale(MY_BUTTON_IMAGE));
    super.paintComponent(g);
}

К вашему сведению: Это действительно сложный вопрос !!Это не очевидно, глядя на код.Я сделал предположение, что это неправильно.

Ответы [ 4 ]

2 голосов
/ 21 августа 2010

Я не знаю, какой это компонент, но установка значка на кнопке из рутины рисования - плохая идея. Это определенно приведет к перекрашиванию кнопки. Если кнопка является дочерней по отношению к вашему компоненту, то установка этой кнопки также делает компонент недействительным, вызывая бесконечный цикл.

Установите значок где-нибудь еще, например, где диалоговое окно / окно изначально установлено.

1 голос
/ 21 августа 2010

setIcon (ImageIcon) выполнит повторную проверку и перерисовает себя ONLY , если ImageIcon - это другой экземпляр.

При работе с языковыми стандартами большинство людей используютResourceBundle, который возвращает строки, которые, в свою очередь, являются неизменяемыми.Поэтому установка текста снова и снова не имеет значения.

Однако в этом случае ResourceLoader (пользовательский класс) возвратил новый экземпляр ImageIcon.Конечно, это был тот же образ, но это был другой экземпляр.И если вы декомпилируете код, вы увидите, что setIcon (по крайней мере, для JButtons) будет перерисован и повторно проверен, если newIcon! = OldIcon.

Решением было использование HashMap в ResourceLoader, таким образом он избавляет от загрузки изображений более одного раза, так как большинство изображений используются очень часто (могут также использовать экземпляры повторно, если можете).Оказывается, что в целом эта быстрая настройка также сэкономила приличный объем общего потребления памяти в качестве дополнительного бонуса.

0 голосов
/ 21 августа 2010

Проблема в том, что вы устанавливаете значок в методе paintComponent ().Вы никогда не должны устанавливать свойство в этом методе.

Компоненты Swing достаточно умны, чтобы перекрашиваться при изменении свойства.В этом случае у вас есть проблема с перекрашиванием самого компонента, потому что Icon изменяется, но вы также перечитываете Icon каждый раз, когда компонент перерисовывает себя, что также не очень эффективно.

0 голосов
/ 20 августа 2010

Вы звоните repaint() куда-нибудь? Кроме того, когда окно становится видимым (непокрытым или уменьшенным) или изменяется его размер, «система» автоматически вызывает метод paintComponent() для всех областей экрана, которые необходимо перерисовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...