簡體   English   中英

jtree圖標的縮放比例,因為它是縮放的

[英]scale size of icons for jtree as it is scaled

我想給我的應用程序的用戶更改以便隨時更改字體大小...但是我可以做些什么來放大或縮小JTree圖標(即節點打開/節點關閉)?...通常我是談論標准(金屬)L&F ......我不清楚這些圖像實際保存在哪里(我在java目錄上快速搜索.gif,.bmp,.png和.jpg無濟於事)。

如果你有一個64 x 64像素的gif,有沒有Java方法可以向上或向下擴展它? 或者我是否必須擁有一組不同大小的圖標文件(gif或png或其他)? java是否提供了一組不同大小的相同圖標(已關閉/打開的JTree文件夾)...或者它是否只允許您選擇一種尺寸的圖標?

您可以縮放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方法,但在放置節點和線時似乎沒有考慮不同的句柄大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM