Ah tu veux melanger opacite et transparence au niveau de la fenetre ? Je crains que ne soit pas possible de faire les deux car la transparence de la fenetre s'applique en totalite sur son contenu et vient donc se multiplier a la transparence de chacun des composants qu'elle contient.
Par contre on peut faire cela :
Fenetre non-decoree -> fenetre non-opaque -> panel 1 semi-transparent -> panel 2 opaque.
Et donc si tu n'as pas peur de recreer toutes les decorations de la fenetre...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { //JFrame.setDefaultLookAndFeelDecorated(true); final JFrame frame = new JFrame("Test AWT Utilities"); JButton button = new JButton("Click me!"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { frame.dispose(); } }); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setUndecorated(true); AWTUtilities.setWindowOpaque(frame, false); JPanel panel = new JPanel(); panel.setBackground(new Color(255, 255, 255, 127)); panel.add(button); frame.setLayout(new BorderLayout()); frame.add(panel, BorderLayout.CENTER); frame.setSize(500, 500); frame.setVisible(true); } }); } }
Sinon avec JFrame.setDefaultLookAndFeelDecorated(true), la fenetre (et toutes les autres) a une bordure metal opaque, avec les controles et le centre transparent. C'est moche mais bon...
Petit bemol sur l'usage de setOpaque(false) avec la definition par defaut de paintComponent(), un JPanel ne fait pas un fillRect() de son background, ce qui le rend donc completement transparent, ce qui est donc genant...
On a donc un probleme/conflit avec la definition d'opacite de Swing (je viens de reverifier dans Filthy Rich Clients p 27-28 voir aussi http://java.sun.com/products/jfc/tsc...ing/index.html) : dans Swing un composant est opaque quand il recouvre toute sa surface rectangulaire d'une couleur opaque ; et dans ce cas isOpaque() devrait etre a true. Si jamais il couvre toute sa surface rectangulaire d'une couleur transparente ou s'il ne couvre pas l'integralite de sa surface de dessin (ex: composant rond dont les coins sont completement transparent pour laisser passer la couleur du panel parent), isOpaque() doit retourner false. Et si ce n'est pas verifie, les optimisation de rendu de Swing peuvent faire que des aberrations apparaissent.
Y a donc comme un probleme, il faudrait donc creer une classe MyPanel qui surchage paintComponent() et faire un fillRect() dans tous les cas plutot que d'appeler super.paintComponent(). C'est probablement ce que doit deja faire le JXPanel de SwingX.
Partager