2014-01-20 75 views
2

我在JTable的自定義渲染器中將此圖標用於JLabel。當表格中的行被選中時,圖標背景顯示爲白色。想要一個具有透明背景的圖像的JLabel

我用paint.net創建了一個綠色的三角形,並將其背景設置爲白色,其alpha值爲255.這就是我在此代碼中爲JLabel創建IconImage的圖像;由於外部原因,我爲圖標使用了不同的寬度。這裏展示了什麼是做一個示例程序:

package spacecheck.images; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.util.ArrayList; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

/** 
* represents an icon used in the directory tree; handles 'expanded' and 
* 'unexpanded' directories as well as indentation representing different 
* levels. 
* @author rcook 
* 
*/ 
public class TreeIconExample 
{ 
    public static int UNEXPANDED = 1; 
    public static int EXPANDED = 2; 

    @SuppressWarnings({"unused"}) 
    private void say (String msg) { System.out.println(msg); } 

    private static ImageIcon expandedIcon = null; 
    private static ImageIcon unexpandedIcon = null; 
    private static int  iconHeight = 0; 
    private static int  iconWidth = 0; 

    private static ArrayList<ImageIcon> cachedExpandedIcons = new ArrayList<ImageIcon>(); 
    private static ArrayList<ImageIcon> cachedUnexpandedIcons = new ArrayList<ImageIcon>(); 

    static 
    { 
    expandedIcon = new ImageIcon(TreeIconExample.class.getResource("images/Expanded.GIF")); 
    unexpandedIcon = new ImageIcon(TreeIconExample.class.getResource("images/Unexpanded.GIF")); 
    iconHeight = unexpandedIcon.getIconHeight(); 
    iconWidth = unexpandedIcon.getIconWidth(); 
    } 

    public TreeIconExample() { } 

    public static void main(String ... arguments) 
    { 
    JFrame frame = new JFrame("icon test"); 
    frame.setBackground(Color.blue); 
    JLabel label = new JLabel("background test"); 
    label.setBackground(Color.magenta); 
    TreeIconExample treeIcon = new TreeIconExample(); 
    ImageIcon icon = treeIcon.getIcon(2, false); 
    label.setIcon(icon); 
    frame.add(label); 
    frame.pack(); 
    frame.setVisible(true); 
    } 

    /** 
    * return the icon for an expanded or unexpanded level 
    * @param int level of folder relative to other levels displayed; 
    * starts at 0 and increases with depth 
    * @param boolean indicates whether this level is expanded or not. 
    * @return ImageIcon appropriate for expansion flag and level. 
    */ 
    public ImageIcon getIcon(int level, boolean expanded) 
    { 
    ImageIcon result = null; 

    // generate this icon and store it in the cache before returning it. 
    ImageIcon baseIcon = unexpandedIcon; 
    if (expanded) { baseIcon = expandedIcon; } 
    int iconH = iconHeight; 
    int iconW = iconWidth*(level+1); 

    BufferedImage bufferedImage = new BufferedImage(iconW,iconH,BufferedImage.TYPE_INT_ARGB); 
    Graphics g = bufferedImage.getGraphics(); 

    g.fillRect(0, 0, iconW, iconH); 
    g.drawImage(baseIcon.getImage(), iconWidth*level, 0, null); 
    result = new ImageIcon(bufferedImage); 

    return result; 
    } 
} 

,這裏是我的結果:

enter image description here

我想要做的是消除圖標的白色部分是什麼;我希望這是透明的,所以JLabel的背景顯示。我不知道爲什麼既沒有洋紅也沒有藍色出現在這個節目中;如果有人關心告訴我,我會很感激。但圖像上的透明背景是我試圖找出的主要內容。

回答

1

我認爲你應該使用一個呈現提示的緩衝圖像的Graphics2D:

Graphics2D g = bufferedImage.createGraphics(); 
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 

另外,爲什麼你有fillRect嗎?我猜想它不會透明。

編輯:嘗試運行的代碼後,僅刪除fillRect是不足以解決白色矩形問題:

enter image description here

注:我使用的影像在GIMP創建的GIF。

+0

值。我不能使用你的代碼; getGraphics()返回Graphics,而不是Graphics2D,而Graphics2D不具有setRenderingHint。 – arcy

+0

對不起......您需要createGraphics來獲取Graphics2d。但我不確定它會起作用,我還沒試過。我仍然不明白你爲什麼要填補這個問題。你只是想用alpha通道繪製圖像,對吧? – NeplatnyUdaj

+0

我想將圖像中的綠色三角形放在標籤上,並讓標籤的背景通過三角形未覆蓋的所有部分顯示。 – arcy

1

將您的標籤設置爲不透明

label.setOpaque(true)。如果它不起作用。使用不帶背景的PNG文件。

如果它仍然不起作用。 您可以嘗試不同的方法(如製作覆蓋paintComponent並繪製三角形的自定義標籤類)。

+0

setOpaque(true)顯示洋紅色,但我仍然有白色在洋紅色頂部的三角形的背景。我很樂意使用沒有背景的PNG,但我不知道如何創建一個 - 爲此使用了哪些工具? – arcy

+0

那麼,你可以搜索谷歌(有沒有PNG的)。也有一個網站,蒸發背景。 http://clippingmagic.com/ 另外,你可以使用Photoshop的。 – Ozan

4

圖像上的透明背景是最主要的

它不是透明的原因是明確地用默認的顏色是不透明的:-)

加油吧
Graphics g = bufferedImage.getGraphics(); 
say("" + g.getColor()); 
g.fillRect(0, 0, iconW, iconH); 

輸出:

java.awt.Color[r=255,g=255,b=255] 

所以要麼不填充,要麼使用完全/部分透明的顏色。

我不知道爲什麼洋紅色和藍色都沒有出現在這個程序中;如果有人在乎告訴我,我會很感激的

  • (在以前的帖子已經回答)品紅不顯示,因爲標籤!默認爲不透明:意味着其背景沒有填充背景顏色
  • 藍色未顯示,因爲您將其設置爲由其contentPane覆蓋的框架:默認情況下,後者是一個普通的JPanel,其不透明度默認爲true ,這是它填充其區域與背景

要看到藍色的,將它設置爲背景色到contentPane或更改其不透明度:

frame.getContentPane().setBackground(Color.blue); 
// or 
frame.setBackground(Color.YELLOW); 
((JComponent) frame.getContentPane()).setOpaque(false); 
+0

圖像中有兩個白色部分,其中一個是由'fillRect'調用創建的。除去這個問題,我仍然在三角形周圍留下了一個白色區域,我猜想是因爲我在圖形編輯器中創建了一個三角形背景。我曾經使用過mspaint,它沒有提供透明顏色;我現在使用的是gimp,除了我無法弄清楚如何去做,我應該這樣做。我嘗試用白色的不透明度爲0%的白色填充背景,然後導出爲PNG,但仍顯示爲白色。有不適合評論的選項,是否需要這些選項? – arcy

0

當您使用的顯卡,我想你在找什麼:

Graphics g = bufferedImage.getGraphics(); 
Graphics2D g2d = (Graphics2D) graphics; 
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f)); 

你可以選擇你的不透明度改變,我會尋找替代fillRect 0.3f 0和1之間