Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用蜡染的文本元素的边界框值错误_Java_Svg_Batik - Fatal编程技术网

Java 使用蜡染的文本元素的边界框值错误

Java 使用蜡染的文本元素的边界框值错误,java,svg,batik,Java,Svg,Batik,我试图使用getBBox()在文本元素周围绘制一个矩形,代码非常简单,创建文档、添加文本元素、启动文档和添加矩形。 问题是getBBox返回了一些奇怪的值,我是否遗漏了什么 DOMImplementation impl; String svgNS; SVGDocument doc; Element svgRoot; UserAgent userAgent; DocumentLoader loader; BridgeContext ctx; GVTBuilder builder; Graphic

我试图使用getBBox()在文本元素周围绘制一个矩形,代码非常简单,创建文档、添加文本元素、启动文档和添加矩形。 问题是getBBox返回了一些奇怪的值,我是否遗漏了什么

DOMImplementation impl;
String svgNS;
SVGDocument doc;
Element svgRoot;

UserAgent userAgent;
DocumentLoader loader;
BridgeContext ctx;
GVTBuilder builder;
GraphicsNode rootGN;

...

// get a DOM and create a document
impl = SVGDOMImplementation.getDOMImplementation();
svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
doc = (SVGDocument)impl.createDocument(svgNS, "svg", null);

// Get (the 'svg' element).
svgRoot = doc.getDocumentElement();

// Set the width and height attributes on the root 'svg' element.
svgRoot.setAttributeNS(svgNS, "width", "400");
svgRoot.setAttributeNS(svgNS, "height", "450");

// Add a text element
Element txtElem = doc.createElementNS(svgNS, "text");
txtElem.setAttributeNS(svgNS, "x", "30");
txtElem.setAttributeNS(svgNS, "y", "50");
txtElem.setAttributeNS(svgNS, "style", "font-family:Arial;font-size:20;stroke:#000000;#fill:#00ff00;");
txtElem.setTextContent("sometext");

svgRoot.appendChild(txtElem);

// boot the document
userAgent = new UserAgentAdapter();
loader = new DocumentLoader(userAgent);
ctx = new BridgeContext(userAgent, loader);
ctx.setDynamicState(BridgeContext.DYNAMIC);
builder = new GVTBuilder();
rootGN = builder.build(ctx, doc);

// add a bounding box to text elements
NodeList nodelist = doc.getElementsByTagName("text");
for (int i=0; i < nodelist.getLength(); i++) {
    SVGOMTextElement textElem = (SVGOMTextElement)nodelist.item(i);
    SVGRect bbox = textElem.getBBox();

    Element rectangle = doc.createElementNS(svgNS, "rect");
    rectangle.setAttributeNS(svgNS, "x", new Float(bbox.getX()).toString());
    rectangle.setAttributeNS(svgNS, "y", new Float(bbox.getY()).toString());
    rectangle.setAttributeNS(svgNS, "width", new Float(bbox.getWidth()).toString());
    rectangle.setAttributeNS(svgNS, "height", new Float(bbox.getHeight()).toString());
    rectangle.setAttributeNS(svgNS, "fill", "rgba(0,0,0,0)");
    rectangle.setAttributeNS(svgNS, "stroke", "#ff0000");
    rectangle.setAttributeNS(svgNS, "stroke-width", "1");

    svgRoot.appendChild(rectangle);
}
dominimplementimpl;
字符串svgNS;
SVG文件文件;
元素svgRoot;
用户代理;
文档加载器;
桥联ctx;
GVTBuilder-builder;
图形节点rootGN;
...
//获取DOM并创建文档
impl=SVGDOMImplementation.getdominimplementation();
svgNS=SVGDOMImplementation.SVG_NAMESPACE_URI;
doc=(SVGDocument)impl.createDocument(svgNS,“svg”,null);
//获取(svg元素)。
svgRoot=doc.getDocumentElement();
//设置根“svg”元素的宽度和高度属性。
刚毛(svgNS,“宽度”,“400”);
(svgNS,“高度”,“450”);
//添加一个文本元素
元素txtElem=doc.createElements(svgNS,“text”);
(svgNS,x,30);;
(svgNS,y,50);;
setAttributeNS(svgNS,“样式”,“字体系列:Arial;字体大小:20;笔划:#000000;#填充:#00ff00;”;
setxtcontent(“sometext”);
svgRoot.appendChild(txtElem);
//启动文档
userAgent=new UserAgentAdapter();
加载器=新文档加载器(userAgent);
ctx=新的BridgeContext(userAgent、loader);
setDynamicState(BridgeContext.DYNAMIC);
builder=新的GVTBuilder();
rootGN=builder.build(ctx,doc);
//向文本元素添加边界框
NodeList NodeList=doc.getElementsByTagName(“文本”);
for(int i=0;i
这是我得到的SVG文档,您可以看到矩形具有不同的X和Y值(宽度和高度也是错误的)


一些文字

问题在于,您必须使用
setattributes
而不是
setattributes
。指定的
x
y
坐标将被忽略,因为它们不是Batik在默认命名空间中期望的
x
y
属性,它们似乎被识别为其他未知属性。只要用这个:

txtElem.setAttribute("x", "30");
txtElem.setAttribute("y", "50");
txtElem.setAttribute("style", "font-family:Arial;font-size:20;stroke:#000000;fill:#00ff00;");
试试这个:

rectangle.setAttributeNS(null,

并且只在
createElements
中保留
svgNS

您还可以发布添加矩形的代码吗?在文档引导之后,矩形添加代码就在for循环中。我不确定这是不是正确的方法。不过,我没有向下滚动到足以看到for循环…我不知道为什么这个答案会被否决
setAttributeNS(null,…)
甚至在官方蜡染常见问题解答中被宣布为首选方法(与
setAttribute(…)
相反):(参见问题3.4:“当我从ECMAScript通过DOM API创建新的SVG元素或修改一些SVG属性时,不会发生任何事情,不会呈现更改。为什么不?”)
rectangle.setAttributeNS(null,