# JFrame + JNA/aero modul - GUI Elemente so möglich?



## markus99 (9. Mai 2012)

Hallo!

Ich habe hier ein Snippet gepostet: http://www.java-forum.org/codeschnipsel-u-projekte/135940-snippet-java-gui-windows-7-aero-glas.html

Damit lässt sich praktisch die dwm nutzen, um die typische vista/w7 optik in Form von Transparenz auf ein komplettes Fenster zu verwenden.

Und genau hier endet auch schon meine Faszination - es lassen sich keine Java Elemente damit nutzen.
Egal was ich darauf erstelle, es beeinflusst das komplette Fenster und macht es weiß/systemcolor.

Nun meine Frage: Wie könnte man es doch nutzen?
Könnte man theoretisch ein zweites Fenster darüberlegen und dieses mit Java-Mitteln komplett transparent machen (das funktioniert alleine)?

Oder gibt es auf den ersten und zweiten Blick eine Möglichkeit dies anders zu lösen?
Ich erstelle diese Anwendung nur für mich, insofern käme sie auch nur auf w7 zum Einsatz.

Liebe Grüße,
Markus


----------



## markus99 (9. Mai 2012)

So sieht das Ganze unberührt aus:







und so nachdem ein Element hinzugefügt wurde:





Liegt es nur am Aktualisieren? Repaint funktioniert hier leider nicht.


----------



## Paddelpirat (9. Mai 2012)

Auf welche Komponente fügst du denn den Button hinzu? Ist diese auch durchsichtig?


----------



## markus99 (9. Mai 2012)

Ich habe den Link im ersten Post angehängt, es sind nur 2 Klassen


----------



## steffomio (9. Mai 2012)

Obwohl ich davon nichts verstehe,
sieht es so aus, als ob da ein JPanel (wo der Button drin ist) breit gezogen wird.
Ich würde jetzt versuchen, alle eingefügten Elemete mit einem Ramen zu versehen, damit man erkennen kann, wo dessen Grenzen sind.
Vielleicht wird ja auch ein JPanel automatisch eingefügt. 
Dann würde ich mit den Layouts experimentieren, z.B. GridBagLayout ist viel versprechend, oder untersuchen, ob Elemente opaque sind und auch damit experimentieren.


----------



## markus99 (9. Mai 2012)

Das habe ich soweit alles schon erfolglos versucht


----------



## Paddelpirat (9. Mai 2012)

markus99 hat gesagt.:


> Ich habe den Link im ersten Post angehängt, es sind nur 2 Klassen



Die hab ich auch gesehen, da steht aber nichts von einem JButton drin...


----------



## markus99 (9. Mai 2012)

Das wird unausweichlich daran liegen, dass ich das Snippet "sauber" zur Verfügung gestellt habe.
Versuch es doch einmal, füge einen Button (o.a.) hinzu.

Das JFrame wird sofort im ("main rectangle") Bereich Weiß und refresht sich nicht mehr zurück.

Schade dass es hierzu kaum Interesse gibt!
Wenn man sich nur auf Windows konzentriert wäre dieses optische "Gimmick" für viele Tools eine sehr willkommene Erweiterung.


----------



## GUI-Programmer (9. Mai 2012)

Doch doch Interesse gibts schon! Habe jetzt schon die ganze Zeit gegoogelt und getestet und neues probiert, etc. Aber anscheinend ist da wohl was fehlerhaft bei jna implementiert (oder wir alle zu unfähig!). Auch ich konnte es nicht erreichen...


----------



## markus99 (9. Mai 2012)

Eine Lösung habe ich bestimmt, aber die ist ziemlich dreckig.

Also 
*Ansatz 1:*
Einfach ein zweites JFrame/JPanel darüber legen und transparent schalten.
Beim Verschieben (oder wenn Vollbild gewünscht beim Maximieren) kann man die Elemente auf dem zweiten Frame/Panel verschieben, wobei der Frame/Panel selbst weiterhin transparent bleibt.

Das muss so funktionieren, wenn schon nicht sauber.
Und wesentlich mehr fressen sollte es auch nicht.


