Swing Semi-Transparenter Button (normal, mouseover) auf transparentem JWindow

markus99

Bekanntes Mitglied
Hallo miteinander!

Ich wollte unbedingt einen schönen Aero Fenster Effect für meine Tools haben, also versuche ich gerade diesen selbst zu verwirklichen. Anstatt über ein verbuggtes JNA auf Windows-Funktionen zugreifen zu wollen versuche ich einfach Komponenten selbst zu zeichnen (was soweit auch funktioniert).

Problem:
Der Button closeButton ist Transparent gezeichnet. Er beinhaltet ein Transparentes PNG Image, welches als ICON darauf gezeichnet wird. Der Button wird so gezeichnet, dass nur das ICON sichtbar ist.

JButton verfügt über die Methode setRolloverIcon(icon), welche ich auch zu nutzen versuche.
Aber sobald ich mit der Maus über den Button fahre passiert folgendes:
Der Button nimmt zuerst die Form des RolloverIcon an, was auch so sein muss.
Wenn ich den Button mit der Maus verlasse, so bleibt er auf dem RolloverIcon und zeichnet sich selbst noch einmal darüber (das "X" im Image(Icon) hat einen sanften transparenten Schatten, dieser wird einfach noch einmal darüber gezeichnet und lässt den Schatten sehr intensiv aussehen).
Das Problem ist: Natürlich soll das vorherige Icon wiederhergestellt werden, da der RollOver Effekt ja nun abgerabeitet wurde - das passiert aber nicht.

Ich schätze ich baue hier bereits im Ansatz Mist, in dem ich die paint Methode aufrufe.
Also füge ich einen Screenshot so wie den Code hinzu und frage die Fachmänner des Forums nach leicht verständlichen Lösungsansätzen - da ich erst seit etwa 2 Wochen mit Java GUI Elementen arbeite. 🙂


i4x7gd6v.png




Java:
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JWindow;

public class Main extends JWindow
{
	private static final long serialVersionUID = 1L;
	Image mainwindow = Toolkit.getDefaultToolkit().getImage("res/main.png");
	ImageIcon mainicon = new ImageIcon(mainwindow);
	Image borders = Toolkit.getDefaultToolkit().getImage("res/borders.png");
	ImageIcon bordersicon = new ImageIcon(borders);
	Image stripes = Toolkit.getDefaultToolkit().getImage("res/stripes2.png");
	ImageIcon stripesicon = new ImageIcon(stripes);
	Image shadow = Toolkit.getDefaultToolkit().getImage("res/shadow.png");
	ImageIcon shadowicon = new ImageIcon(shadow);
	Image closeBtninactive = Toolkit.getDefaultToolkit().getImage("res/closeBtn_inactive.png");
	ImageIcon closeBtninactiveicon = new ImageIcon(closeBtninactive);
	
	Image closeBtnactive = Toolkit.getDefaultToolkit().getImage("res/closeBtn_active.png");
	ImageIcon closeBtnactiveicon = new ImageIcon(closeBtnactive);
	
	JButton testButton = new JButton();
	JButton closeButton = new JButton();
	private int xPos, yPos;
	
	public static void main(String[] args) 
	{
		new Main();
	}
	
	public Main()
	{
		setLayout(null); 
		setSize(shadowicon.getIconWidth(), shadowicon.getIconHeight());
		setLocationRelativeTo(null);
		setVisible(true);
		Color color = new Color(0, 0, 0, 0);
		setBackground(color);
		setAlwaysOnTop(true);

		//Close Button
		closeButton.setLocation(1025,14);
		closeButton.setSize(44,18);
		closeButton.setIcon(closeBtninactiveicon);
		closeButton.setContentAreaFilled(false);
		closeButton.setBorderPainted(false);
		closeButton.setVisible(true);
		closeButton.setOpaque(true);
		closeButton.setBackground(new Color(0,0,0,0));
		closeButton.setRolloverIcon(closeBtnactiveicon);
        closeButton.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e)
           {
        	   //closeButton.setIcon(closeBtnactiveicon);
        	   //closeButton.revalidate();
        	   //closeButton.repaint();
               //dispose();
        	   //closeButton.removeAll();
        	   //closeButton.remove(closeButton);
           }
        });
		
        add(closeButton);
		//TestButton
        testButton.setLocation(100,100);
        testButton.setSize(200,100);
        testButton.setText("Text Button for Close");
        testButton.requestFocusInWindow();
        testButton.setVisible(true);
        testButton.setOpaque(true);
        add(testButton);
        testButton.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e)
           {
                dispose();                          
           }
        });
        this.addMouseMotionListener(new MouseMotionAdapter()
        {
           public void mouseDragged(MouseEvent e)
           {
              Point window = getLocation();
              setLocation(window.x+e.getX()-xPos, window.y+e.getY()-yPos);
           }
        });
        this.addMouseListener(new MouseAdapter()
        {
           public void mousePressed(MouseEvent e)
           {
              xPos = e.getX();
              yPos = e.getY();
           }
        });
        repaint(); //make sure everything is displayed
	}
	
	public void paint(Graphics g)
	{
		int shadowW = 14; //width start position
		int shadowH = 13; //height start position
		
		Graphics2D g4 = (Graphics2D) g.create(); 
		g4.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.00f)); 
		g4.drawImage(shadow, 0, 0, this);
		
		Graphics2D g1 = (Graphics2D) g.create(); 
		g1.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.17f)); //0.14
		g1.drawImage(mainwindow, shadowW, shadowH, this);
		
		Graphics2D g2 = (Graphics2D) g.create(); 
		g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f)); //0.3f
		g2.drawImage(borders, shadowW, shadowH, this);
		
		Graphics2D g3 = (Graphics2D) g.create(); 
		g3.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.06f)); 
		g3.drawImage(stripes, shadowW, shadowH, this);
		
		testButton.repaint(); //needed
		closeButton.repaint(); //needed
	}
}
 
1. Vielleicht solltest du deine erstellen Graphics2D Objekte nach deren Verwendung wieder disposen

2. Möglicherweise macht es auch hier Sinn, die super.paint(g) Methode aufzurufen - denn dann werden vermutlich auch die Buttons gezeichnet, ohne das repaint() in paint().

[TIPP]
Nimm lieber kein JWindow, da es da z.B das Problem gibt, dass ein JTextField keinen Fokus bekommt. Zudem wird kein Icon in der Taskleiste angzeigt. Nimm lieber ein JFrame und setzte es undecorated.
[/TIPP]
 
Zuletzt bearbeitet:
Das dachte ich mir auch schon, ich erstelle warscheinlich wieder verschiedene Klassen die ich dann in der Main Klasse aufrufe, so habe ich das bisher eigentlich auch immer gemacht.

@bERt0r
Da das Fenster an sich komplett Transparent ist und lediglich eine transparente Komponente gezeichnet wird, wird der Button ohne opaque nicht angezeigt.
Ich versuche dasselbe Spiel in ein paar Minuten noch mal mit einem JFrame. Durch den Aufruf von draw scheint einiges nicht mehr richtig zu funktionieren.
 
So liebe Leute, leider bekomme ich ohne viel Aufwand (und Rechenleistung) keinen Blur-Effekt rein, was das Ganze ziemlich nutzlos macht, sofern plain Text auf der Oberfläche angezeigt werden soll.

Das mit den Buttons funktioniert ebenfalls noch nicht, desshalb auch hier temporäre Lösung.
Und natürlich habe ich ein wenig experimentiert.
Dazu sei gesagt dass ich nun Objekte mit dem WebLnF zeichne. Sieht besser aus und besitzt um Welten mehr vereinfachtliche Möglichkeiten zur visuellen Darstellung.

So sieht das Ganze aktuell aus, leider ohne richtigen Blur-Effekt und eigentlich nur als Text gedacht:
(Achja, ich zeichne nun doch auf einem JFrame)

vwje96lr.png


TODO:
- Visuelle Verbesserungen um den Aero-Effekt besser darzustellen
- Anpassen der Buttons, variabel nach Fenstermodus mit Glowing-Effekt
- Fenster resizable machen (kein Problem, dauert nur etwas)
- Das Ganze dann exemplarisch hier im Forum als Vorlage freigeben

