2013-09-16 2 views
4

Если какой-то компонент был изменен после того, как компонент был установлен в невидимый, он только перекрашен ПОСЛЕ того, как компонент установлен на видимый. Это делает моргает (старая графика видна в течение нескольких миллисекунд):Повторное использование компонентов поворота в 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); 
     } 
    } 
} 

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

+3

не может воспроизвести (win7, java7) - buuut: вы получаете доступ к этикетке с EDT, что может вызвать любые нежелательные эффекты ... BTW: +1 для SSCCE :-) – kleopatra

+0

Попробуйте выглядеть длиннее , иногда это нормально, но иногда видна старая графика. Но неважно - «update (getGraphics());« решена проблема :) Спасибо всем. –

ответ

0

решаемые :)

Просто нужно update(getGraphics()); (только в качестве примера) :

while (true) { 

     window.label.setText("Lazy cat"); 
     window.update(window.getGraphics());//<------ new line 
     window.setVisible(true); 
     pause(); 
     window.setVisible(false); 
     pause(); 

     window.label.setText(sb.toString()); 
     window.update(window.getGraphics());//<------ new line 
     window.setVisible(true); 
     pause(); 
     window.setVisible(false); 
     pause(); 
    } 

Here очень хорошая информация о разнице между repaint() и update(Graphics g).

0

Проблема может быть где-то с вашим «окном повторного использования». С простым классом, как

static class ReusingWindow extends JFrame { 
    JLabel label = new JLabel(); 
    public ReusingWindow() { 
     add(label); 
     setBounds(0, 0, 100, 100); 
    } 
} 

Я не вижу мерцания.

+0

Я намеренно сделал 'JLabel', чтобы изменить размер, чтобы увидеть, что происходит. Я до сих пор не знаю, как подготовить графику до того, как компонент станет видимым. –

0

почему вы не можете назвать

window.repaint(); 

вручную перед вызовом

setVisible(true); 

? я не могу воспроизвести мелькать на моей машине .. если это не помогло, вы можете попробовать позвонить

window.revalidate(); 

как хорошо, прежде чем перекрашивать

+0

Насколько я знаю - компоненты не перекрашены, если они невидимы. Поэтому это означает, что когда я устанавливаю его на видимое, ТОЛЬКО, ТОГО, что он перекрашен - и я вижу это. –

Смежные вопросы