2012-05-09 40 views
0

1.窗口刷新時閃爍。我如何消除這種情況?使用更新方法也不起作用。 2.如何更新netbeans中所有不是最新的類?看起來我的netbeans使用了一些舊的類(在jdk 7之前)。paint flashing java

import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.GraphicsConfiguration; 
import java.awt.*; 
import java.awt.event.ActionListener; 
import java.util.Timer; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JWindow; 


public class Splash extends JWindow { 

    private boolean mIsRunning; 
    private boolean mIsFadingOut; 
    volatile static boolean s = true; 
    private int mAngle; 
    private int mFadeCount; 
    private int mFadeLimit = 15; 

    Splash(Frame f) { 
     super(f); 
    } 

    public void startt() { 
     while (s) { 
      repaint(); 

      mAngle += 3; 
      if (mAngle >= 360) { 
       mAngle = 0; 
      } 
      if (mIsFadingOut) { 
       if (--mFadeCount == 0) { 
        mIsRunning = false; 
       } 
      } else if (mFadeCount < mFadeLimit) { 
       mFadeCount++; 
      } 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Splash.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 

    public void paint(Graphics g) { 
     int w = getWidth(); 
     int h = getHeight(); 

     // Paint the view. 
     super.paintComponents(g); 
     Graphics2D g2 = (Graphics2D) g.create(); 
     float fade = (float) mFadeCount/(float) mFadeLimit; 
     // Gray it out. 
     Composite urComposite = g2.getComposite(); 
     g2.setComposite(AlphaComposite.getInstance(
       AlphaComposite.SRC_OVER, .5f * fade)); 
     g2.fillRect(0, 0, w, h); 
     g2.setComposite(urComposite); 

     // Paint the wait indicator. 
     int s = Math.min(w, h)/5; 
     int cx = w/2; 
     int cy = h/2; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setStroke(
       new BasicStroke(s/4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
     g2.setPaint(Color.white); 
     g2.rotate(Math.PI * mAngle/180, cx, cy); 
     for (int i = 0; i < 12; i++) { 
      float scale = (11.0f - (float) i)/11.0f; 
      g2.drawLine(cx + s, cy, cx + s * 2, cy); 
      g2.rotate(-Math.PI/6, cx, cy); 
      g2.setComposite(AlphaComposite.getInstance(
        AlphaComposite.SRC_OVER, scale * fade)); 
     } 

     g2.dispose(); 
    } 
} 

public void showSplash(){ 
    final JFrame p = this; //parent 
    final Rectangle s = this.getBounds(); //parent size 

    new Thread(){ 
     public void run(){ 
      splash = new Splash(p); 
      splash.setBounds(s); 
      splash.setVisible(true); 
      splash.startt(); 
     } 
    }.start(); 
} 

}

+0

正是你到底是什麼意思?這個問題毫無意義 – MarioDS

+0

該代碼來自http://docs.oracle.com/javase/tutorial/uiswing/examples/misc/TapTapTapProject/src/TapTapTap.java,但我已對其進行了一些修改。 – user1306777

+0

@Mario - 窗口不斷閃爍。我想讓動畫變得更好 – user1306777

回答

3

問題出在你重寫JWindow的paint方法。重寫JPanel的paintComponent()相反,它具有雙緩衝:

import java.awt.AlphaComposite; 
import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Composite; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.SwingUtilities; 

public class Test extends JFrame { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JWindow window = new JWindow(); 
       final Splash splash = new Splash(); 
       window.add(splash); 
       window.setSize(100, 30); 
       window.setVisible(true); 

       new Thread() { 

        @Override 
        public void run() { 
         splash.startt(); 
        } 
       }.start(); 
      } 
     }); 
    } 

    public static class Splash extends JPanel { 

     private boolean mIsRunning; 
     private boolean mIsFadingOut; 
     volatile static boolean s = true; 
     private int mAngle; 
     private int mFadeCount; 
     private int mFadeLimit = 30; 

     Splash() { 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      int w = getWidth(); 
      int h = getHeight(); 

      // Paint the view. 
      super.paintComponents(g); 
      Graphics2D g2 = (Graphics2D) g.create(); 
      float fade = (float) mFadeCount/(float) mFadeLimit; 
      // Gray it out. 
      Composite urComposite = g2.getComposite(); 
      g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f * fade)); 
      g2.fillRect(0, 0, w, h); 
      g2.setComposite(urComposite); 

      // Paint the wait indicator. 
      int s = Math.min(w, h)/5; 
      int cx = w/2; 
      int cy = h/2; 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g2.setStroke(new BasicStroke(s/4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
      g2.setPaint(Color.white); 
      g2.rotate(Math.PI * mAngle/180, cx, cy); 
      for (int i = 0; i < 12; i++) { 
       float scale = (11.0f - i)/11.0f; 
       g2.drawLine(cx + s, cy, cx + s * 2, cy); 
       g2.rotate(-Math.PI/6, cx, cy); 
       g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, scale * fade)); 
      } 

      g2.dispose(); 
     } 

     public void startt() { 
      while (s) { 

       mAngle += 3; 
       if (mAngle >= 360) { 
        mAngle = 0; 
       } 
       if (mIsFadingOut) { 
        if (--mFadeCount == 0) { 
         mIsRunning = false; 
        } 
       } else if (mFadeCount < mFadeLimit) { 
        mFadeCount++; 
       } 
       repaint(); 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException ex) { 
        Logger.getLogger(Splash.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 

    } 

} 
4

不要呼籲EDT Thread.sleep(...)而是使用一個Swing計時器像示例所示。另外,您還需要繪製JWindow使用Swing默認雙緩衝的JPanel的paintComponent(...)方法。

+0

實際上,他不是,他在他的showSplash()方法中創建一個線程。 –

+0

@GuillaumePolet:是的,但他正在該線程中完成所有的Swing調用。他的代碼至少不會尊重Swing的線程規則。順便提一下你的答案。在我閱讀您的類似建議之前,我正在編輯我的建議(paintComponent)。 –

+0

是的,你說得對。我實際上把它們移到了EDT的上方。最終,我擺脫了他們;-)。 –