Java中的SVG显示不正确

3

好的,我有一个Java程序,显示一些在FlowLayout中的SVG图块。这是通过类ScrabbleRack完成的,该类扩展JPanel,然后将JSVGCanvas图块添加到该面板中。

之后,我创建了一个框架并添加了该面板(打包并显示)。但是,在出现时,该面板无法正确显示。它只显示第一个图块,然后在其余应显示图块的空间中会显示白色区域。

但是,如果我按任意量调整框架大小,则图像将正确呈现。

public class ScrabbleRackGUI extends JPanel{
    ScrabbleRack rack=new ScrabbleRack();
    JSVGCanvas rackContentsImages[]=new JSVGCanvas[8];

public ScrabbleRackGUI() {
   setLayout(new FlowLayout());
   createComponents();
}
public void createComponents() {
    //INITIALISE SOURCE IMAGES
    initImages();
    for (int i=0;i<rackContentsImages.length;i++){
        this.add(rackContentsImages[i]);
    }
}
private void initImages(){
    File tempImages[]=new File[8];
    for(int i=0;i<8;i++){
       tempImages[i]= new File("./src/res/rackBackground.svg");
       rackContentsImages[i]=new JSVGCanvas();
       try {
           rackContentsImages[i].setURI(tempImages[i].toURL().toString());
       } catch (MalformedURLException ex) {
           Logger.getLogger(ScrabbleBoardGUI.class.getName()).log(Level.SEVERE, null, ex);
       }
    }
}
public static void main(String args[])
{
    JFrame frame = new JFrame("ScrabbleTest");
    ScrabbleRackGUI rack= new ScrabbleRackGUI(1);
    frame.add(rack);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setSize(214,70);
    frame.setVisible(true);

}
}

任何想法如何让这个面板第一次正确显示?或者有一些技巧可以在程序结束时重新调整大小。
我使用 batik 在Java中渲染SVG,供那些想要重现这个问题的人参考。

我们能看到一个屏幕截图吗? - Rekin
1
它是“Java”,不是“JAVA”。Java不是首字母缩略词 - Joachim Sauer
3个回答

1

你的问题可能是GUI的构建没有在EDT上完成。

你的主函数应该长这样:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            MyWindow window = new MyWindow();
            MyWindow.setVisible(true);
            }
        });
    }

而你当前主函数中的其余代码应该在MyWindow构造函数中。

更详细的信息可以在http://leepoint.net/JavaBasics/gui/gui-commentary/guicom-main-thread.html(以及其他地方)找到。


发现EDT故障加1分。错过这个可能会产生最奇怪的结果。 - Waldheinz

0
首先,你写了: ScrabbleRackGUI rack= new ScrabbleRackGUI(1); 但是你没有一个带有int参数的构造函数。
其次,你将FlowLayout设置为JPanel组件,并且JPanel默认具有FlowLayout布局。最好调用super();以获得JPanel的所有好处。
尝试在事件分派线程(EDT)内运行应用程序,正如其他人已经提到的那样。 SwingUtilities.invokeLater(new Runnable() { // your code here }
此外,你应该像这样设置URI: setURI(f.toURI().toURL().toString()); 因为f.toURL()已被弃用。
希望能对你有所帮助。

0

这可能与Batik问题35922有关,该问题在此处报告:https://issues.apache.org/bugzilla/show_bug.cgi?id=35922

如果我正确理解了该错误报告,您可以通过先添加JSVGCanvas实例(和ScrabbleRackGUI实例)并首先调用pack(),然后在每个JSVGCanvas上设置URI来解决该问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接