2012-05-09 8 views
0

1.再描画中にウィンドウが点滅しています。どうすればそれを排除できますか? updateメソッドを使用しても動作しません。 2. 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のペイントメソッドをオーバーライドするという問題が原因です。 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が保持するJPanelのメソッドpaintComponent(...)を描画する必要があります。

+0

実際には、彼は彼のshowSplash()メソッドでスレッドを作成していません。 –

+0

@GuillaumePolet:そうですが、彼はそのスレッドでSwingの呼び出しをすべて行っています。彼のコードはSwingのスレッディングルールを少なくとも尊重していません。あなたの答えには1 +私はあなたの同様のアドバイスを読む前に同じもの(paintComponent)を推薦するために私の編集していました。 –

+0

うん、あなたは正しい。私は実際にEDTの上に移動しました。結局、私はそれらを取り除きました;-)。 –

関連する問題