2009-09-06 5 views
3

Eh bien, le titre est assez explicite. Je veux construire deux panneaux l'un sur l'autre en couches en utilisant Java. Je veux que la couche supérieure contienne un JPanel qui contiendra un objet graphics2d. Je voudrais que le JPanel et graphics2d aient un arrière-plan transparent (je veux toujours que le contenu dessiné par graphics2d soit visible). Est-ce que quelqu'un a une idée de comment cela peut être fait?comment rendre java JPanel et graphics2d transparent?

+0

Déposez votre SSCCE. Nous ne pouvons pas deviner ce que vous faites. – camickr

Répondre

5

Appelez setOpaque (false) sur le JPanel - qui ne peindra pas l'arrière-plan de JPanel.

En fonction de la méthode que vous surchargeons pour obtenir au Graphics2D (JPanel de ne contiennent un objet Graphics2D comme un composant - un objet Graphics2D est utilisé pour peindre le JPanel) - si elle est paintComponent() vous devriez read the JavaDocs for JComponent - et appelez super.paintComponent (g) en premier pour que l'opacité soit respectée - et ensuite faites le reste de votre peinture.

Exemple de travail:

package com.stackoverflow.opaque; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class OpaqueExample extends JFrame { 

    private JLayeredPane layers; 
    private JPanel up, down; 
    private JButton toggleOpaque; 

    public OpaqueExample() { 
     layers = new JLayeredPane(); 

     down = new JPanel(); 
     down.setBackground(Color.GREEN); 
     down.setBounds(100, 100, 200, 200); 
     layers.add(down, new Integer(1)); 

     up = new JPanel() { 
      public void paintComponent(Graphics og) { 
       super.paintComponent(og); 

       Graphics2D g = (Graphics2D)og; 
       GradientPaint gradient = new GradientPaint(0, 0, Color.BLUE, 10, 0, 
          Color.WHITE, true); 

       Polygon poly = new Polygon(); 
       poly.addPoint(10, 10); 
       poly.addPoint(100, 50); 
       poly.addPoint(190, 10); 
       poly.addPoint(150, 100); 
       poly.addPoint(190, 190); 
       poly.addPoint(100, 150); 
       poly.addPoint(10, 190); 
       poly.addPoint(50, 100); 
       poly.addPoint(10, 10); 

       g.setPaint(gradient); 
       g.fill(poly); 

       g.setPaint(Color.BLACK); 
       g.draw(poly); 
      } 
     }; 
     up.setBackground(Color.RED); 
     up.setBounds(150, 150, 200, 200); 
     layers.add(up, new Integer(2)); 

     getContentPane().add(layers, BorderLayout.CENTER); 

     JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
     toggleOpaque = new JButton("Toggle Opaque"); 
     toggleOpaque.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       up.setOpaque(!up.isOpaque()); 
       layers.repaint(); 
      } 
     }); 
     buttonPanel.add(toggleOpaque); 

     getContentPane().add(buttonPanel, BorderLayout.EAST); 
    } 

    public static void main(String[] args) { 
     JFrame f = new OpaqueExample(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(500, 500); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

Eh bien, j'utilise juste de la peinture ordinaire. Lorsque je teste, j'essaie seulement un seul jpanel sans graphics2d et je mets setOpaque (false) il cache toujours le JPanel inférieur. J'utilise JLayeredPane en passant. – vondip

+0

Vous devez surcharger paintComponent() plutôt que paint() pour un composant Swing (autre que certains cas particuliers). Je ne sais pas quoi dire sur le reste ... puisque aucun code n'est posté, je ne sais pas exactement ce que vous faites. Je vais poster un petit exemple qui fonctionne. – Nate

+0

Salut Nate, J'ai vérifié s'il est possible d'envoyer un message privé ici. Je voulais vous remercier d'une meilleure façon. Votre code d'exemple était simple et m'a fait comprendre. J'utilisais graphics2d et j'ai remarqué que j'appelais clearRect qui me laissait constamment avec un écran blanc. après avoir changé cela et en ajustant à votre échantillon de code cela a fonctionné! encore une fois merci. – vondip