Если какой-то компонент был изменен после того, как компонент был установлен в невидимый, он только перекрашен ПОСЛЕ того, как компонент установлен на видимый. Это делает моргает (старая графика видна в течение нескольких миллисекунд):Повторное использование компонентов поворота в Java
package test;
import javax.swing.*;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
class ReusingWindow extends JWindow {
JLabel label;
public ReusingWindow() {
JPanel panel = new JPanel(new BorderLayout());
panel.setPreferredSize(new Dimension(300, 200));
panel.setBackground(Color.WHITE);
panel.setBorder(BorderFactory.createLineBorder(Color.GRAY));
label = new JLabel("Lazy cat");
label.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
label.setBackground(Color.red);
label.setOpaque(true);
panel.add(label, BorderLayout.WEST);
add(panel);
pack();
setLocationRelativeTo(null);
}
public static void main(String args[]) {
ReusingWindow window = new ReusingWindow();
StringBuilder sb = new StringBuilder();
sb.append("<html>");
for (int a = 0; a < 10; a++){
sb.append("Not very lazy cat. Extremelly fast cat.<br>");
}
sb.append("</html>");
while (true) {
window.label.setText("Lazy cat");
window.setVisible(true);
pause();
window.setVisible(false);
pause();
window.label.setText(sb.toString());
window.setVisible(true);
pause();
window.setVisible(false);
pause();
}
}
private static void pause() {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(ReusingWindow.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Есть ли какое-либо решение, кроме создания нового окна каждый раза перед установкой его видимым?
не может воспроизвести (win7, java7) - buuut: вы получаете доступ к этикетке с EDT, что может вызвать любые нежелательные эффекты ... BTW: +1 для SSCCE :-) – kleopatra
Попробуйте выглядеть длиннее , иногда это нормально, но иногда видна старая графика. Но неважно - «update (getGraphics());« решена проблема :) Спасибо всем. –