У меня есть элемент, который, как представляется, постоянно перерисовывается, когда он существует, что приводит к тому, что CPU будет всплескиваться всякий раз, когда он находится в любом из моих окон. Он непосредственно наследуется от JLabel, и в отличие от других JLabels на экране он имеет красный фон и границу. У меня нет идеи, почему это будет достаточно для того, чтобы постоянно перекрашивать. CallStack выглядит следующим образом:Почему эта JLabel постоянно перекрашивает?
Thread [AWT-EventQueue-1] (Suspended (breakpoint at line 260 in sItem))
sItem.paint(Graphics) line: 260
sItem(JComponent).paintToOffscreen(Graphics, int, int, int, int, int, int) line: 5124
RepaintManager$PaintManager.paintDoubleBuffered(JComponent, Image, Graphics, int, int, int, int) line: 1475
RepaintManager$PaintManager.paint(JComponent, JComponent, Graphics, int, int, int, int) line: 1406
RepaintManager.paint(JComponent, JComponent, Graphics, int, int, int, int) line: 1220
sItem(JComponent)._paintImmediately(int, int, int, int) line: 5072
sItem(JComponent).paintImmediately(int, int, int, int) line: 4882
RepaintManager.paintDirtyRegions(Map<Component,Rectangle>) line: 803
RepaintManager.paintDirtyRegions() line: 714
RepaintManager.seqPaintDirtyRegions() line: 694 [local variables unavailable]
SystemEventQueueUtilities$ComponentWorkRequest.run() line: 128
InvocationEvent.dispatch() line: 209
summitEventQueue(EventQueue).dispatchEvent(AWTEvent) line: 597
summitEventQueue(SummitHackableEventQueue).dispatchEvent(AWTEvent) line: 26
summitEventQueue.dispatchEvent(AWTEvent) line: 62
EventDispatchThread.pumpOneEventForFilters(int) line: 269
EventDispatchThread.pumpEventsForFilter(int, Conditional, EventFilter) line: 184
EventDispatchThread.pumpEventsForHierarchy(int, Conditional, Component) line: 174
EventDispatchThread.pumpEvents(int, Conditional) line: 169
EventDispatchThread.pumpEvents(Conditional) line: 161
EventDispatchThread.run() line: 122 [local variables unavailable]
Это в основном просто постоянно поражает, что снова и снова так быстро, как я могу нажать продолжить. Код, который является «уникальным» для этой конкретной этикетки выглядит примерно так:
bgColor = OurColors.clrWindowTextAlert;
textColor = Color.white;
setBackground(bgColor);
setOpaque(true);
setSize(150, getHeight());
Border border_warning = BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder(1, 1, 1, 1, OurColors.clrXBoxBorder),
Global.border_left_margin);
setBorder(border_warning);
Это, очевидно, делает больше, но этот конкретный блок существует только для этих меток, которые вызывают всплеск/непрерывные перекрашивать.
Любые идеи, почему он будет перекрасить этот ярлык?
Отличные идеи, но для задействования логики требуется, чтобы они были установлены в контуре рендеринга, к сожалению. Есть все виды логики, которые заставляют вещи выглядеть/вести себя по-другому. Вы определенно находились на правильном пути, хотя создание этой границы в цикле рендеринга кажется проблемой (см. Мой ответ). Не понимаю почему. – Morinar
Логика для установки таких элементов не обязательно должна быть в методе paint(), поэтому установка за пределами метода рисования вызовет вызов метода paint. Подумайте об этом, когда вы рисуете что-то, вы не передумаете о том, что вы рисуете, потому что тогда вам нужно будет перерисовать его. Если эта метка должна быть изменена, ее следует выполнить перед ее рисованием, а затем изменение (правильно) вызовет необходимость перерисовать. –
Я уверен, что вы правы, но этот код работает в течение 10-ти лет, и я не собираюсь бросать ключ в вещи. Спасибо за информацию о границе. – Morinar