2013-09-28 53 views
0

我想给我的应用程序的用户改变字体大小的动态...但我能做些什么关于放大或缩小JTree图标(即节点打开/节点关闭)?... ...我通常谈论标准(金属)L & F ...我不清楚这些图像实际保存的位置(我在.gif的java目录中进行了快速搜索, .bmp,.png和.jpg无效)。jtree图标的缩放比例,因为它是缩放的

如果您拥有64 x 64像素的gif,有没有Java扩展或缩小的方式?或者我必须有一组不同大小的图标文件(gif或png或其他)? java是否可以提供这样一组不同大小的相同图标(封闭/打开的JTree文件夹)可用......还是它只能让您选择一种尺寸的图标?

+0

有可能嵌入到运行时的jar文件中,但是您可以使用UIManager来检索并设置它们 – MadProgrammer

回答

2

您可以通过扩展返回UIManager.getIcon的默认图标,如果树的单元格渲染器是一个DefaultTreeCellRenderer,你可以在那里设置新图标:

static Icon scale(Icon icon, double scaleFactor, JTree tree) { 
    int width = icon.getIconWidth(); 
    int height = icon.getIconHeight(); 

    width = (int) Math.ceil(width * scaleFactor); 
    height = (int) Math.ceil(height * scaleFactor); 

    BufferedImage image = 
     new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 

    Graphics2D g = image.createGraphics(); 
    g.scale(scaleFactor, scaleFactor); 
    icon.paintIcon(tree, g, 0, 0); 
    g.dispose(); 

    return new ImageIcon(image); 
} 

static void updateIcons(JTree tree) { 
    Font defaultFont = UIManager.getFont("Tree.font"); 
    Font currentFont = tree.getFont(); 

    double newScale = (double) 
     currentFont.getSize2D()/defaultFont.getSize2D(); 

    DefaultTreeCellRenderer renderer = 
     (DefaultTreeCellRenderer) tree.getCellRenderer(); 
    renderer.setOpenIcon(
     scale(UIManager.getIcon("Tree.openIcon"), newScale, tree)); 
    renderer.setClosedIcon(
     scale(UIManager.getIcon("Tree.closedIcon"), newScale, tree)); 
    renderer.setLeafIcon(
     scale(UIManager.getIcon("Tree.leafIcon"), newScale, tree)); 

    Collection<Integer> iconSizes = Arrays.asList(
     renderer.getOpenIcon().getIconHeight(), 
     renderer.getClosedIcon().getIconHeight(), 
     renderer.getLeafIcon().getIconHeight()); 

    // Convert points to pixels 
    Point2D p = new Point2D.Float(0, currentFont.getSize2D()); 
    FontRenderContext context = 
     tree.getFontMetrics(currentFont).getFontRenderContext(); 
    context.getTransform().transform(p, p); 
    int fontSizeInPixels = (int) Math.ceil(p.getY()); 

    tree.setRowHeight(
     Math.max(fontSizeInPixels, Collections.max(iconSizes) + 2)); 
} 

缩放节点手柄的图标可能会更具挑战性。您可以调用BasicTreeUI的setCollapsedIcon和setExpandedIcon方法,但在放置节点和线时,它似乎没有考虑到不同的句柄大小。

+0

非常感谢 –