我正在尝试显示图像(作为JLabel
的图像图标)。当我不尝试显示图像时,一切正常,即:
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
代码:(粘贴版本,语法突出显示: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();
}
}
我的问题是:
- 为什么相比之下会引发例外?(一切似乎都从我的角度来看很好)
- 堆栈溢出问题是否会导致每个时间对象声明?(因为我在循环中没有看到任何其他问题)。
PS:getScaledInstance可以使用还是有更好的方法?
任何帮助将不胜感激。
编辑:总的来说,我没有发现代码有任何真正的问题,我唯一能说的问题不在于缩放。解析没有缩放的小尺寸图像(如 8x8 或 4x4)也会产生错误,但是对于解析大小为 16x16 或更高的图像或缩放到 16x16 的图像,一切都很好。在布局中放置/添加小尺寸图像(即元素)可能是个问题。
您正在使用wall
作为图标。wall
是在 try 块中创建的,您甚至不会记录引发的异常。
问题可能在这里:也许您在创建图标时提出了异常(IOException),但您看不到它。
您可以尝试使用 JLabel 构造函数public JLabel(Icon image)
而不是空构造函数
阿波罗