Sollte diese Idee komplett unmöglich werden, so habe ich mir was anderes überlegt.
Auf meiner Suche der künstlichen Transparenz fiel mit auch der Weg des "Snap and Map" vor die Füße.

*Ansatz 2:*
Dort wird, sofern sich das Fenster bewegt - der sichtbare Hintergrund des Fensters "gecache't" und live bearbeitet um eine Pseudo-Transparenz zu erstellen.
Dieser Ansatz + 30min Photoshop würde im Ergebnis identisch aussehen, aber natürlich auch viel mehr Leistung fressen.

So oder so - "ich will"


----------



## GUI-Programmer (9. Mai 2012)

Ich auch! Fang doch mal mit Ansatz 2 an, ich versuch mich mal an 1 - scheint ja nicht so schwer zu sein!


----------



## markus99 (9. Mai 2012)

Ich hab von gestern auf heute durch gemacht um das irgendwie zu realisieren, + bis vor ner halben Stunde in der Uni gewesen.
-> Bin aktuell übelst ausgelaugt. Den zweiten Ansatz würde ich wirklich erst angehen wenn der erste unnöglich ist.

Selbstverständlich wäre ich froh, dass wenn du erfolgreich bist - du uns an deiner Lösung teilhaben lässt (vorwiegend in der Code Snippets Sektion). Natürlich ist dies kein "muss", der Ausgangscode untersteht meines Wissens nach keiner Lizenz.


----------



## GUI-Programmer (9. Mai 2012)

Ok, hier ist der Ansatz 1 umgesetzt. Ist bestimmt noch verbesserungsfähig, aber für den Anfang reichts:

Aero.java:

```
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;

/**
 * Class Aero
 * 
 * @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;
    }   
}
```

MediaManager.java:

