2015-10-02 55 views
0

我試圖用線程「淡入」一個JPanel。實際上,它並沒有消失,但他通過改變rgb值逐漸將白色變爲黑色。重新繪製一個JPanel並更新屏幕

public class MostraPainel { 

    public static void main(String[] args) { 
     JFrame jf = new JFrame(); 
     jf.setSize(500, 500); 
     // Centraliza 
     jf.setLocationRelativeTo(null); 
     Painel painel = new Painel(); 
     jf.setContentPane(painel); 
     jf.setVisible(true); 
     new Thread(painel).start(); 

    } 
} 

所以想要重新繪製由間隔I設置的面板,看面板類

public class Painel extends JPanel implements Runnable { 
    // alt+s 
    /** 
    * Create the panel. 
    */ 
    int cont = 0; 

    public Painel() { 
     setBackground(Color.BLACK); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     if (cont == 1) 
      super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 

     // System.out.println(cont); 
     g2.setColor(new Color(cont, cont, cont)); 
     int w = getWidth() - 1; 
     int h = getHeight() - 1; 
     int widthQ = w/8; 
     int heightQ = h/8; 
     int size = 0; 
     int cont = 0; 
     for (int j = heightQ; j < getHeight(); j += (2 * heightQ)) { 

      for (int i = size; i < getWidth(); i += (2 * widthQ)) { 
       if (cont == 0) 
        g2.fillRect(i + widthQ, 0, widthQ, heightQ); 
       g2.fillRect(i + widthQ, j + heightQ, widthQ, heightQ); 
       g2.fillRect(i, j, widthQ, heightQ); 
      } 
      cont++; 
     } 

    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     this.cont++; 
     for (cont = 0; cont < 255; cont++) { 

      if (this.cont < 255) { 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       this.repaint(); 
      } 
     } 

    } 

} 

所以的paintComponent()方法來繪製面板上的圖像,並且該方法的run()重新繪製並將1加到cont變量中。這實際上工作,但屏幕不更新,每次我執行重繪(),所以淡入淡出的FPS。如果我保持調整屏幕大小,淡出效果很好,最新的問題是什麼?

+1

爲了更好地幫助更快,發佈[MCVE]或[短的,獨立的,正確的示例](HTTP:/ /www.sscce.org/)。 –

+1

[Java重繪()方法的重複可能不總是工作](http://stackoverflow.com/questions/15071321/java-repaint-method-doesnt-always-work) –

+1

您正在阻止超級的paintComponent方法如果cont不是== 1,就會被調用,並且你不應該這樣做,因爲這樣做會阻止JPanel做自己的內務繪畫和擦除。除了罕見的例外,super的方法應該總是**在你的覆蓋中被調用。 –

回答

0

我解決了插件的問題,這條線

Toolkit.getDefaultToolkit().sync(); 

感謝您的幫助