Wer mir helfen - oder wer die Images+Code testen möchte ist herzlichst dazu eingeladen -> Skype gibt es auf Anfrage per PN.
 
Zuletzt bearbeitet:
Das funktioniert natürlich nicht, alles versucht.
Wenn es dich interessiert, dann solltest du es selbst /*noch*/ einmal versuchen 🙂
 
Das wäre ja wunderbar wenn das gehen würde.
Natürlich habe versucht den background schwarz zu malen, dein Link ist einer der ersten, der in einem anderen Forum in Bezug auf JNA/Aero empfohlen wird.

Ich schätze einfach dass ich es noch nicht verstanden habe, wobei es mich wundert wesshalb andere es auch nicht verstehen.

Den Hintergrund habe ich natürlich versucht schwarz zu zeichnen.
Kannst du etwas Code zeigen?

mfg,
Markus
 
Ich würds schon verstehen wenns mich interessieren würde ^^. Bedenke, dass viele hier Backend Software schreiben und auch viele systemübergreifend ihre Software vertreiben.

Da ist Aero echt ne maximal kleine Nische würde ich wagen zu behaupten. (Und vergiss nicht all die Windows 7 Nutzer die Aero wegen Performance eh ausschalten)
 
Wenn man nur Windows seine Zielgruppe nennt und den asiatischen Markt beiseite lässt, so darf man gut und gerne mit 70-80% Aero Unterstützung rechnen. Mit Windows 8 wird sich diese Zahl weiter steigern. Wenn XP entgültig eingestellt wird, dann sowieso.
Insofern halte ich es bei explizit "für Windows" genutzten Programmen für absolut nicht schwachsinnig sich auch an die optischen Elemente anzupassen.
 
Zuletzt bearbeitet:
1) Ich habe nie das Wort schwachsinnig genutzt?!

2) Wenn du meinen Post genau liest, dann unterstelle ich ja, dass eben die "Windows" Programme in der absoltuen Minderheit sind.

Ich finds ja nicht mal schlecht, aber ich denke, dass daher die geringe Aufmerksamkeit kommt.
 
Hast du heute nen schlechten Tag? Mit keinem Wort wollte ich dich beleidigen.
Wenn du an diesem Thread und einer Problemlösung beitragen willst, bist du herzlichst dazu eingeladen.
 
Ich habe es gerade nochmal mit der DWM Komponente versucht.
Es funktioniert ja auch, Objekte darauf zu zeichnen.
Aber das Fenster ist ziemlich hartnäckig.

Wenn ich den Bkg schwarwz setze, wird das Fenster beim Initialisieren Weiß.
Wenn ich es Resize (Horizontal UND Vertikal, also an der Ecke - sonst geht es nicht), dann wird das Fenster im entfernten(nicht sichtbaren Bereich) richtig neu gezeichnet, sonst bleibt es an diesen Stellen schwarz.

Dabei helfen mir auch nicht die üblichen Repaint/Revalidate Methoden.
Ich glaube ich müsste einige Overrides setzen - oder was auch immer.

Und genau hierbei bräuchte ich Hilfe, wenn es noch jemanden interessiert 🙂
 
Ne da ist gar nichts hartnäckig, funktioniert hier sogar in der VM mit dem experimentellen 3D Treiber. Und überschreiben musst du da auch nichts. Du musst nur den Hintergrund schwarz setzen. Habe dein Beispiel aus dem Codeschnipselforum fast 1 zu 1 übernommen, Hintergrund gesetzt und 2 Komponenten dem Fenster hinzugefügt. Fertig. Zeig mal deinen "hartnäckigen" Code.
 
Das wäre ja wunderbar wenn das gehen würde.
Natürlich habe versucht den background schwarz zu malen, dein Link ist einer der ersten, der in einem anderen Forum in Bezug auf JNA/Aero empfohlen wird.

Ich schätze einfach dass ich es noch nicht verstanden habe, wobei es mich wundert wesshalb andere es auch nicht verstehen.

Den Hintergrund habe ich natürlich versucht schwarz zu zeichnen.
Kannst du etwas Code zeigen?

mfg,
Markus

Also wie wärs tsag? Da wir anscheinend wirklich nicht fähig sind diesen Code erfolgreich zu ergänzen, könntest du doch mal hier ein funktionierendes Beispiel posten? - Danke!
 
#1 Code wie im Snippet-Beispiel.
Background auf Schwarz gesetzt; Erscheinung:
pa2nmm6h.png



#2 Das Fenster 1. Minimiert; 2. Wiederhergestellt
Von der Ecke rechts Unten nach ganz links oben gezogen und wieder zurück gezogen:
i6sdbj2j.png
 
-content.setDoubleBuffered(false); // hab's rausgeworfen hat bei mir keinen Unterschied gemacht
-content.setOpaque(false);
+content.setBackground(Color.BLACK);
 
Java:
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;

import javax.swing.*;
import java.awt.*;

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);
        //frame.setExtendedState(JFrame.ICONIFIED); //bringt nichts
        //frame.setExtendedState(JFrame.NORMAL);


        if (frame.getRootPane().getContentPane() instanceof JComponent)
        {
            JComponent content = (JComponent) frame.getRootPane().getContentPane();
            content.setOpaque(false);
            content.setDoubleBuffered(false); //ohne bleibt hintergrund auch nach resize schwarz
            content.setBackground(Color.BLACK);
        }
    }

    public class MARGINS extends Structure implements Structure.ByReference
    {
        public int cxLeftWidth;
        public int cxRightWidth;
        public int cyTopHeight;
        public int cyBottomHeight;
    }
}

Java:
import javax.swing.*;

class Main extends JFrame
{
    private static final long serialVersionUID = -8440221168382362270L;
    public Main()
    {
        setTitle("MainKlasse GUI");
        setSize(800, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);
    }

    public static void main(String[]args)
    {
        Main mainwindow = new Main();
        mainwindow.setLayout(null);
        mainwindow.setVisible(true);

        JButton testbutton = new JButton();
        testbutton.setText("Test Button");
        testbutton.setBounds(20,20,150,30);
        mainwindow.add(testbutton);

        new Aero().enableAeroEffect(mainwindow);
        mainwindow.repaint(); //bringt nichts
    }
}

Nach Ausführen:
7hwikxnv.png


Nach einem manuellen max.Resize:
le8jt5v4.png


Wo hab ich den Denkfehler?
 
Ist mir bekannt, jedoch

Code:
Exception in thread "main" java.lang.IllegalStateException: Component must be displayable
	at com.sun.jna.Native$AWT.getComponentID(Native.java:1755)
:bahnhof:
 
Startet immer noch kohlschwarz.
Diesmal lässt sich durch manuelles Resizen auch das Überbleibsel links oben beseitigen.

Was jedoch bleibt ist der "verkrüppelte" Button (sticht glaub ich in den Bildern raus)
 
Ich verstehe beim besten Willen nicht wo hier das Problem liegt.
Habe das Ganze soeben mit Eclipse versucht -> Dasselbe Ergebnis.

Ich verwende die 1.7 SDK, aber das wirds wohl nicht sein.
Auch sonst - mit einem leeren neuen Projekt und nur diesen 2 Klassen und 2 Lib-Files -> dasselbe Resultat.

GUI-Designer(Foren-Member) - sowie ein sehr fortgeschrittener russicher Programmierer mit dem ich gelegentlich Weisheiten austauschen hatten jeweils dasselbe Problem.
 
Ich weiß jetzt noch immer nicht was dein aktuelles Problem ist. Gib doch mal eine zusammenhängende Problembeschreibung (mit Bild wenn sein muss) und poste den entsprechenden Code dazu!

Was den Button angeht ist dir klar, dass wenn du schwarzen Text/Rahmen in dem Button hast, dass diese dann auch halbtransparent/blau/geblurt gemalt werden, ja?
 
Oben, gerade 3 Beiträge über deinem steht der komplette Code den ich verwende.
content.setOpaque(false); habe ich ebenfalls bereits auskommentiert.

Du hast alles was ich auch habe, sogar mehrfach.
Und die Problembeschreibung sieht man doch auf den Bildern :bahnhof:

