2011-09-10 41 views
5

JFrame'i tamamen saydam hale getirebilirim ve JButton, fareyi düğmenin üzerine getirene kadar (tıklamayın) ve fareyi düğmeden (MouseList ile çağrılan MouseExited) kısmen ince şeffaf yapıyorum. Olan şey, JButton'un arka planının tekrar çizilmesidir, bu nedenle düğmeler üzerinde ve dışında birkaç fare hareketi sonrasında düğme tamamen opaktır.Tamamen şeffaf JFrame üzerinde kısmen şeffaf JButton nasıl oluşturulur?

public class ButtonExample extends JWindow 
{ 
    public ButtonExample() 
    { 
     JButton But = new JButton("Testing"); 
     But.setBackground(new Color(0, 0, 0, 200)); 
     But.setForeground(new Color(70, 155, 255)); 
     this.add(But); 
     this.setBackground(new Color(0, 0, 0, 0)); 
     this.setMinimumSize(new Dimension(200,100)); 
     this.setVisible(true); 
    } 

    public static void main(String[ ] Args) 
    { 
     new ButtonExample(); 
    } 
} 
+0

Daha iyi yardım için, bir [SSCCE] (http://pscode.org/sscce.html) gönderin. –

+3

Haase ve Guy tarafından [Filthy Rich Clients] (http://filthyrichclients.org/) satın alın. Şeffaf bileşenler ve daha sonra bazı şeyler yapmanız gereken tüm ayrıntılara girer. Java Swing programcılar için tüm ** harika ** kitapta. –

cevap

8

sorun aslında BTW

but.setOpaque(false); 

(nedeniyle kısmen saydam renk) değilken düğme raporları tamamen opak olma olmasıdır

Düzenleme

arggghh :-) konvansiyonlar .. üzgünüm, bu cevapsız. gibi, biz sana paintComponent geçersiz kılmak ve kendini boyama arka plan işlemek gerekir söyleyebilirim kafamın üstünden, SwingX içinde ne kontrol etmek gerekiyor

 /** 
     * @inherited <p> 
     */ 
     @Override 
     protected void paintComponent(Graphics g) { 
      if (!isOpaque() && getBackground().getAlpha() < 255) { 
       g.setColor(getBackground()); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
      } 
      super.paintComponent(g); 
     } 

deneyin vermedi olsa da, belki "daha alma "opak yapıyor yüzüyle böylece .. 2

tamam kontrol yarın

Düzenleme geri gelecek - düzenlenen kodu doğru çalışır. Yani özetle: saydam arka plan ile bileşenler

  • onlar
  • arka plan resminin devralmak ve arka plan rengi kendileri ile doldurmak gerekir varsayılan boyama mekanizmasını karıştırmayın için opak olmadığını bildirmek zorundadır (SwingX JXPanel fi yapar bir alfa özelliği için açık destek) size kolaylık olması açısından

tarafından, burada yanlış/doğru arka yan-yana olan küçük çalıştırılabilir var

public class TransparentButton { 

    public TransparentButton() { 
     JWindow incorrectOpaque = createWindow("incorrect opaque", true); 
     incorrectOpaque.setLocation(600, 600); 
     incorrectOpaque.setVisible(true); 
     JWindow correctOpaque = createWindow("correct opaque", false); 
     correctOpaque.setLocation(800, 600); 
     correctOpaque.setVisible(true); 
    } 


    private JButton createButton(final boolean opaque) { 
     JButton but = new JButton("Testing") { 

      /** 
      * @inherited <p> 
      * Overridden to take over background painting with 
      * transparent color. 
      */ 
      @Override 
      protected void paintComponent(Graphics g) { 
       if (!isOpaque() && getBackground().getAlpha() < 255) { 
        g.setColor(getBackground()); 
        g.fillRect(0, 0, getWidth(), getHeight()); 
       } 
       super.paintComponent(g); 
      } 

     }; 
     but.setBackground(new Color(0, 0, 0, 100)); 
     but.setForeground(new Color(70, 155, 255)); 
     but.setOpaque(opaque); 
     return but; 
    } 

    private JWindow createWindow(String text, boolean opaque) { 
     JWindow window = new JWindow(); 
     JButton but = createButton(opaque); 
     window.add(but); 
     window.add(new JLabel(""), BorderLayout.SOUTH); 
     window.setOpacity(0.5f); 
     window.setBackground(new Color(0, 0, 0, 0)); 
     window.setSize(new Dimension(200, 100)); 
     return window; 
    } 

    public static void main(String[] Args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 

       new TransparentButton(); 
      } 
     }); 
    } 

    @SuppressWarnings("unused") 
    private static final Logger LOG = Logger.getLogger(TransparentButton.class 
      .getName()); 
} 
+0

Opak yanlış ayarlanarak, düğme arka planı tamamen şeffaf olur (boyalı değil). Opak yanlış olduğunda arka planın gösterilmesi için bana yardımcı olabilir misiniz? – Pete

+0

Mükemmel bir çözüm, çok teşekkürler. – Pete

0

translucency denediniz mi? Özel bir API olarak Java SE 6 Update 10 sürümüne ilk olarak translucent and shaped window API eklenmiştir. Bu işlevsellik, JDK 7 sürümündeki genel AWT paketine taşındı.

Yukarıdaki bağlantıların size yardımcı olabileceğini düşünüyorum. Gördüğünüz gibi ben java adlandırma uyacak şekilde alan adını değiştirdi:

+0

Pencereyi saydamlaştırırken sorun yok. Düzeltme, muhtemelen bileşenin (bu durumda JButton) resmini değiştirmeyi ve pencerenin düz ile ilgili olmadığını içerir. – Pete

+0

hehehe ... ya, bu doğru! – gumuruh

İlgili konular