2011-11-07 112 views
1

第一次繪製時,繪製不正確。 但是,當我最小化框架並恢復它時,它被正確繪製。重新繪製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

設置框架的擴展狀態圖標化和恢復正常的意志畫框架correctley。然而,當我添加一個組件到框架的背景是regrawn incorectley。

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

當你說它沒有被正確塗漆時,你是什麼意思? 我有一個類似的問題,當我的框架第一次繪製時,contentPane完全是黑色的。當我最小化框架,然後使其最大化時,它被正確繪製(但並不總是 - 有時我不得不做它2或3次)。原來它是我的顯卡的驅動程序。我重新安裝了它們,它工作正常! (我有一個Randeon)

也儘量

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

線程和Swing

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