2010-05-05 60 views
3

好的,我有一个Java程序,它在FlowLayout中显示一些SVG的图块。它通过成为ScrabbleRack类并扩展JPanel,然后将JSVGCanvas切片添加到此面板来实现此目的。Java中的SVG显示不正确

然后我创建了一个框架并添加了面板。 (打包并显示它)。出现时,面板无法正常显示。它只显示第一个图块,然后显示其余图块应该显示的空间,这里有whitearea。

但是,如果我调整任何数量的帧的大小,图像将正确渲染。

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中SVGs,对于那些谁想要重现此问题。

+0

我们可以看到一个屏幕截图 – Rekin 2010-12-28 20:08:26

+1

它的 “Java”,而不是 “JAVA”[Java是不是一个缩写(HTTP:?// java.sun.com/products/jdk/faq.html#B1)。 – 2011-02-04 16:23:46

回答

0

这可能与此报告蜡染问题35922:()第一https://issues.apache.org/bugzilla/show_bug.cgi?id=35922

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

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(其他地方)

+0

+1用于查找EDT故障。缺少这可能会产生最奇怪的结果。 – Waldheinz 2011-01-25 22:06:17

0

首先来发现,你写道: ScrabbleRackGUI架=新ScrabbleRackGUI(1); 而你没有使用int的构造函数。其次,您将FlowLayout设置为JPanel组件,并且JPanel默认将FlowLayout设置为布局。更好地调用super();获得JPanel的所有好处。

尝试在Event Dispatching Thread(EDT)中运行您的应用程序,如其他人所述。 SwingUtilities.invokeLater(Runnable的新(){// 您的代码在这里 }

你也应该设置你的URI是这样的:。 setURI(f.toURI()的toURL()的toString()); 。因为f.toURL()已过时

我希望它能帮助