2012-04-07 22 views
9

io voglio creare un JPanel semi-trasparenti. L'ho fatto semplicemente usando il valore RGBA del costruttore di colori, ma il problema è quando sto usando la gestione degli eventi non sta funzionando correttamente. Il mio requisito è un Jpanel semi trasparente quando il mouse entra nel bordo di questo pannello è diventato visibile e se il mouse esce dal bordo non è visibile. Ho fatto questo seguendo il codice, ma il problema è che non funziona correttamente per il backgroud trasparente (RGBA) ma funziona bene per il colore RGB.JPanel trasparenti

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

public class MDCW extends JFrame { 

     private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        MDCW frame = new MDCW(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public MDCW() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 1013, 551); 
     contentPane = new JPanel(); 
     contentPane.setBackground(new Color(0, 139, 139)); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     final JPanel panel = new JPanel(); 

     panel.setBackground(new Color(0, 0, 0,50)); 
     panel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent e) { 
       panel.setBorder(new LineBorder(new Color(255, 255, 255), 5)); 
      } 
      @Override 
      public void mouseExited(MouseEvent e) { 
       panel.setBorder(null); 
      } 
     }); 
     panel.setBounds(360, 155, 215, 215); 
     contentPane.add(panel); 

     final JPanel panel_1 = new JPanel(); 
     panel_1.setBackground(new Color(0, 0, 0)); 
     panel_1.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent e) { 
       panel_1.setBorder(new LineBorder(new Color(255, 255, 255), 5)); 
      } 
      @Override 
      public void mouseExited(MouseEvent e) { 
       panel_1.setBorder(null);  
      } 
     }); 
     panel_1.setBounds(84, 155, 215, 215); 
     contentPane.add(panel_1); 
    } 
} 

risposta

19

JPanel non supporta gli sfondi semitrasparenti. Ci sono due passaggi necessari per prendersi cura di questo problema:

  • In primo luogo, per avere alcuna trasparenza correttamente funzionante a tutti, si mustsetOpaque(false) sul pannello; altrimenti si avranno dei problemi, poiché si suppone che un pannello opaco copra completamente ciò che è sotto i suoi limiti.

  • Tuttavia, quando opaque è false, anche il pannello non disegna affatto lo sfondo (!), Quindi sarà necessario disegnare uno sfondo in paintComponent.

Ecco una classe sostitutiva drop-in che si prenderà cura di entrambi questi passaggi.

private class TransparentPanel extends JPanel { 
    { 
     setOpaque(false); 
    } 
    public void paintComponent(Graphics g) { 
     g.setColor(getBackground()); 
     Rectangle r = g.getClipBounds(); 
     g.fillRect(r.x, r.y, r.width, r.height); 
     super.paintComponent(g); 
    } 
} 

ho controllato che funziona nel vostro programma se cambio la prima creazione pannello per:

final JPanel panel = new TransparentPanel(); 
+0

Deve avere cercato per 2 nostra prima di trovare questo! Perché oh, perché jpanel non può avere solo un metodo setOpacity come JFrame? –

5

E 'facile da fare in questo modo:

// initialise JPanel 
JPanel somePanel = new JPanel(new GridBagLayout()); 
somePanel.setBackground(new Color(0,0,0,x); 

x in questo caso è il livello di trasparenza che stai cercando 0 invisibile, 100 essendo solido.

es:

somePanel.setBackground(new Color(0,0,0,55) 

See: http://docs.oracle.com/javase/7/docs/api/java/awt/Color.html http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html

+0

In realtà non è così facile da fare in alcun modo. –