2012-04-07 11 views
9

मैं अर्द्ध पारदर्शी जेपीनल बनाना चाहता हूं। मैंने रंगीन कन्स्ट्रक्टर के आरजीबीए वैल्यू का उपयोग करके इसे किया है, लेकिन समस्या यह है कि जब मैं इवेंट हैंडलिंग का उपयोग कर रहा हूं तो ठीक से नहीं चल रहा है। मेरी आवश्यकता एक अर्द्ध पारदर्शी जेपीनेल है जब माउस प्रवेश करता है कि इस पैनल की सीमा दिखाई दे रही है और यदि माउस सीमा से बाहर निकलता है तो दृश्य दिखाई नहीं देता है। मैंने कोड का पालन करके ऐसा किया है लेकिन समस्या यह पारदर्शी बैकग्राउड (आरजीबीए) के लिए ठीक से काम नहीं कर रही है, लेकिन यह आरजीबी रंग के लिए ठीक काम कर रही है।पारदर्शी जेपीनेल

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

जेपीनेल अर्द्ध पारदर्शी पृष्ठभूमि का समर्थन नहीं करता है। इस समस्या की देखभाल करने के लिए आवश्यक दो चरण हैं:

  • सबसे पहले, किसी भी सही ढंग से कार्य पारदर्शिता के लिए, आप चाहिएsetOpaque(false) पैनल पर; अन्यथा आप glitches होगा, क्योंकि एक अपारदर्शी पैनल पूरी तरह से कवर करने के लिए माना जाता है जो इसकी सीमाओं के नीचे है।

  • हालांकि, opaquefalse है, पैनल भी अपनी पृष्ठभूमि को सभी (!) नहीं खींचता है, इसलिए आपको पेंट कॉम्पोनेंट में पृष्ठभूमि खींचनी होगी।

यहां एक ड्रॉप-इन प्रतिस्थापन कक्षा है जो इन दोनों चरणों का ख्याल रखेगी।

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

मैं देख लिया है कि यह अपने कार्यक्रम में काम करता है अगर मैं करने के लिए पहले पैनल निर्माण बदलने के लिए:

final JPanel panel = new TransparentPanel(); 
+0

इस खोजने से पहले 2 हमारे लिए खोज की है चाहिए! ओह क्यों नहीं है jpanel सिर्फ jframe की तरह एक सेट ओपेसिटी विधि नहीं हो सकता है? –

5

यह बहुत की तरह यह करने के लिए आसान है:

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

में एक्स यह मामला पारदर्शिता का स्तर है जिसे आप 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

वास्तव में यह किसी भी माध्यम से करना आसान नहीं है। –

संबंधित मुद्दे