2011-05-08 109 views
4

我有一個半透明 JPanel。我創建了一個自定義JButton通過擴展JButton,因爲我需要一個圓角的按鈕,並希望添加一些效果。我製作了不透明的。當我將這個按鈕添加到我的半透明JPanel時,它的效果很好。但在翻轉後,黑色補丁畫在按鈕後面,看起來非常糟糕。我在網上搜索了一個解決方案,但無法找到有用的解決方案。這個問題也是在http://www.java.net/node/661798描述,但我沒能真正使kirillcool的建議,制定出.....任何幫助將不勝感激透明JButton仍然繪製其背景

+1

不回答你的問題,但你嘗試下載/使用另一種外觀和感覺,而不是寫作你自己?我在我的最後一個項目中使用了synthetica,並且它非常好,並且「看中了」 – Kaj 2011-05-08 17:32:50

回答

7

我相信你需要添加:

button.setContentAreaFilled(false); 
+0

是的,這很好用 – 2011-12-09 16:33:29

0

不知道,如果有人仍然有興趣... 您可以通過覆蓋paintComponent()方法來解決問題,讓Java以您喜歡的任何形狀繪製JButton。您只需要使用setBackground()方法將Graphics對象的背景設置爲透明。您還需要在使用clearRect()方法清除圖形對象之前清除圖形對象,然後用JButton的背景Alpha級別再次填充圖形對象。這是我的一段代碼..它顯示覆蓋paintComponent()。通過將其粘貼到您的JButton你應該就算得與圓邊的JButton其上半TRANSPARANT背景

private int outerRoundRectSize = 10; 
private int innerRoundRectSize = 8; 

public void paintComponent(Graphics g) 
{ 
    int h = getHeight(); 
    int w = getWidth(); 

    Graphics2D g2d = (Graphics2D) g.create(); 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 

    Color GP = null; 

    //////////////get rid of the black background//////////////////////// 
    g2d.setBackground(new Color(0,0,0,0.0f)); 
    g2d.clearRect(0, 0, w, h); 
    g2d.setPaint(new Color(0,0,0,0.3f)); 
    g2d.fillRect(0, 0, w, h); 
    //////////////get rid of the black background//////////////////////// 

    ButtonModel model = getModel(); 
    if(!model.isEnabled()) 
    { 
     setForeground(Color.GRAY); 
     GP = new Color(0.5f,0.2f,0.6f); 
    } 
    else 
    { 
     setForeground(Color.WHITE); 
     if(model.isRollover()) 
     { 
      GP = new Color(0.5f,0.2f,0.6f); 
     } 
     else 
     { 
      GP = new Color(0.0f,1.0f,0.0f); 
     } 
    } 
    g2d.setPaint(GP); 
    Color p1 = null; 
    Color p2 = null; 

    if(getModel().isPressed()) 
    { 
     GP = new Color(1.0f,0.0f,0.0f); 
     g2d.setPaint(GP); 
     p1=new Color(0.12f,0.7f,0.3f); 
     p2=new Color(0.7f,0.5f,0.6f); 
    } 
    else 
    { 
     p1=new Color(0.0f,0.5f,0.7f); 
     p2=new Color(0.0f,1.0f,1.0f); 
     GP = new Color(0.0f,0.0f,1.0f); 
    } 

    RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0, w - 1, h - 1, outerRoundRectSize, outerRoundRectSize); 
    Shape clip = g2d.getClip(); 
    g2d.clip(r2d); 
    //g2d.fillRect(0, 0, w, h); 
    g2d.fillRoundRect(0, 0, w, h, outerRoundRectSize, outerRoundRectSize); 
    g2d.setClip(clip); 
    g2d.setPaint(p1); 
    g2d.drawRoundRect(0, 0, w - 1, h - 1, outerRoundRectSize,outerRoundRectSize); 
    g2d.setPaint(p2); 
    g2d.drawRoundRect(1, 1, w - 3, h - 3, innerRoundRectSize,innerRoundRectSize); 

    g2d.dispose(); 
    super.paintComponent(g); 
} 
+0

當配置單個屬性時不要編寫自定義代碼執行thrick :-) btw:請學習java命名約定並堅持他們。 – kleopatra 2012-10-26 10:14:08