0

アプリのユーザーにオンザフライでフォント サイズを変更できるようにしたいのですが、JTree アイコンを拡大または縮小するにはどうすればよいですか (つまり、ノードを開いた/ノードを閉じた)?... 通常、私は標準の (Metal) L&F について話しています... これらの画像が実際にどこに保存されているかはわかりません (Java ディレクトリで .gif、.bmp、.png、および .jpg を簡単に検索しましたが、役に立ちませんでした)。

たとえば 64 x 64 ピクセルの gif がある場合、それを拡大または縮小する Java の方法はありますか? それとも、さまざまなサイズのアイコン ファイル (gif や png など) のセットを用意する必要がありますか? Javaは、そのような異なるサイズの同一のアイコン(閉じた/開いたJTreeフォルダー)のセットを利用可能にしますか...それともアイコンのサイズを1つしか選択できませんか?

4

1 に答える 1

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 メソッドを呼び出すことはできますが、ノードとラインを配置するときに異なるハンドル サイズを考慮していないようです。

于 2013-09-28T13:56:22.230 に答える