```
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import javax.swing.JDialog;
import javax.swing.JFrame;

/**
 * Class MediaManager
 * 
 * @author ex0b1t, GUI-Programmer
 */
public class MediaManager extends JFrame implements ComponentListener, FocusListener, WindowStateListener {

    private static final long serialVersionUID = -8440221168382362270L;
    private DialogFocuser dialogFocuser;
    private JDialog dialogContent;

    public MediaManager() {
    	dialogFocuser = new DialogFocuser();
    	dialogFocuser.start();
    	
    	dialogContent = new JDialog();
        dialogContent.setUndecorated(true);
        dialogContent.setBackground(new Color(0, 0, 0, 0));
        dialogContent.getRootPane().setOpaque(false);
        dialogContent.setVisible(true);
    	
        setTitle("Media Manager");
        setSize(800, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridBagLayout());
        addComponentListener(this);
        addFocusListener(this);
        addWindowStateListener(this);
    }
    
    // Methoden (überschriebene)
    @Override
    public void setLocation(Point p) {
    	super.setLocation(p);
    	Insets insets = getInsets();
    	if(dialogContent != null) {
    		dialogContent.setLocation(p.x+insets.left, p.y+insets.top);
    		dialogContent.validate();
    		dialogContent.repaint();
    		dialogContent.requestFocus();
    	}
    }
    
    @Override
    public void setLocation(int x, int y) {
    	super.setLocation(x, y);
    	Insets insets = getInsets();
    	if(dialogContent != null) {
    		dialogContent.setLocation(x+insets.left, y+insets.top);
    		dialogContent.validate();
    		dialogContent.repaint();
    		dialogContent.requestFocus();
    	}
    }
    
    @Override
    public void setSize(Dimension size) {
    	super.setSize(size);
    	Insets insets = getInsets();
    	if(dialogContent != null) {
    		dialogContent.setSize(size.width-insets.left-insets.right, size.height-insets.top-insets.bottom);
    		dialogContent.validate();
    		dialogContent.repaint();
    	}
    }
    
    @Override
    public void setSize(int width, int height) {
    	super.setSize(width, height);
    	Insets insets = getInsets();
    	if(dialogContent != null) {
    		dialogContent.setSize(width-insets.left-insets.right, height-insets.top-insets.bottom);
    		dialogContent.validate();
    		dialogContent.repaint();
    	}
    }
    
    @Override
    public void setBounds(Rectangle bounds) {
    	super.setBounds(bounds);
    	Insets insets = getInsets();
    	
    	Rectangle r = new Rectangle();
    	r.x = bounds.x+insets.left;
    	r.y = bounds.y+insets.top;
    	r.width = bounds.width-insets.left-insets.right;
    	r.height = bounds.height-insets.top-insets.bottom;
    	if(dialogContent != null) {
    		dialogContent.setBounds(r);
    		dialogContent.validate();
    		dialogContent.repaint();
    	}
    }
    
    @Override
    public void setBounds(int x, int y, int width, int height) {
    	super.setBounds(x, y, width, height);
    	Insets insets = getInsets();
    	
    	Rectangle r = new Rectangle();
    	r.x = x+insets.left;
    	r.y = y+insets.top;
    	r.width = width-insets.left-insets.right;
    	r.height = height-insets.top-insets.bottom;
    	if(dialogContent != null) {
    		dialogContent.setBounds(r.x, r.y, r.width, r.height);
    		dialogContent.validate();
    		dialogContent.repaint();
    	}
    }
    
    @Override
    public Dimension getSize() {
    	Dimension size = super.getSize();
    	if(dialogContent != null) {
    		dialogContent.setSize(getContentPane().getSize());
    		dialogContent.validate();
    		dialogContent.repaint();
    	}
    	return size;
    }
    
    @Override
    public Point getLocation() {
    	Point location = super.getLocation();
    	Insets insets = getInsets();
    	if(dialogContent != null) {
    		dialogContent.setLocation(location.x+insets.left, location.y+insets.top);
    		dialogContent.validate();
    		dialogContent.repaint();
    	}
    	return location;
    }
    
    @Override
    public Rectangle getBounds() {
    	Rectangle bounds = super.getBounds();
    	Insets insets = getInsets();
    	if(dialogContent != null) {
    		dialogContent.setBounds(bounds.x+insets.left, bounds.y+insets.top, getContentPane().getSize().width, getContentPane().getSize().height);
    		dialogContent.validate();
    		dialogContent.repaint();
    	}
    	return bounds;
    }
    
    @Override
    public int getX() {
    	return getLocation().x;
    }
    
    @Override
    public int getY() {
    	return getLocation().y;
    }
    
    @Override
    public int getWidth() {
    	return getSize().width;
    }
    
    @Override
    public int getHeight() {
    	return getSize().height;
    }
    
    @Override
    public void setExtendedState(int state) {
    	super.setExtendedState(state);
    	if(dialogContent != null) {
    		if(state == JFrame.ICONIFIED) {
    			dialogContent.setVisible(false);
    		} else {
    			if(!dialogContent.isVisible()) dialogContent.setVisible(true);
    			dialogContent.requestFocus();
    		}
		}
    }
    
    @Override
    public void setState(int state) {
    	super.setState(state);
    	if(dialogContent != null) {
    		if(state == JFrame.ICONIFIED) {
    			dialogContent.setVisible(false);
    		} else {
    			if(!dialogContent.isVisible()) dialogContent.setVisible(true);
    			dialogContent.requestFocus();
    		}
		}
    }
    
    
    // Methoden um die ContentPane des Dialoges zu ändern
    
    public Container getContent() {
    	return dialogContent.getContentPane();
    }
    
    public void setContent(Container content) {
    	dialogContent.setContentPane(content);
    }

    
    // Listener-Methoden
    
	@Override
	public void componentHidden(ComponentEvent evt) { }

	@Override
	public void componentMoved(ComponentEvent evt) {
		if(dialogContent != null) {
			getLocation();
		}
	}

	@Override
	public void componentResized(ComponentEvent evt) {
		if(dialogContent != null) {
			getSize();
		}
	}

	@Override
	public void componentShown(ComponentEvent evt) { }


	@Override
	public void focusGained(FocusEvent arg0) {
		if(dialogContent != null) {
			dialogContent.requestFocus();
		}
	}

	@Override
	public void focusLost(FocusEvent arg0) { }


	@Override
	public void windowStateChanged(WindowEvent evt) {
		if(dialogContent != null) {
    		if(evt.getNewState() == JFrame.ICONIFIED) {
    			dialogContent.setVisible(false);
    		} else {
    			dialogFocuser.setStarted(true);
    		}
		}
	}
	
	/**
	 * Class DialogFocuser
	 */
	private class DialogFocuser extends Thread {
		private boolean started = false;
		
		public synchronized boolean isStarted() {
			return started;
		}

		public synchronized void setStarted(boolean started) {
			this.started = started;
			if(started) notify();
		}

		public void run() {
			while(true) {
				if(isStarted()) {
					for(int i=0; i<100; i++) {
						if(isShowing() && isVisible() && isActive() && hasFocus() && isValid()) {
							EventQueue.invokeLater(new Runnable() {
								public void run() {
									if(dialogContent != null) {
										if(!dialogContent.isVisible()) dialogContent.setVisible(true);
										dialogContent.requestFocus();
									}
								}
							});
			    			setStarted(false);
			    			break;
						}
						try {
							Thread.sleep(10);
						} catch(InterruptedException ex) {
							ex.printStackTrace();
						}
					}
				} else {
					synchronized(DialogFocuser.this) {
						try {
							wait();
						} catch(InterruptedException ex) {
							interrupt();
						}
					}
				}
			}
		}
	}
	
}
```

