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
	}
}
 

GUI-Programmer

Top Contributor
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:

markus99

Bekanntes Mitglied
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.
 

markus99

Bekanntes Mitglied
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:

markus99

Bekanntes Mitglied
Das funktioniert natürlich nicht, alles versucht.
Wenn es dich interessiert, dann solltest du es selbst /*noch*/ einmal versuchen :)
 

markus99

Bekanntes Mitglied
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
 
G

Gast2

Gast
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)
 

markus99

Bekanntes Mitglied
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:
G

Gast2

Gast
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.
 

markus99

Bekanntes Mitglied
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.
 

markus99

Bekanntes Mitglied
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 :)
 
T

tsag

Gast
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.
 

GUI-Programmer

Top Contributor
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!
 

markus99

Bekanntes Mitglied
#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
 

markus99

Bekanntes Mitglied
T

tsag

Gast
-content.setDoubleBuffered(false); // hab's rausgeworfen hat bei mir keinen Unterschied gemacht
-content.setOpaque(false);
+content.setBackground(Color.BLACK);
 

markus99

Bekanntes Mitglied
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?
 

markus99

Bekanntes Mitglied
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:
 

markus99

Bekanntes Mitglied
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)
 

markus99

Bekanntes Mitglied
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.
 
T

tsag

Gast
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?
 

markus99

Bekanntes Mitglied
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.
 

GUI-Programmer

Top Contributor
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:
T

tsag

Gast
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 :rolleyes:
 

markus99

Bekanntes Mitglied
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!
 

OSBI_Fan

Mitglied
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:

markus99

Bekanntes Mitglied
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 :(
 

GUI-Programmer

Top Contributor
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...
 

markus99

Bekanntes Mitglied
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.
 

OSBI_Fan

Mitglied
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:

GUI-Programmer

Top Contributor
@ 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!
 

markus99

Bekanntes Mitglied
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 :)
 

OSBI_Fan

Mitglied
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
 

GUI-Programmer