Nach dem Start ist das Fenster im zu zeichnenden Bereich Schwarz.
Wenn ich es manuell klein mache (nicht "minimieren") und wieder groß ziehe, so wird der Hintergrund des JFrames transparent dargestellt, der Button selbst aber wird verunstaltet.

Also - Problem1: Fenster wird nicht transparent inizialisieret; Problem2: Button ist verunstaltet.

Arbeitest du mit Eclipse? Oder IntelliJ IDEA?
Es wäre interessant zu testen ob ich mit deinem funktionierenden Plain-Beispiel dasselbe Ergebnis erziele.
 
Hab grad auch noch mal ewig rumprobiert - ohne Erfolg. Wenn man bspw. die RootPane unsichtbar macht, erscheinen logischerweise garkeine Komponenten mehr - dafür funktioniert der Aero-Effekt jedoch :lol:

[EDIT]
Evtl. könnte man auch mit
Code:
Native.getComponentPointer()
arbeiten - auf die Root- oder ContentPane bezogen. Doch ich kenn mich mit jna nunmal nich aus.
[/EDIT]
 
Zuletzt bearbeitet:
Oben, gerade 3 Beiträge über deinem steht der komplette Code den ich verwende.
content.setOpaque(false); habe ich ebenfalls bereits auskommentiert.
Ich sehe da noch immer teils setOpaque() und setDoubleBuffered() auf contentPane und rootPane... Keine Lust nach jedem Post rumzuraten was du nun wieder verändert hast.

Also - Problem1: Fenster wird nicht transparent inizialisieret;
Bei mir flackert es nur kurz grau auf. Das kannst du aber umgehen, indem du erst die dwm methode aufrufst und danach erst das Fenster sichtbar machst (das repaint() kann man sich sparen danach)
Problem2: Button ist verunstaltet
Inwiefern verunstaltet - dass die Farben falsch/transparent/s*****e aussehen werden habe ich ja schon oben erklärt.

Arbeitest du mit Eclipse? Oder IntelliJ IDEA?
Weiß nicht wieso du das für relevant hältst 🙄
 
Ich sehe da noch immer teils setOpaque() und setDoubleBuffered() auf contentPane und rootPane... Keine Lust nach jedem Post rumzuraten was du nun wieder verändert hast.
Nun auskommentiert -> Dasselbe Resultat

Bei mir flackert es nur kurz grau auf. Das kannst du aber umgehen, indem du erst die dwm methode aufrufst und danach erst das Fenster sichtbar machst (das repaint() kann man sich sparen danach)
Damit bekomme ich exceptions, wie oben erwähnt und beschrieben.
Ich glaube ja deine Version unterscheidet sich stark von meiner.

Bzgl. der IDE, ich würde gerne dein exportiertes Projekt persönlich begutachten.
Das Problem dabei ist, dass 3 Leute (2 hier im Forum) deine Aussagen nicht nachvollziehen können, wobei der Dritte im Bunde seit 5 Jahren beruflich professionell mit Java arbeitet.


Desshalb frage ich höflichst ob du denn nicht deine funktionierende Lösung als Projekt exportieren könntest. Vielleicht liegt der Hund ja abseits des Friedhofs begraben 🙂

Du könntest zumindest mir sehr damit helfen!
 
Hallo zusammen,

vielleicht hilft Euch der folgender Hinweis weiter. Ich habe mal nach dem @author ex0b1t gesucht und folgendes im Netz gefunden - Link:

java - Disable Background drawing in JFrame in order to properly display Aero (DWM) effects - Stack Overflow

Hintergrund: Die naheliegendste Antwort wäre:

Java:
WindowUtils.setWindowOpaque(this, false);

Das ergibt die gewünschten visuellen Effekte, aber es verhindert leider, dass man in der Lage ist, auf das Fenster zu klicken!

Der zweite Versuch war, die Methode paint () zu überschreiben, um die gleichen Aktionen ausführen zu können, wie Window.paint(), wenn die opaque Flag auf false gesetzt ist. Das hat keinen Effekt.

Dann der Versuch, mit Reflection. Die Einstellung Window.opaque auf true ergaben die gleichen Ergebnisse wie mit WindowUtils .

Schließlich der folgender Versuch mit enableAeroEffect() :

