比较方法违规和stackoverflow

时间:2014-04-02 12:24:54

标签: java swing user-interface

我正在尝试显示图像(作为JLabel s的图像图标)。 当我不想显示图像时,一切正常,即:

for (int i=0;i<value;i++)
    {
        for (int j=0;j<value;j++)
        {
            c.gridx=i;
            c.gridy=j;
            JLabel element = new JLabel("!");
            pane.add(element,c);
        }
    }

但是,如果我这样做:

for (int i=0;i<value;i++)
    {
        for (int j=0;j<value;j++)
        {
            c.gridx=i;
            c.gridy=j;
            JLabel element = new JLabel();
            element.setIcon(wall);
            pane.add(element,c);
        }
    }

它会产生大量的错误信息。 控制台输出:http://pastebin.com/teuuWjRX

代码:(带有语法高亮的pastebin版本:http://pastebin.com/2utFJ0UM

package tut;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
public class Main extends JFrame{
//private static int value;
public Main()
{
    int value=151;//151
    ImageIcon wall = new ImageIcon();
    try
    {
        BufferedImage tempImage = ImageIO.read(this.getClass().getResource(("/resources/images/test.png")));
        wall = new ImageIcon(tempImage.getScaledInstance(4, 4, Image.SCALE_DEFAULT));
    }
    catch (IOException e){}
    Container pane = getContentPane();
    pane.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    for (int i=0;i<value;i++)
    {
        for (int j=0;j<value;j++)
        {
            c.gridx=i;
            c.gridy=j;
            JLabel element = new JLabel();
            element.setIcon(wall);
            pane.add(element,c);
        }
    }
    //Main Frame
    setTitle("Example1");
    setSize(value*8,value*8);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main (String[] args)
{
    Main test1= new Main();
}
}

我的问题是:

  • 为什么它会引发异常? (一切似乎都是 从我的角度来说没问题)
  • 是否因为每次对象声明而导致stackOverFlow问题? (因为我在循环中没有看到任何其他问题)。

P.s。:getScaledInstance可以使用还是有更好的方法?

非常感谢任何帮助。

编辑:总的来说,我没有发现代码有任何实际问题,我唯一可以说问题不在于缩放。解析没有缩放的小尺寸图像(如8x8或4x4)也会产生错误,但是对于解析大小为16x16或更高或缩放到16x16的图像,一切都很好。将小尺寸图像(即元素)放置/添加到布局可能是一个问题。

1 个答案:

答案 0 :(得分:0)

您使用wall作为图标。 wall是在try块中创建的,您甚至不记录引发的异常。

问题可能出在这里:也许你在图标创建时引发异常(IOException)而你却看不到它。


您可以尝试使用JLabel构造函数public JLabel(Icon image)而不是空构造函数

阿波罗