2012-04-07 7 views
9

반투명 JPanel을 만들고 싶습니다. 단순히 색상 생성자의 RGBA 값을 사용하여이 작업을 수행했지만 문제는 이벤트 처리를 사용하여 제대로 woking하지 않는 경우입니다. 내 요구 사항은 반투명 Jpanel입니다. 마우스가 들어가면이 패널의 경계가 보이게되고 마우스가 경계를 벗어나면 소리가 보이지 않습니다. 나는이 코드를 따르지 만 문제는 투명 배경색 (RGBA)에 대해서는 제대로 작동하지 않지만 RGB 색상에는 문제가 없다.투명한 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); 
    } 
} 

답변

19

JPanel은 반투명 배경을 지원하지 않습니다. 이 문제 돌봐 필요한 두 가지 단계가 있습니다

  • 첫째, 전혀 제대로 작동하지 투명성을 가지고, 당신 해야 패널에setOpaque(false); 그렇지 않으면 불투명 한 패널이 바운더리 아래에있는 것을 완전히 덮고 있다고 가정하기 때문에 글리치가 생깁니다.

  • 그러나 opaquefalse 인 경우 패널은 배경을 전혀 그리지 않으므로 paintComponent에 배경을 그려야합니다.

다음 두 단계를 모두 처리하는 드롭 인 대체 클래스입니다.

final JPanel panel = new TransparentPanel(); 
+0

이를 발견하기 전에이 개 우리에 대한 수색해야합니다! 왜 오, 왜 jpanel은 JFrame과 같은 setOpacity 메소드를 사용할 수 없습니까? –

5

그것과 같이 그것을 쉽게 :에

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

X 내가가 첫 번째 패널 생성을 변경하면이 프로그램에서 작동하는지 확인했습니다

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

이 경우 투명도는 0은 보이지 않지만 100은 단색입니다.

예컨대 :

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

참조 : 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

실제로 어떤 방법 으로든 이렇게하는 것은 쉽지 않습니다. –