Java:
Method m = null;
try {
    m = Window.class.getDeclaredMethod("setLayersOpaque", Component.class, Boolean.TYPE);
    m.setAccessible(true);
    m.invoke(null, this, false);
} catch ( Exception e ) {
    //TODO: handle errors correctly
} finally {
    if ( m != null ) {
        m.setAccessible(false);
    }
}

Das funktionierte! Das Fenster reagierte immer noch richtig auf Mausereignisse, aber der Hintergrund wird nicht gezeichnet und es setzt auf Reflexion (fragil).

Um nicht auf Reflexion angewiesen zu sein, hilft evtl. einen Blick auf Window.setLayersOpaque().

Edit: Bei der Kontrolle der setLayersOpaque Methode, läuft es auf das Deaktivieren Double-Buffering der transparenten Bauteile hinaus. Diese Methode aus der enableAeroEffect() -Methode aufrufen, das sollte der richtige Weg sein:

Java:
//original source: Sun, java/awt/Window.java, setLayersOpaque(Component, boolean)
private static void setLayersTransparent(JFrame frame) {
    JRootPane root = frame.getRootPane();
    root.setOpaque(false);
    root.setDoubleBuffered(false);

    Container c = root.getContentPane();
    if (c instanceof JComponent) {
        JComponent content = (JComponent) c;
        content.setOpaque(false);
        content.setDoubleBuffered(false);
    }
    frame.setBackground(new Color(0, 0, 0, 0));
}

P.S. Ich finde den Semi-Transparenz Effekt auch sehr schön und er wird oft bei professioneller Software eingesetzt (z.B. BusinessObjects). Es wäre schön, wenn Ihr hier mal ein funktionierendes Beispiel postet!

Grüße
OSBI_Fan

OSBI = Open Source Business Intelligence
 
Zuletzt bearbeitet:
Also ich hab es bis dato immer noch nicht geschafft.
Dabei ist es in vb, .net, c++ und co. problemlos möglich.

Ich weiß es ist etwas radikal, aber kennt jemand vielleicht Foren/Communities, die sich auf optisch ansprechende Entwicklungen konzentrieren?
Warscheinlich ist hier einach das Interesse daran zu klein 🙁
 
Ich bin grad echt am verzweifeln. Es muss doch mit Java auch gehen. Schaue mir grad mal folgende Links an: DwmExtendFrameIntoClientArea function (Windows), Overview (JNA API) — Java.net. Jedoch bisjetzt ohne Erfolg.

Allerdings bin ich nun der Meinung, dass das Problem wohl nich bei JNA liegt, da ja wirklich die richtigen Funktionen aufgerufen werden (höchstenst es gibt da einen Unterschied zwischen 32Bit und 64Bit Betriebssystem!!!). Somit müsste es wohl irgendwie mit den Zeichenmechanismen in SWING Schwierigkeiten geben. Da such ich mal weiter...
 
Ich habe nun Feedback von allen 3 Leuten auf StackOverflow, die dort dasselbe Problem hatten, zzgl. einem jahrelang aktiven professionellen (gewerblichen) Java-Programmierer, sowie zahllose Stunden des eigenen Testens.

Und es ist nicht möglich.
Der lieber Herr Gast(tsag) hat also mit ziemlicher Sicherheit falsche Behauptungen aufgestellt, zukünftig besser nur noch auf Member hören, die einem auch aktiv mit exemplarischen Umsetzungen und Demonstrationen helfen 🙂


In eigener Sache:
Wenn jemand Interesse am Aero-Effekt hat schlage ich vor, dass wir ihn einfach selbst umsetzen.
Dazu fehlt mir eigentlich nur noch die Methodik um mit Graphics2D gezeichnete (halbtransparente) Elemente mit einem Blur-Effekt zu versehen.

Ohne den Blur-Effekt ist jeglicher Text auf transparenten Fenstern (mit "ansehlicher Transparenz") nur sehr schwer zu lesen.
Das Windows 7 Fenster habe ich komplett @ps nachgestellt (ohne externe Quellen 🙂), 1:1

