2012-04-07 31 views
9

Tôi muốn tạo một JPanel bán trong suốt. Tôi đã thực hiện nó bằng cách đơn giản bằng cách sử dụng giá trị RGBA của constructor màu nhưng vấn đề là khi tôi đang sử dụng xử lý sự kiện không phải là woking đúng cách. Yêu cầu của tôi là một Jpanel bán trong suốt khi chuột vào nó biên giới của bảng điều khiển này trở nên có thể nhìn thấy và nếu chuột thoát khỏi biên giới shoud không nhìn thấy được. Tôi đã làm điều này bằng cách làm theo mã nhưng vấn đề là nó không hoạt động đúng cho backgroud minh bạch (RGBA) nhưng nó làm việc tốt cho màu RGB.Transparent 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); 
    } 
} 

Trả lời

19

JPanel không hỗ trợ hình nền nửa công khai. Có hai bước cần thiết để chăm sóc của vấn đề này:

  • Trước tiên, để có bất kỳ minh bạch một cách chính xác-hoạt động ở tất cả, bạn phảisetOpaque(false) trên bảng điều khiển; bằng không bạn sẽ có ổn định, bởi vì một tấm mờ đục được giả định hoàn toàn bao phủ những gì nằm dưới giới hạn của nó.

  • Tuy nhiên, khi opaquefalse, bảng điều khiển cũng không vẽ nền của nó ở tất cả (!) Để bạn sẽ phải vẽ nền trong paintComponent.

Đây là lớp thay thế thả xuống sẽ xử lý cả hai bước này.

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

Tôi đã kiểm tra rằng nó hoạt động trong chương trình của bạn nếu tôi thay đổi tạo bảng đầu tiên:

final JPanel panel = new TransparentPanel(); 
+0

Phải đã tìm kiếm 2 của chúng ta trước khi tìm này! Tại sao oh tại sao không thể jpanel chỉ có một phương thức setOpacity như JFrame? –

5

Thật dễ dàng để làm điều đó như vậy:

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

x trong trường hợp này là mức độ trong suốt mà bạn đang tìm kiếm 0 là vô hình, 100 là rắn.

ví dụ:

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

Xem: 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

Nó thực sự không phải là dễ dàng để làm bằng bất kỳ phương tiện. –