生成带有svg内容的图标

时间:2016-01-08 15:03:02

标签: java swing svg batik

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

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

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

  3. 有没有办法让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);
    
    
        }
    }
    

    编辑:

    bevor转换窗口大小

    enter image description here

    转换窗口大小后

    。 SVG一直是白色背景添加的,它的大小取决于我对窗口的转换速度......

    enter image description here

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

1 个答案:

答案 0 :(得分:2)

  

svg加载了白色背景,尺寸错误。

我不是百分百肯定因为我无法测试atm,但是您要添加白色背景:

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

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

您对in the wrong size的意思是什么?

  

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

嗯,默认情况下,JFrame有一个BorderLayout,当您添加内容时,默认位置没有指定BorderLayout所需的BorderLayout.CENTER和{39}} ;不要在任何地方添加任何其他内容,因此它使用JPanel的100%大小。也许您想尝试使用其他Layout Manager,例如BoxLayoutFlowLayoutGridLayout

我在您的代码中看到的另一件事是您在显示IconTest之后添加了JFrame面板,相反,您应该像这样更改它,一旦您&#39 ;为您的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);