2012-04-07 9 views
9

Chcę utworzyć półprzezroczysty JPanel. Zrobiłem to po prostu używając wartości RGBA konstruktora koloru, ale problem jest, gdy używam obsługi zdarzeń nie poprawnie się budzi. Moim wymaganiem jest półprzezroczysty Jpanel, kiedy mysz wchodzi, granice tego panelu stają się widoczne, a gdy mysz wychodzi, nie widać widocznego obramowania. Zrobiłem to, podążając za kodem, ale problem polega na tym, że nie działa on poprawnie dla przezroczystego tła (RGBA), ale działa dobrze dla kolorów RGB.Przejrzyste JPanel

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); 
    } 
} 

Odpowiedz

19

JPanel nie obsługuje półprzezroczystych tła. Istnieją dwa kroki potrzebne, aby dbać o tym problemie:

  • pierwsze, mieć żadnych prawidłowo funkcjonującego przejrzystości w ogóle, to koniecznościąsetOpaque(false) na panelu; w przeciwnym razie będziesz mieć usterki, ponieważ zakłada się, że nieprzezroczysty panel całkowicie zakryje to, co znajduje się pod jego granicami.

  • Jednak gdy opaque jest false, panel również nie zwrócić jego tło w ogóle (!), Więc trzeba będzie narysować tło w paintComponent.

Oto klasa zastępcza, która zajmie się tymi krokami.

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); 
    } 
} 

Sprawdziłem, że działa w programie, jeśli zmienię pierwsze stworzenie panelu do:

final JPanel panel = new TransparentPanel(); 
+0

Musi Szukano 2 nasze przed znalezieniem tego! Dlaczego oh dlaczego jpanel nie ma po prostu metody setOpacity, takiej jak JFrame? –