gpt4 book ai didi

java - 生成带有 svg 内容的图标

转载 作者:行者123 更新时间:2023-11-30 03:06:22 25 4
gpt4 key购买 nike

我想生成一个带有 svg 图标内容的图标。例如,一个黄色圆圈,里面有一张脸(svg 文件)。目前我有这段代码。

  1. 圆圈位于正确的位置,但 svg 绘制在整个 JPanel 上,如果我调整框架大小,svg 会一直添加。

  2. svg 加载为白色背景且尺寸错误。

有没有办法使 svg 的背景透明并将 svg 转换为圆形大小?

作为信息:svg 文件具有透明背景(在 adobe illustrator 中看到),但在 Java 中加载的是白色...

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import org.apache.batik.swing.JSVGCanvas;

public class IconTest extends JPanel{

public IconTest(){

}

@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
super.paintComponent(g2d);
this.setBackground(new Color(255,255,255));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// create icon body
Ellipse2D iconBody = new Ellipse2D.Double(0, 0, 100, 100);
g2d.setPaint(Color.YELLOW);
g2d.draw(iconBody);
g2d.fill(iconBody);

// icon content
JSVGCanvas svg = new JSVGCanvas();
svg.setURI("file:/C:/Users/Linda/Desktop/smile.svg");
add(svg);
}

public static void main(String[] args) throws Exception{

JFrame frame = new JFrame("IconTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,600);
frame.setVisible(true);
IconTest i = new IconTest();
frame.add(i);


}
}

编辑:

在改变窗口大小之前

enter image description here

变换窗口大小后。 SVG 始终以白色背景添加,它的大小取决于我变换窗口的速度...

enter image description here

编辑:您可以下载 svg 文件 here

最佳答案

The svg is loaded with white background and in the wrong size.

我不是 100% 确定,因为我无法测试 atm,但您添加了白色背景:

this.setBackground(new Color(255,255,255)); //Remove this line

所以,背景是白色的,这就是为什么你会看到带有白色背景的 svg。或者将其更改为另一种颜色,看看会发生什么。

尺寸错误是什么意思?

The circle is in the right position but the svg is drawn all over the JPanel and if i resize the frame the svg is added all the time.

嗯,JFrame 默认情况下有一个 BorderLayout当您添加某些内容而不指定 BorderLayout 中您想要的位置时,默认位置是 BorderLayout.CENTER并且您没有在任何地方添加任何其他内容,因此它使用 JPanel 的 100% 大小。也许您想尝试使用不同的 Layout Manager例如 BoxLayoutFlowLayout或者可能是GridLayout .

我在您的代码中看到的另一件事是您在显示 JFrame 之后添加 IconTest 面板,而不是您应该像这样更改它,一旦您已为您的 JFrame 选择了另一个布局。

JFrame frame = new JFrame("IconTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
IconTest i = new IconTest();
frame.add(i);
frame.setSize(600,600);
frame.setVisible(true);

关于java - 生成带有 svg 内容的图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34680044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com