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

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