J'essaye de programmer une petite application mais j'aimerais que toute la fenêtre soit en verre avec des boutons et des étiquettes dessus. Est-il possible de le faire dans Java?Comment faire toute la fenêtre aero glass en Java?
Répondre
Hmm. Je pense que toute l'interface graphique Java doit être affichée, directement ou indirectement, dans un Window
, et c'est un composant lourd. Je ne sais pas si vous pouvez le rendre transparent/translucide.
Essayez de créer un JFrame et définissez sa couleur d'arrière-plan à new Color(255, 255, 255, 20)
ou plus, où 20 est l'alpha. Cela devrait soit le rendre transparent - soit ne pas fonctionner.
En supposant que Java SWT et ses amis ne prennent pas en charge la technologie Windows Aero, vous devrez appeler une API native via JNI. L'API native, vous devez appeler est
DwmExtendFrameIntoClientArea(int windowHandle, MARGINS margins);
Cette API native se trouve dans la bibliothèque native dwmapi.dll dans Windows Vista et Windows 7, et est documented on MSDN.
Il existe beaucoup de documentation sur le Web pour savoir comment appeler cette fonction. Par exemple, voici un article sur doing this in C#. Cela devrait vous aider à démarrer.
Bien sûr, cette fonctionnalité dépend fortement de la plate-forme (Windows, dans ce cas), donc JNI est nécessaire.
Supposons que vous avez déjà vérifié que les fenêtres en verre sont activées. Les étapes sont:
- assurez-vous que la fenêtre est en couches; Étendre le cadre de verre dans la zone client;
- Choisissez une couleur qui identifie les zones transparentes;
- définir cette couleur comme arrière-plan de la fenêtre.
étapes 1-3 sont écrits en C. Laissez HWND hwnd
une poignée à la fenêtre que vous voulez glassify et laisser COLORREF color
une couleur (plus rare, le meilleur):
// 1.
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetWindowPos(hwnd, NULL, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
// 2.
MARGINS margins = {-1, -1, -1, -1};
DwmExtendFrameIntoClientArea(hwnd, &margins);
// 3.
SetLayeredWindowAttributes(hwnd, color, 0, LWA_COLORKEY);
Étape 4 est Java simples, quelque chose comme
window.getContentPane().setBackground(color);
où color
est la version Java de la couleur choisie avant.
+1 pour plus de clarté. –
Il est à noter que SWT possède des API internes pour appeler DwmExtendFrameIntoClientArea. Ce pourrait être un point de départ pour comprendre cela. –