Перекрасить Aero JFrame - PullRequest
       45

Перекрасить Aero JFrame

1 голос
/ 07 ноября 2011

То, что при первом нанесении, оно не окрашено правильно. Однако, когда я минимизирую рамку и восстанавливаю ее, она рисуется правильно.

Как я это исправлю? Я попытался перекрасить ().

Вот код

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();
    }
}

Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

, установив расширенное состояние рамки на иконку и вернув ее в нормальное состояние, закрасит рамку правильно.однако, когда я добавляю компонент к кадру, фоновый рисунок перерисовывается incorectley.

frame.setExtendedState(JFrame.ICONIFIED);
frame.setExtendedState(JFrame.NORMAL);
1 голос
/ 07 ноября 2011

Что вы имеете в виду, когда говорите, что оно не правильно нарисовано?У меня была похожая проблема, когда мой фрейм был впервые закрашен, панель содержимого была полностью черной.Когда я свернул рамку, а затем развернул ее, она была нарисована правильно (но не всегда - были случаи, когда мне приходилось делать это 2 или 3 раза). Оказалось, что это были драйверы моей видеокарты.Я их переустанавливал и все работало нормально!(У меня был Randeon)

также попробуйте

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

Threads и Swing

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

SwingUtilities.invokeLater

...