Dass dieser "blur transparency" Effekt funktioniert, das weiß ich - eben nur nicht "wie".
Transparente Image-Typen besitzen leider keine Möglichkeit eines Blur-Effektes, da habe ich schon einiges getestet (jeden 2ten Pixel etwas weniger transparent machen usw.)

Also, Hilfe ist herzlichst willkommen! Bei Erfolg kann man ja eine Lib oder so zur Verfügung stellen.
 
Hallo markus99,

versuch Dich mal mit @hansolo "Gerrit Grunwald" (Leiter der JUG Münster, Coder und mehr) in Verbindung zu setzen - Link:

Harmonic Code

http://www.jug-muenster.de/

Ich denke, wenn sich einer mit optisch ansprechenden Entwicklungen bzw. Visualisierungen in SWING und Java FX auskennt, dann der Guru selbst (nur Spaß).

P.S. Das ist so eine spontane Idee von mir. Ich bin kein Programmierer, zudem auch noch Java Beginner aber wenn es es in vb, .net, c++ und co. problemlos möglich ist, dann sollte dies ja auch in Java funktionieren oder (Yes...we can...)?!

Grüße
OSBI_Fan

OSBI = Open Source Business Intelligence
 
Zuletzt bearbeitet:
@ markus99: Wie schauts aus? Hast du dich mal mit Gerrit Grunwald in Verbindung gesetzt? Wenn nicht, und du nicht möchtest dann frag einfach mal hier im Forum, wer dazu Lust hat!
 
Ich habe kurz nach Kontaktmöglichkeiten gesucht.
Jedoch waren Messenger-Accounts inaktiv bzw. eMails wurden noch nicht beantwortet.

Ich hab das erst mal aufgegeben. Wenn ihr weiter suchen möchtet, dann viel Glück.
Die Schaufel geht erst mal an die nächste Hand 🙂
 
Hallo markus99,
hallo GUI-Programmer,

versucht mal folgendes - Link:

Transparent JFrame using JNA - Java Code Geeks

Hintergrund: JNA bietet Java-Programmen einfachen Zugriff auf native Shared Libraries (DLLs unter Windows).

Die Methode setWindowAlpha der WindowUtils Klasse wird benutzt, um ein Fenster transparent zu zeichnen. Erstes Argument dieser Methode ist der Rahmen / Fenster und das zweite ist der Alpha-Wert.

Diese Klasse ruft auch eine Methode setWindowTransparent auf, die verwendet werden kann, um für das Fenster den Transparenzeffekt zu erzeugen.

Abhängigkeiten: es werden zwei jar-Dateien benötigt:
  • jna.jar
  • platform.jar
download GitHub für JNA:

https://github.com/twall/jna/

Um den Code auf Windows laufen zu lassen, muss die "sun.java2d.noddraw" System Eigenschaft vor dem Aufruf der WindowUtils Funktion gesetzt werden.

Java:
System.setProperty('sun.java2d.noddraw', 'true');

Transparent JFrame using JNA harryjoy

Java:
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import com.sun.jna.platform.WindowUtils;

public class TransparentFrame extends JFrame {
   public TransparentFrame() {
      setTitle('Transparent Frame');
      setSize(400,400);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JSlider slider = new JSlider(JSlider.HORIZONTAL, 30, 100, 100);

      slider.addChangeListener(new ChangeListener() {
         @Override
         public void stateChanged(ChangeEvent e) {
            JSlider slider = (JSlider) e.getSource();
            if(!slider.getValueIsAdjusting()){
               WindowUtils.setWindowAlpha(TransparentFrame.this, slider.getValue()/100f);
            }
         }
      });
      add(slider);
      setVisible(true);
   }
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
     new TransparentFrame();
  }
      });
   }
}

Grüße
OSBI_Fan

OSBI = Open Source Business Intelligence
 
@OSBI_Fan: Danke für deine Hilfe, doch leider eher eine Themenverfehlung! Dass man bei ein komplettes Fenster, inklusive Rahmen die Transparenz einstellen kann, dass wussten wir schon vorher. Unser Problem besteht immmernoch darin, einen Fenster den Windows Aero Effekt zu verpassen, ohne dass dadurch die Komponenten darunter leiden.
 

Zurück
Oben