Und noch ne Klasse zum Testen - AeroTester.java:

```
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class AeroTester {
	
    /**
     * @param args
     */
    public static void main(String[]args){
    	EventQueue.invokeLater(new Runnable() {
    		public void run() {
    			MediaManager mediamanager = new MediaManager();
    			mediamanager.getContent().setLayout(new GridBagLayout());
    			mediamanager.getContent().add(new JButton("Test Button"));
    	        mediamanager.setVisible(true);
    	        new Aero().enableAeroEffect(mediamanager);  
    	        mediamanager.repaint();
    	        
    	        mediamanager.setExtendedState(JFrame.ICONIFIED);
    	        mediamanager.setExtendedState(JFrame.NORMAL);
    		}
    	});
    }
    
}
```

Wie bereits erwähnt sollte/kann diese Klasse noch weiter angepasst werden. Desweiteren besteht zum einen das kleine Problem, dass wenn der JFrame von dem Zustand ICONFIED zurück zu einem anderen Zustand wechslet, der Innere JDialog schon ein paar Millisekunden zu bald erscheint. Meine ThreadKlasse versucht dies zwar zu verhinden, scheitert bzw. verzörgt jedoch diesen Vorgang meist nur.

@ markus99: Wenn du möchest kannst du ruhig den Code in Code Snippets Sektion einfügen.

Hier mal ein noch ein Bild, wie das Ganze dann bei mir ausschaut:


----------



## markus99 (9. Mai 2012)

Du machst deinem Nick wirklich alle Ehre!

Der visuelle Unterschied liegt übrigens beim Fokus.
Nimmt man das plain Snippet und klickt es in den sichtbaren Hintergrund, so sieht es aus wie dein Meisterwerk.
Also nur noch diese Kleinigkeit, dann kann man von Perfektion sprechen! 

Edit: Beim optischen Initialisieren wird 4-5 mal refresht oder?

Ich hätte das mit meinen Kenntnissen nie geschaft.


----------



## GUI-Programmer (9. Mai 2012)

Also was könnte man jetzt verbessern? Könntest du dies bitte nochmals genau erläutern? Vielleicht kann ichs ja dann noch umsetzten.


----------



## markus99 (9. Mai 2012)

Klar!
Also der minimale Unterschied zum ursprünglichen Transparent-bläulichen Snippet (Screenshot oben) ist einfach nur der Fokus.
Nimmst du das unveränderte Snippet und startest es, so ist es Blau/Transparent. Klickst du nun auf die Taskleiste/ein anderes Fenster, so verliert der Dialog den Fokus und wechselt in das "nicht-blaue" Transparent.

Sieh dir einfach im Zweiten Beitrag das erste Bild an, das ist blau, also mit Fokus.

Ich bin so mies im Erklären


----------



