2012-04-07 12 views
9

Yarı saydam bir JPanel oluşturmak istiyorum. Ben sadece renk yapımcısı RGBA değerini kullanarak yaptım ama sorun elleçleme kullanıyorum sorun değil düzgün bir şekilde bitiyor. İhtiyacım yarı saydam bir Jpanel olduğunda bu panonun kenarına girdiğinde bu panelin görünür hale geldiğini ve eğer fare çıkması sınırının görünmediğini gösteriyor. Bunu kod takip ederek yaptım ama sorun şeffaf kağıt (RGBA) için düzgün çalışmıyor ancak RGB rengi için iyi çalışıyor.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); 
    } 
} 

cevap

19

JPanel yarı saydam arka planları desteklemez. Bu soruna dikkat çekmek için gereken iki adım vardır:

  • Birincisi, hiç bir doğru işleyen şeffaflığı olması, sen zorunluluk paneldesetOpaque(false); Aksi takdirde hatalarınız olur, çünkü opak bir panelin sınırlarının altında olanı tamamen kapsadığı varsayılır. Ancak, opaquefalse olduğunda, panel arka planını da çizmez (!), Böylece paintComponent öğesinde arka plan çizmek zorunda kalırsınız.

Bu adımların her ikisini de ele alacağınız bir alt sınıf değiştirme sınıfı.

final JPanel panel = new TransparentPanel(); 
+0

bu bulmadan önce 2 bizimki aramış olmalı! Neden jpanel neden JFrame gibi setOpacity metoduna sahip değildir? –

5

O kadar gibi yapmak kolaydır: içinde

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

x ben ilk paneli yarattıklarını değiştirmelerini eğer programınızda çalıştığını kontrol ettim

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

Bu durum, 0 görünmeyen, 100 katı olan şeffaflık seviyesidir.

örn:

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

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

Aslında hiçbir şekilde bunu yapmak kolay değil. –

İlgili konular