2011-01-21 2 views
4

Je sais qu'une question similaire était posted before, mais il n'y avait pas de réponse ou un exemple de code.Transparent JPanel sur Canvas (VLCJ)

J'ai besoin d'un JPanel transparent sur une toile. Le code affiché ci-dessous ne fonctionne pas

import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class Main { 
    private static class Background extends Canvas{ 
     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      g.setColor(Color.RED); 
      g.drawOval(10, 10, 20, 20); 
     } 
    } 

    private static class Transparent extends JPanel { 

     public Transparent() { 
      setOpaque(false); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.GREEN); 
      g.drawOval(20, 20, 20, 20); 
     } 
    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 
     JLayeredPane layered = new JLayeredPane(); 
     Background b = new Background(); 
     Transparent t = new Transparent(); 

     layered.setSize(200, 200); 
     b.setSize(200, 200); 
     t.setSize(200, 200); 

     layered.setLayout(new BorderLayout()); 
     layered.add(b, BorderLayout.CENTER, 1); 
     layered.add(t, BorderLayout.CENTER, 0); 

     frame.setLayout(new BorderLayout()); 
     frame.add(layered, BorderLayout.CENTER); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
    } 
} 

En utilisant la propriété GlassPane de l'ensemble du cadre est la toute dernière solution (fortement déconseillée)

Répondre

2

Vous ne sera probablement pas en mesure d'obtenir ce travail parce que vous mélangez composants lourds et légers ensemble.

Dans le passé, il était autrefois impossible de dessiner des panneaux légers sur des composants lourds comme un Canvas. Depuis JDK 6 Update 12 et JDK 7 build 19 Java a corrigé cela et vous pouvez chevaucher les 2 correctement mais il vient avec des limitations. Plus précisément, dans votre cas, le composant swing Overlapping ne peut pas être transparent.

Une bonne description de ceci incluant le comportement le plus récent peut être trouvée sur cette page: Mixing Heavyweight and Lightweight Components Vérifiez la section des limitations pour votre problème spécifique.

Je ne pense pas que l'utilisation du GlassPane puisse aider car c'est aussi léger.

Si vous modifiez la classe BackGround pour étendre JPanel au lieu de Canvas, vous obtiendrez le comportement souhaité.

+1

oui, j'ai lu sur le problème poids lourd/poids léger, mais je suis obligé d'utiliser la toile ... J'étudie SWT maintenant, mais je préfère SWING. – FearUs

0

Bien que AWT soit limité, il ne devrait pas être trop difficile d'implémenter quelque chose de similaire avec AWT lui-même en étendant la classe Container ou Component.

Questions connexes