3

わかりました、FlowLayout に SVG であるいくつかのタイルを表示する Java プログラムがあります。クラス 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);

}
}

このパネルを初めて正しく表示する方法についてのアイデア。

または、プログラムの最後にサイズを変更するハック。


この問題を再現したい人のために、バティックを使用して Java で SVG をレンダリングしました。

4

3 に答える 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 (他の場所の中でも)にあります。

于 2011-01-14T17:36:22.427 に答える
0

これは、 https ://issues.apache.org/bugzilla/show_bug.cgi?id=35922 で報告されている Batik の問題 35922 に関連している可能性があります。

そのバグ レポートを正しく理解している場合は、JSVGCanvas インスタンス (および ScrabbleRackGUI インスタンス) を追加し、最初に pack() を呼び出してから、各 JSVGCanvas に URI を設定することで問題を回避できます。

于 2011-01-14T17:27:05.737 に答える
0

まず第一に、あなたは次のように書いています: ScrabbleRackGUI rack= new ScrabbleRackGUI(1); intを取るコンストラクタがありません。

次に、FlowLayout を JPanel コンポーネントに設定しており、JPanel はデフォルトでレイアウトとして FlowLayout を持っています。super(); を呼び出したほうがよいでしょう。JPanel のすべての利点を得ることができます。

他の人が既に述べたように、イベント ディスパッチ スレッド (EDT) 内でアプリケーションを実行してみてください。SwingUtilities.invokeLater(new Runnable() { // ここにコード }

また、次のように URI を設定する必要があります: setURI(f.toURI().toURL().toString()); f.toURL() は推奨されていないためです。

お役に立てば幸いです。

于 2011-02-04T16:13:05.607 に答える