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);

}
}

关于如何让这个面板第一次正确显示的任何想法。

或者一些会在程序结束时调整大小的技巧。


对于那些想要重现这个问题的人,我使用蜡染在 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);
            }
        });
    }

您当前 main 中的其余代码应该在 MyWindow 构造函数中。

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

于 2011-01-14T17:36:22.427 回答
0

这可能与此处报告的蜡染问题 35922 有关:https ://issues.apache.org/bugzilla/show_bug.cgi?id=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 回答