Как перерисовать после исчезновения всплывающей подсказки?

Я создал апплет, который имеет одну большую панель для отображения данных, окруженную несколькими элементами управления (кнопки, текстовые поля и т. д.). Большая панель содержит несколько слоев надписей, которые я рисую сам.

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

Теперь заметьте, это происходит не всегда. Это происходит только тогда, когда курсор находится в определенном диапазоне. Если вы зайдете достаточно далеко влево или вправо (нет разницы для изменений по оси Y), отверстия будут закрашены, когда всплывающая подсказка исчезнет.

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

я использую свинг

Спасибо.


person BCarpe    schedule 18.04.2011    source источник
comment
Думаю, мне следует попробовать создать SSCCE перед публикацией. В процессе попытки сократить свою программу до SSCCE я обнаружил проблему: я сделал одну из своих меток непрозрачной, хотя этого делать не следовало. Удаление строки, которая сделала ее непрозрачной, решило проблему, хотя на самом деле это не отвечает на вопрос, который я разместил.   -  person BCarpe    schedule 18.04.2011
comment
@BCarpe, это цель SSCCE. Его создание либо выявит проблему, либо даст вам что-то достаточно маленькое, чтобы другие могли быстро с этим поиграться.   -  person jzd    schedule 18.04.2011
comment
как вы это делаете: Большая панель содержит несколько слоев надписей, которые я визуализирую сам.?   -  person MeBigFatGuy    schedule 19.04.2011
comment
Вероятно, та же проблема, с которой вы столкнулись stackoverflow.com/questions/5615449/   -  person eee    schedule 19.04.2011
comment
@MeBigFatGuy, большая панель — это JPanel, к которой я добавил JLayeredPane. Каждый из слоев представляет собой класс, расширенный от JLabel с переопределенным методом paintComponent. Слои добавляются в JLayeredPane.   -  person BCarpe    schedule 19.04.2011


Ответы (1)


Чтобы ответить на ваш вопрос (после того, как вы нашли решение по комментариям): Swing имеет довольно сложное встроенное управление перерисовкой. Когда всплывающая подсказка исчезает, прямоугольник под ней перерисовывается.

Теперь, какие компоненты должны быть перекрашены? Все те, которые пересекаются с данным прямоугольником, и сами не скрыты (в рассматриваемой области) другими компонентами - здесь учитываются только непрозрачные компоненты. (Вот и вся причина, по которой нам нужно свойство opaque в JComponent — для оптимизации перерисовки.)

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

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

person Paŭlo Ebermann    schedule 18.04.2011
comment
Ладно, это дает мне всю информацию, которая мне действительно нужна. Так что спасибо, Пауло. Но чтобы точно ответить на вопрос, есть ли способ специально вызвать repaint(), когда всплывающая подсказка исчезает? Или попытка сделать это просто укажет на плохую практику программирования? - person BCarpe; 19.04.2011
comment
После прочтения документации JToolTip вам придется создать подкласс вашей всплывающей подсказки, показывающей JLabels, и переопределить их метод createToolTip. Затем вы можете либо добавить какой-нибудь слушатель (может быть, ComponentListener?) к своим объектам всплывающей подсказки, либо переопределить их метод removeNotify для вызова, а затем repaint для нужных объектов. Это кажется более сложным, и это не решит проблему полностью, так как ваши проблемы с перерисовкой также могут возникнуть, когда ваше окно перекрывается другими окнами, я думаю. Кроме того, обычная перерисовка перекрашивает только дефектный прямоугольник, а не все. - person Paŭlo Ebermann; 19.04.2011