2013-09-28 55 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

非常感謝 –