LookAndFeel AeroSnap "nachrüsten"

_andreas

Mitglied
Hallo,
ich bin neu hier im Forum und noch am stöbern, zu meinem Problem konnte ich aber bisher nichts finden.
Eigentlich komme ich aus der .net-Welt, bin aber momentan dabei einer bestehenden Java/Swing Anwendung einen neuen Look zu verpassen. (Sehr interessant dabei die Sprach- und Framework Unterschiede kennen zu lernen ^^)

Aktuell verwende ich das Insubstancial (Substance) LAF um eine Anwendung zu stylen, prinzipiell läuft es sehr gut - aber "Kleinigkeiten" wie AeroSnap machen mir noch etwas sorgen - Maximieren funktioniert momentan leider nur mit dem entsprechenden Button.
Mittlerweile bin ich mir relativ sicher, dass JNA benötigt wird um mit dem Windows DWM zu sprechen.

Könnt ihr mir aber eventuell weitere Hinweiße geben? Eventuell auch vorhandene Klassen oder Bibliotheken die verwendet werden könnten?
Da ich mit Substance nicht zu 100% Glücklich bin (ohne Anpassungen ist die aufwändige Anwendung nicht zu stylen) wäre ich evtl. auch an einer Alternative (mit AeroSnap) interessiert :)

Gruß und Danke,
Andreas
 

Foxei

Bekanntes Mitglied
Hallo _andreas,
Erstmal die kurze und knackige Antwort: Nein :( (Allerdings nur solange wie du nicht die Native Frame Border nutzen möchtest.)

Aber warum? o_O
Der grund liegt in der Architektur einer Swing Frame in Java. (Ein interresanter Link)
Auf die eigentliche Frame (siehe Link) hast du in Java nur eine zugriffs möglichkeit. Du kannst entscheiden von welch Typ die Frame ist (Mit und Ohne Ramen, Mit max Button ohne mit größer ziehe ohne). Ansosten hört es leider bei der Rootpane auf.
Dies hat man gemacht damit man eine Java Rootpane in jede beliebige Frame stecken kann(Mac Windows Linux(Unix)).

Warum nutzt Substance keine Native Frameborder?
Das liegt daran das Substance so geschrieben ist das du sowohl auf die Frame border Design mäßig einfluss hast als auch noch mehr geile sachen. (Stichwort Flamingo ;)) Und natürlich nicht zu vergessen da Substance auf jedem OS gleich aussehen soll.

Ich sage dir auch gleich das du solange du die Native Frameborder bearbeiten du werde mit AWT/Swing, SWT noch JAVA FX erfolgreich sein wirst.

Gruß Simon:)
 

Tobse

Top Contributor
Zumindest unter Windows 10 ist das kein Problem: ich habe hier mehrere Java-Anwendungen getestet, welche ich selbst geschrieben habe. Die benutzen alle ganz stinknormale JFrames - und AeroSnap funktioniert.
 

Foxei

Bekanntes Mitglied
Tutmir leid wenn ich Widerspreche aber du hast einen entscheidene Punkt nicht mitbekommen. Er nutzt Substance. Somit nicht die Standart Frame border(Also nicht diesen normalerweise blauen Ramen der Jedes normale Programm nutzt).
 

Tobse

Top Contributor
Ich kenne mich mit Substance nicht aus. Aus dem Thread geht nur hervor, dass es eben ein Java LAF ist. Die Funktionen vom JFrame sollten eigentlich unabhängig vom LAF sein...
 

Foxei

Bekanntes Mitglied
Die Klasse JFrame funktioniert ja auch noch volkommen. Die Funktionalität nach welcher hier gefragt ist hängt ja nicht von Java sondern von Windows ab.;)
 

Tobse

Top Contributor
Naja Eben - und zumindest mein Windows 10 bekommt es mit meinen Java 8 JFrames auf die Reihe :) AeroSnap ist jetzt ja auch kein Feature, was die Anwendung unterstützen muss. Das klappt auch mit uralt software, die für Windows 2000 Entwickelt wurde. Auf der Windows-Seite ist es ja auch nicht viel Code: Wenn der Mauszeiger mit dem gedraggten frame eine der Ecken erreicht und das Fenster vergrößerbar ist (siehe JFrame#setResizable(boolean)), zeige die Vorschau an. Wenn die Maus dann losgelassen wird, ändere die Fenstergröße und -Position entsprechend. Die Software selbst muss davon ja nix mitbekommen (Unter Unity in Ubuntu gibts selbiges Feature ja auch).
 

Foxei

Bekanntes Mitglied
Du verstehst nicht!!!
Substance ist kein Normales LAF.
Um Substance zu nutzen muss zuerst:
Java:
JFrame.setDefaultLookAndFeelDecorated(true);
Aufgerufen werden. Das ist von Substance einfach so vorgegeben.
Dadurch verlierst du alle vom OS eggeben Funktion sowohl unter Windows Ubuntu etc.

Ich habe das zu genüge getestet. Ich arbeite seit 3 Jahren mit Substance. Und schon länger mit Swing.
Gruß Simon
 

Tobse

Top Contributor
Du verstehst nicht!!!
Substance ist kein Normales LAF.
Um Substance zu nutzen muss zuerst:
Java:
JFrame.setDefaultLookAndFeelDecorated(true);
Aufgerufen werden. Das ist von Substance einfach so vorgegeben.
Dadurch verlierst du alle vom OS eggeben Funktion sowohl unter Windows Ubuntu etc.
Ist ja schon gut, ganz ruhig :) Dass das so ist, wusste ich nicht. Dass es dann nicht mehr geht, macht durchaus Sinn.
 

_andreas

Mitglied
Hallo ihr beiden,

erst einmal vielen Dank für die Antwort(en)!
Da kennt sich ja einer mit Substance aus - ich hätte dazu nämlich auch noch eine weitere Frage..dann aber in einem extra Thema :)
Bisher wollte ich mich mit der Antwort noch nicht so recht zufrieden geben und habe noch weiter gesucht.
Mein bisheriges Ergebnis ist, dass ich per Windows API das Fenster per Code maximieren kann, das ganze sieht dann so aus:
ExtendedUser32.INSTANCE.SetWindowLong(hWnd, GWL_STYLE, windowState.getStyle());
ExtendedUser32.INSTANCE.SetWindowLong(hWnd, GWL_EXSTYLE, windowState.getExStyle());
ExtendedUser32.INSTANCE.SendMessage(hWnd, User32.WM_SYSCOMMAND, new WPARAM(WinUser.SC_MAXIMIZE), new LPARAM(0));
(Quelle der verwendeten Klassen: https://github.com/xunchangguo/vlcj.../embedded/windows/Win32FullScreenHandler.java)

Wenn das geht muss auch noch mehr gehen ^^.
Ich bleibe da mal dran und spiele noch etwas herum, falls jemand noch eine Idee hat: immer her damit :)
 

_andreas

Mitglied
Hi,
ich habe das Thema die letzten Tage ruhen lassen und heute nochmals angesetzt.
Auf github habe ich eine Library gefunden, die Grundlegende snapping Funktionen ermöglicht:
https://github.com/topalavlad/Snap4J
der Listener musste nur um die SubstanceTitlePane erweitert werden und scheint relativ gut zu funktionieren.
Bei Interesse kann ich meine Anpassung ferne hier posten.
Vielen Dank für eure Hilfe!
 

Neue Themen


Oben