2010-10-31 3 views
2

J'essaie donc de dessiner un ovale rouge uni sur une fenêtre transparente. Plus tard, je veux faire quelque chose de plus complexe avec plusieurs formes, donc utiliser setWindowShape n'est pas ce que je cherche. Voici le code que je utilise jusqu'à présent:Dessiner un contenu non transparent sur une fenêtre transparente

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

public class JavaDock extends JFrame{ 

    public JavaDock(){ 
     super("This is a test"); 

     setSize(400, 150); 

     setUndecorated(true); 
     getContentPane().setLayout(new FlowLayout()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel() 
     { 
      public void paintComponent(Graphics g) 
      { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       g2d.setComposite(AlphaComposite.Clear); 
       g.setColor(Color.red); 

       //Draw an oval in the panel 
       g.fillOval(10, 10, getWidth() - 20, getHeight() - 20); 
      } 
     }; 

     panel.setOpaque(false); 
     setGlassPane(panel); 
     getGlassPane().setVisible(true); 
     com.sun.awt.AWTUtilities.setWindowOpacity(this, 0.5f); 
     setVisible(true); 
    } 

    protected void paintComponent(Graphics g) { 

     } 

    public static void main(String[] args){ 
     JavaDock jd = new JavaDock(); 
    } 
} 
+0

Je ne suis pas sûr de comprendre la question. Je vois l'ovale rouge. Je n'ai pas accès à AWTUtilities alors peut-être que c'est la différence. – camickr

+0

En effet, c'est. la fenêtre est supposée être transparente, mais l'ovale doit être non transparent. – William

+0

+1: Je l'ai demandé aussi. Et toujours à la recherche d'une bonne solution. http://stackoverflow.com/questions/3372016/java-transparent-windows-with-non-transparent-components –

Répondre

0
Graphics2D g2d = (Graphics2D) g.create(); 
g2d.setComposite(AlphaComposite.Clear); 
g.setColor(Color.red); 
g.fillOval(10, 10, getWidth() - 20, getHeight() - 20); 

Code ne semble pas tout à fait raison. Je voudrais essayer:

Graphics2D g2d = (Graphics2D)g; 
g2d.setComposite(AlphaComposite.Clear); 
g2d.setColor(Color.red); 
g2d.fillOval(10, 10, getWidth() - 20, getHeight() - 20); 

ou tout simplement utiliser:

g.setColor(Color.red); 
g.fillOval(10, 10, getWidth() - 20, getHeight() - 20); 
+0

Aucun de ceux travaillés, et assez curieusement en utilisant g et non g.create() fait l'ovale passer du noir à rouge. – William

4

Vous appliquez une transparence globale pour vous la fenêtre, si naturellement tout ce sera au moins aussi transparent que la valeur globale. Vous voulez probablement une translucidité par pixel. Remplacer

com.sun.awt.AWTUtilities.setWindowOpacity(this, 0.5f); 

avec

com.sun.awt.AWTUtilities.setWindowOpaque(this, false); 

Cela laisse simplement votre ovale visible et il sera complètement opaque. Plus d'infos peuvent être trouvées in this Tutorial

+0

changeant qui m'a donné ceci: Exception dans le fil "principal" java.lang.IllegalArgumentException: Les effets pour les fenêtres décorées ne sont pas pris en charge. – William

+0

Odd, quelle plateforme et quelle version de JRE utilisez-vous? J'ai collé votre code et juste changé la ligne (Sun JDK 1.6.0_18 sur WinXP). – Durandal

Questions connexes