## GUI-Programmer (9. Mai 2012)

Achso, verstanden. Das heißt jetzt aber auch, dass es an meinen Code dazu nichts zu verbessern gibt, oder? War also nur sone Schlussfolgenderung/Gedankenblitzt wie von mir gerade.


----------



## markus99 (9. Mai 2012)

Ach, verschlimmbessern kann man immer!
Für ganz pingelige Tage könnte man beim Initialisieren die Durchgänge reduzieren (flackert ~5 mal).

Aber ganz ehrlich? Das ist schon mehr als ich mir erhofft hatte 

Edit:
Beim Aktualisieren wechselt das Fenster ganz kurz auf den aktiven Fokus!
Zu merken am Roten AERO Close-Button, welcher ohne Fokus nur Transparent und nicht farbig ist.

Edit2:
Der "addFocusListener" verhindert, dass das eigentliche Fenster nach Vorne kommt. Kommentiert man ihn aus, dann sieht man exakt wesshalb das vordere Element nicht blau sondern nur weiß/transparent ist!

Das Problem ist, dass das hintere Element immer "inaktiv" ist, weil das Vordere dieses verdeckt.
Doch irgendwie hast du das auch so implementiert. Mit setAlwaysOnTop(true); rückt das hintere Fenster nach Vorne und verdeckt alle Button-Elemente - trotzdem bleibt es inaktiv!


----------



## GUI-Programmer (9. Mai 2012)

So, ich hab nun noch einiges verbessert und abgeändert. Hier die zugleich ausführbare .jar mit den Code: aeroframe.jar


----------



## markus99 (10. Mai 2012)

Wow ausgezeichnet!
Glaubst du es wäre doch noch möglich das hintere Fenster dauerhaft visuell aktiv darzustellen?
Es ist immer noch weiß-transparent, nicht blau-transparent.

Bis hierhin danke ich dir vielmals für deine Arbeit/Hilfe, es ist auch jetzt schon sehr brauchbar!


----------



## GUI-Programmer (10. Mai 2012)

markus99 hat gesagt.:
			
		

> Glaubst du es wäre doch noch möglich das hintere Fenster dauerhaft visuell aktiv darzustellen?



Also wenn du damit die Wirkung der Methode 
	
	
	
	





```
setAlwaysOnTop(boolean alwaysOnTop);
```
 meinst - ja, ist möglich, habe ich soeben noch hinzugefügt, allerdings nicht "so sauber", da man diese Methode, da sie 
	
	
	
	





```
final
```
 ist nicht überschreiben kann. Daher habe ich einen Thread erstellt, der alle 100 Millisekunden prüft, ob das JFrame alwaysOnTop ist, und umgekehrt und dementsprechend den JDialog auch alwaysOnTop bzw. nicht alwaysOnTop setzt. Der Link ist der gleiche wie oben (da Dropbox - Public Folder).



			
				markus99 hat gesagt.:
			
		

> Es ist immer noch weiß-transparent, nicht blau-transparent.



Normalerweise sollte es in der Farbe transparent sein, wie auch alles anderen Fenster bei Windows 7 transparent sind - sprich wenn du das bei Windows 7 einstellst (man könnte es bspw. auch deckend oder gar rot machen), dann sollte auch das AeroFrame so aussehen. Falls nicht, dan liegt es möglicherweise an einer fehlerhaften jna Implementierung oder man muss es selbst im Programm über die jna Funktionen einstellen, was ich persönlich für sinnlos halten würde.

[EDIT]
Der Code wurde soeben (15:37) der .jar hinzugefügt.
[/EDIT]


----------



## markus99 (10. Mai 2012)

Links ist das Snippet, welches ich ganz am Anfang in der Snippet-Sektion gepostet hatte.
Rechts ist die Umsetzung, sie wird bei mir nur für einen Bruchteil einer Sekunde so wie das linke Beispiel (z.b. bei Dauer-Rechtsklicl auf das "Titelmenü".

In der aktuellen von dir geposteten jar fehlt leider die Source


----------



## GUI-Programmer (10. Mai 2012)

Ok, hab das Problem verstanden. Ist mir nur nich aufgefallen, da ich eh die maximale Transparenz bei mir eingestellt habe. Allerdings bin ich mir auch leider ziemlich sicher, dass das mit den Farbe beim Fokus nicht geht, da durch meine Implementierung immer gewährleistet ist, dass falls des JFrame einmal den Fokus bekommt, der Fokus sofort verloren geht - und somit auch die "Fokus-Farbvorhebung" - da ja der JDialog sofort den Fokus bekommt, was ja nun mal sehr wichtig ist, damit eben Komponenten korrekt mit Aero Effekt benutzt werden können - der Hauptgrund für mein Konstrukt.

Denn diese Fokus-Hervorhebungsgeschichte ist nunmal Windows - spezifisch, vor allem beim Aero Effekt.


----------



## markus99 (10. Mai 2012)

Mh das hab ich mir fast schon gedacht, sehr schade.
Ich würdige deine Arbeit - und werde dich natürlich auch fragen ob ich diese verwenden darf!

Aber bis dahin versuche ich erst noch GUI-Elemente wie oben diesen JButton ohne Fenster zu zeichnen, vielleicht gibt es hier schon Ansätze.


----------



## GUI-Programmer (10. Mai 2012)

> Ich würdige deine Arbeit - und werde dich natürlich auch fragen ob ich diese verwenden darf!



Vielen Dank! - Und ja, du darfst sie selbsverständlich verwenden und wie bereits erwähnt auch erweitern.


Vielleicht wird ja irgendwann mal die jna Library verbessert, sodass der Umweg über den JDialog nicht mehr benötigt wird. Denn mal ganz ehrlich: Das war deine Idee, und die war auch wirklich ganz gut - meine Umsetztung natürlich auch, ABER trozdem bleibt das natürlich immernoch "Diry Code" - Also Aufruf an die jna Entwickler: Verbessert euer Werk bitte! - DANKE


----------



## tsag (13. Mai 2012)

Hallo Markus,
sieht schön aus, hast du mal versucht einfach den Hintergrund schwarz zu machen, wie hier beschrieben: Custom Window Frame Using DWM ?




GUI-Programmer hat gesagt.:


> Vielleicht wird ja irgendwann mal die jna Library verbessert, sodass der Umweg über den JDialog nicht mehr benötigt wird. Verbessert euer Werk bitte! - DANKE


Troll, was hat das Problem denn mit JNA zu tun?


----------



## GUI-Programmer (13. Mai 2012)

tsag hat gesagt.:


> Troll, was hat das Problem denn mit JNA zu tun?



Lese dir den Thread ganz durch. Du wirst feststellen, dass unser Werk daher entstanden ist, dass es ganz normal mit jna nicht möglich ist den Aero Effekt einzusetzen und noch Komponenten hinzuzufügen.


----------



## trag (14. Mai 2012)

GUI-Programmer hat gesagt.:


> Lese dir den Thread ganz durch. Du wirst feststellen, dass unser Werk daher entstanden ist, dass es ganz normal mit jna nicht möglich ist den Aero Effekt einzusetzen und noch Komponenten hinzuzufügen.


Du hast nicht verstanden was JNA ist, oder? Problem hat doch absolut nada mit JNA zu tun. Mit JNA kann ich native Funktionen aufrufen, und das klappt doch wunderbar, wo ist da nun der Bug? Was hat JNA mit irgendwelchen Frames, Dialogs oder Swing Komponenten zu tun? JNA ist nicht daran schuld, wenn ich mir nicht die Dokumentation der Funktionen durchlese, die ich aufrufe.
Dass das ganze auch wunderbar funktioniert sobald man es richtig macht kannst du ja hier begutachten:
http://www.java-forum.org/awt-swing...n-normal-mouseover-transparentem-jwindow.html
^ Weitere Diskussionen am besten dort.


----------



## qweasdqwe (16. Jun 2012)

Das ist ja nur ein screenshot der gezeichnet wird, wenn ich das frame bewege dann passt das angeblich transparente nicht mehr mit dem wirklich darunter liegendem ?!

oder fehlt mir hier noch eine api oder was^^


----------

