2011-11-07 9 views
1

初めて塗装したときは、塗装が正しく行われません。 しかし、フレームを最小化して復元すると、正しく塗りつぶされます。Repaint Aero JFrame

どうすれば修正できますか?私は再塗りをしました()。ここで

コード

import javax.swing.JComponent; 
import javax.swing.JFrame; 

import com.sun.jna.Function; 
import com.sun.jna.Native; 
import com.sun.jna.NativeLibrary; 
import com.sun.jna.Structure; 
import com.sun.jna.platform.win32.WinDef.HWND; 
import com.sun.jna.platform.win32.WinNT.HRESULT; 

/** 
* @author ex0b1t 
* 
*/ 
public class Aero { 

    public void enableAeroEffect(JFrame frame) {   

     NativeLibrary dwmapi = NativeLibrary.getInstance("dwmapi"); 
     HWND aeroFrameHWND = new HWND(Native.getWindowPointer(frame)); 

     MARGINS margins = new MARGINS(); 
     margins.cxLeftWidth = -1; 
     margins.cxRightWidth = -1; 
     margins.cyBottomHeight = -1; 
     margins.cyTopHeight = -1; 

     Function extendFrameIntoClientArea = dwmapi 
       .getFunction("DwmExtendFrameIntoClientArea"); 
     HRESULT result = (HRESULT) extendFrameIntoClientArea.invoke(
       HRESULT.class, new Object[] { aeroFrameHWND, margins }); 
     if (result.intValue() != 0) 
      System.err.println("Call to DwmExtendFrameIntoClientArea failed."); 

     frame.getRootPane().setDoubleBuffered(false); 
     frame.getRootPane().setOpaque(false); 

     if (frame.getRootPane().getContentPane() instanceof JComponent) { 
      JComponent content = (JComponent) frame.getRootPane().getContentPane(); 
      content.setOpaque(false); 
      content.setDoubleBuffered(false); 
     }  
    } 

    /** 
    * @author ex0b1t 
    * 
    */ 
    public class MARGINS extends Structure implements Structure.ByReference { 
     public int cxLeftWidth; 
     public int cxRightWidth; 
     public int cyTopHeight; 
     public int cyBottomHeight; 
    } 
} 



import javax.swing.JFrame; 

/** 
* @author ex0b1t 
* 
*/ 

public class MediaManager extends JFrame { 

    private static final long serialVersionUID = -8440221168382362270L; 

    public MediaManager() {  
     setTitle("Media Manager"); 
     setSize(800, 600); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[]args){ 
     MediaManager mediamanager = new MediaManager(); 
     mediamanager.setVisible(true); 
     new Aero().enableAeroEffect(mediamanager); 
     mediamanager.repaint(); 
    } 
} 

は事前にお願いしています。

答えて

1

スイングを試してみてください(私はRandeonを持っていました)フレームの正しい位置を塗ります。しかし、私はフレームにコンポーネントを追加すると、backroundはincorectleyを再描画します。

frame.setExtendedState(JFrame.ICONIFIED); 
frame.setExtendedState(JFrame.NORMAL); 
1

正しく塗装されていないと言ったらどういう意味ですか? 私はフレームが最初に描画されたときにcontentPaneが完全に黒色だったのと同様の問題がありました。フレームを最小化して最大化すると、正しくペイントされました(しかし、必ずしもそうではありませんでしたが、私は2〜3回それをしなければなりませんでした)。それは私のグラフィックスカードのドライバであることが判明しました。私はそれらを再インストールし、それは正常に働いた!

  SwingUtilities.invokeLater(new Runnable(){ 
        @Override 
        public void run(){ 
         mediamanager.setVisible(true); 
         new Aero().enableAeroEffect(mediamanager); 
         mediamanager.repaint(); 
        } 
      } 

スレッドと

正常に戻っ意志にアイコン化とするために、フレームの拡張状態を設定

http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

SwingUtilities.invokeLater

+0

http://dl.dropbox.com/u/21666209/1.PNG初期負荷 – ex0b1t

+0

http://dl.dropbox.com/u/21666209/2.PNG画像が復元後それぞれ示します – ex0b1t