JTree设置了Icon的透明度

时间:2015-11-04 19:05:35

标签: java swing icons rendering jtree

我想给出一个视觉指示,表明节点已经转移到剪贴板,并带有"剪切"行动。至少一个专有操作系统使用的一种直观外观是使其成为相同的图像,但略微透明。

我很想知道是否有可能以某种方式使用Windoze操作系统(W7)使用的图标......但如果有可能干扰我,我会更感兴趣某种方式(在渲染器中)使用Icon,以某种方式搞乱Icon.paintIcon()所使用的Graphics对象......显然只是针对给定节点。我不清楚Icon在哪里寻找它在绘制时使用的Graphics对象...任何启示都是最受欢迎的。

非常感谢MadProgrammer。发现这种可能性是一种提取混淆视觉效果的方法,以便对其进行操作:https://home.java.net/node/674913 ......它有效。将代码放在这里以防链接断开......

public class IconTest {

    public static void main(String[] args) {
        Icon leafIcon = UIManager.getIcon("Tree.leafIcon"); 
        // ... ("Tree.closedIcon") ("Tree.openIcon")

        BufferedImage img1 = new BufferedImage(leafIcon.getIconWidth(),
                leafIcon.getIconHeight(), BufferedImage.TYPE_INT_RGB);

        Graphics g = img1.createGraphics();
        g.drawImage(((ImageIcon) leafIcon).getImage(), 0, 0, null);
        g.dispose();

        try {
            ImageIO.write(img1, "PNG", new File("leafIcon.png"));
        } catch (IOException e) {
            System.out.println("Error writing to file leafIcon" + ", e = " + e);
            System.exit(0);
        }

    }

}

然后使用MadProgrammer的技术以任何方式改变图像:改变透明度,颜色等。很棒的东西。

2 个答案:

答案 0 :(得分:4)

  

我很想知道是否有可能以某种方式使用Windoze OS(W7)使用的图标

FileSystemView#getSystemIcon会为您提供给定File的操作系统图标表示,例如......

Icon icon = FileSystemView.getFileSystemView().getSystemIcon(new File("ThatImportantDoc.docx"));
  

我想给出一个视觉指示,表明节点已经转移到剪贴板,并带有"剪切"行动。至少一个专有操作系统使用的一种直观外观是使其成为相同的图像,但略微透明。

您需要将之前的Icon绘制为BufferedImage,其中已应用AlphaComposite,例如

BufferedImage img = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f));
icon.paintIcon(null, g2d, 0, 0);
g2d.dispose();

然后,您需要将生成的BufferedImage包装在ImageIcon中,这样您就可以将图像作为Icon传递给API的其余部分。

Faded Icon

JPanel panel = new JPanel();
panel.add(new JLabel(icon));
panel.add(new JLabel(new ImageIcon(img)));
JOptionPane.showMessageDialog(null, panel, "Icon", JOptionPane.PLAIN_MESSAGE);

为了使这一点最终发挥作用,您需要提供能够支持您的功能的TreeCellRenderer。有关详细信息,请查看How to Use Trees

答案 1 :(得分:0)

只需一个调整就可以让我做我最想做的事情:从源代码中获取UI图像""。

public class IconTest {
    public static void main(String[] args) {
        // OS folder icon
//              Icon icon = FileSystemView.getFileSystemView().getSystemIcon(new File("."));
        // proprietary word processor
//              Icon icon = FileSystemView.getFileSystemView().getSystemIcon(new File("Doc1.docx"));
        // taken from PNG file
//              Icon icon = new ImageIcon( "openIcon.png" );
        // taken directly from the Java images held somewhere (?) in the code
        Icon icon = UIManager.getIcon("Tree.leafIcon"); 
//              Icon icon  = UIManager.getIcon("Tree.openIcon"); 
        // ... ("Tree.closedIcon") ("Tree.openIcon")

        BufferedImage img = new BufferedImage( icon.getIconWidth(),
                icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = img.createGraphics();
        g2d.setComposite(AlphaComposite.SrcOver.derive( 0.5f));
        icon.paintIcon(null, g2d, 0, 0);
        g2d.dispose();              

        JPanel panel = new JPanel();
        panel.add(new JLabel(icon));
        panel.add(new JLabel(new ImageIcon(img)));
        JOptionPane.showMessageDialog(null, panel, "Icon", JOptionPane.PLAIN_MESSAGE);              

    }
}