Top Contributor
@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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Drag&Drop mit Transparenter Farbe bei PNG AWT, Swing, JavaFX & SWT 0
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
wolfgang63 JavaFX Transparenter Hintergrund aber sichtbare Buttons AWT, Swing, JavaFX & SWT 6
P transparenter JFrame mit runden Ecken AWT, Swing, JavaFX & SWT 1
V Swing Transparenter JButton AWT, Swing, JavaFX & SWT 5
B JList transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
H Transparenter JPanel AWT, Swing, JavaFX & SWT 3
L Swing JDesktopPanel, transparenter Schleier beim OUTLINE_DRAG_MODE AWT, Swing, JavaFX & SWT 13
S transparenter jframe AWT, Swing, JavaFX & SWT 5
D Transparenter JFrame AWT, Swing, JavaFX & SWT 8
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
G Button auswerten und ausgeben ob richtig oder falsch AWT, Swing, JavaFX & SWT 1
D Button und Textfeld Darstellung AWT, Swing, JavaFX & SWT 3
H Button / Design Ideen AWT, Swing, JavaFX & SWT 2
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
B JavaFX Sprachumschaltung mit Button auf der HMI AWT, Swing, JavaFX & SWT 6
T TableView Button onAction AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
JavaBeginner22 Button Hilfe AWT, Swing, JavaFX & SWT 0
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
J Button-Keyboard Interaktion AWT, Swing, JavaFX & SWT 7
EinNickname9 Swing Button mittig positionieren AWT, Swing, JavaFX & SWT 4
L actionListener für Button AWT, Swing, JavaFX & SWT 97
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
I JavaFX Hover-Effekt bei Button AWT, Swing, JavaFX & SWT 11
Zeppi Swing Button soll Spiel zurücksetzen AWT, Swing, JavaFX & SWT 5
G Button Strings Effektiver setzen AWT, Swing, JavaFX & SWT 3
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
W JavaFX Button - optimale Breite berechnen AWT, Swing, JavaFX & SWT 1
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
S JavaFx Zufallsfarbe beim Button-Klick AWT, Swing, JavaFX & SWT 22
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
Z Button bewegen und Plätze tauschen AWT, Swing, JavaFX & SWT 4
Z Swing Button anklicken und bewegen AWT, Swing, JavaFX & SWT 2
K JavaFX Button verbinden AWT, Swing, JavaFX & SWT 6
Z Mit einem Button einen anderen Button Triggern AWT, Swing, JavaFX & SWT 3
M JavaFX Button action abhängigkeit von Tab AWT, Swing, JavaFX & SWT 1
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
L Button Funktion zuweisen in WindowBuilder AWT, Swing, JavaFX & SWT 22
A Button mit Speicher-Funktion AWT, Swing, JavaFX & SWT 8
krgewb Swing Icon von Button AWT, Swing, JavaFX & SWT 12
J Schriftart über einen Button ändern AWT, Swing, JavaFX & SWT 1
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
Ø Swing Button in anderer Klassen ausführen AWT, Swing, JavaFX & SWT 6
X Neues Fenster mit Button öffnen und bearbeiten AWT, Swing, JavaFX & SWT 4
cool_brivk24 Swing Button Farbe ändern AWT, Swing, JavaFX & SWT 2
K JavaFX TextInputDialog Button Text ändern AWT, Swing, JavaFX & SWT 1
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
J Aus welchen Grund wird der Button nicht angezeigt im GridPane? AWT, Swing, JavaFX & SWT 1
S GUI Schließen Button auf der linken Seite AWT, Swing, JavaFX & SWT 2
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
das_leon AWT Button Design ändern AWT, Swing, JavaFX & SWT 5
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
E Button verschwindet nachdem ein Rechteck gezeichnet wurde AWT, Swing, JavaFX & SWT 5
G JComboBox: Arrow-Button permanent anzeigen AWT, Swing, JavaFX & SWT 4
emma_louisa JavaFX MenuBar Zweitfenster; bei Button "Abbrechen" nur das Zweitfenster schließen AWT, Swing, JavaFX & SWT 2
I JavaFX: "globaler Button" AWT, Swing, JavaFX & SWT 0
M JavaFX ActionEvent Button AWT, Swing, JavaFX & SWT 6
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
Q AWT TicTacToe Image auf Button hinzufügen AWT, Swing, JavaFX & SWT 5
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all Swing Button, ComboBox,... -- Unterschied: NetBeans Design <-> Ausführung AWT, Swing, JavaFX & SWT 2
B FXML GUI - Button ausblenden AWT, Swing, JavaFX & SWT 1
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
L JavaFX button über andere Klasse ändern AWT, Swing, JavaFX & SWT 7
L Suchergebnisse variabel mit Button anzeigen lassen AWT, Swing, JavaFX & SWT 3
K über Button andere Java Klasse aufrufen AWT, Swing, JavaFX & SWT 15
J Event Handling Button "enablen" wenn Eingaben in Textfeldern korrekt sind AWT, Swing, JavaFX & SWT 1
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
E Fehler bei Button AWT, Swing, JavaFX & SWT 1
A Swing Tabelle wird bei Betätigung des Button nicht befüllt AWT, Swing, JavaFX & SWT 17
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
MaxG. Swing Farbe von Button beim drücken ändern AWT, Swing, JavaFX & SWT 4
S per Button Variableninhalt aus anderer Klasse holen AWT, Swing, JavaFX & SWT 3
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
H JavaFX via .fxml einen abgeleiteten Button erstellen... AWT, Swing, JavaFX & SWT 4
T JavaFX Button als Runnable AWT, Swing, JavaFX & SWT 4
OlafHD JPasswordField mit Button eingeben AWT, Swing, JavaFX & SWT 4
B JavaFX Wie programmiere ich hier einen "Weiter" Button? AWT, Swing, JavaFX & SWT 11
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
D JavaFX Button Links- und Rechtsklick? AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben