2010-05-05 62 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()已過時

我希望它能幫助