2011-09-10 94 views
5

我能夠使JFrame完全透明,JButton部分透明,直到我將鼠標移動到按鈕上(不要單擊)並將鼠標從按鈕上移開(MouseExited通過MouseListener調用)。會發生什麼是JButton的背景被再次繪製,所以在鼠標移動幾次後,按鈕就完全不透明瞭。如何在完全透明的JFrame上創建部分透明的JButton?

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

爲了儘快提供更好的幫助,請發佈[SSCCE](http://pscode.org/sscce.html)。 –

+3

Haase和Guy購買[Filthy Rich Clients](http://filthyrichclients.org/)。它涉及到所有需要做透明組件然後一些的細節。在Java Swing程序員的所有**偉大的書中。 –

回答

8

問題是按鈕報告是完全不透明的,而實際上它不是(由於部分透明色)

but.setOpaque(false); 

BTW:正如你看到的,我改變了字段名,以符合Java命名公約:-)

編輯

arggghh ..錯過了,對不起。需要檢查什麼,我們做SwingX,從我的頭頂,我會說,你需要重寫paintComponent和處理的背景畫自己,像

 /** 
     * @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); 
     } 

沒有嘗試,不過,也許是「越來越不透明」又回來了與這樣..明天會回來

編輯2

還好,檢查 - 編輯的代碼工作正常。因此,在總結:用半透明背景組件

  • 必須報告說,他們不是不透明不要混淆默認繪畫機制
  • 必須與接管背景畫,並與背景顏色自行填充(SwingX JXPanel網絡連接不通過一個alpha屬性的明確支持)

爲了您的方便,這裏有一個小的可運行與不正確/正確的背景並排側

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

通過設置不透明的錯誤,按鈕背景變得完全透明(沒有畫),這不是我想要的。如果不透明是錯誤的,你能幫助我進一步獲得背景嗎? – Pete

+0

完美的解決方案,非常感謝。 – Pete

0

你試過translucency

translucent and shaped window API作爲私有API首次添加到Java SE 6 Update 10發行版中。此功能已移至JDK 7發行版中的公共AWT包。

我認爲上述鏈接可能會對您有所幫助。

+0

使窗口透明沒有問題。該修補程序可能包括修改該組件的繪製(本例中爲JButton),並且與該窗口沒有直接關係。 – Pete

+0

hehehe ...亞,沒錯! – gumuruh