JLabel图标在运行时不会更改

时间:2014-04-29 21:00:15

标签: java swing jlabel imageicon

当我运行程序时,我需要在运行时向GUI添加图像。据我所知,从源文件中获取图像有效:

public ImageIcon getImage()
{
    ImageIcon image = null;

    if (length > 6.0)
    {
        //TODO
    } else {

        try
        {
            image = new ImageIcon(ImageIO.read( new File("car.png")));
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "An Error occured! Image not found.", "Error", JOptionPane.ERROR_MESSAGE);
        }

    }

    return image;
}

然后我使用JLabel方法将图像添加到.setIcon(),但GUI上没有任何变化。

public void addCarImage(Car newCar, int spaceNo)
{
    ImageIcon carImage;

    carImage = newCar.getImage();

    JOptionPane.showMessageDialog(null, "Car", "Car", JOptionPane.INFORMATION_MESSAGE, carImage);

    carList[spaceNo - 1] = newCar;
    carLabel[spaceNo - 1].setIcon(carImage);

}

添加了JOptionPane消息,以查看图片是否实际加载,而且确实如此。

有什么想法吗?我已经使用谷歌寻找解决方案,例如repaint()/revalidate()/updateUI(),但它们无效。

编辑 - carLabels就像这样添加(在添加图像之前)。 JLabels最初是空白的。

carLabel = new JLabel[12];

    for (int i = 0; i < carLabel.length; i++)
    {
        carLabel[i] = new JLabel();
    }


carPanel.setLayout(new GridLayout(3, 4));

for (int i = 0; i < 12; i++)
    {
         carPanel.add(carLabel[i]);
    }

2 个答案:

答案 0 :(得分:3)

请确保在秋千线上进行。 此外,请确保正确加载图像。

这是一个我用来测试的简单代码,很好。

public class Main {
public static void main(String[] args) {
    final JFrame frame = new JFrame("TEST");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    final JLabel label = new JLabel();
    ImageIcon icon = null;

    try {
        icon = new ImageIcon(ImageIO.read(new File("C:\\images\\errorIcon.png")));
    } catch (IOException e) {
        e.printStackTrace();
    }

    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(label, BorderLayout.CENTER);
    frame.setSize(200,200);

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            frame.setVisible(true);
        }
    });


    try {
        Thread.currentThread().sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    final ImageIcon finalIcon = icon;
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            if(finalIcon != null && finalIcon.getImageLoadStatus() == MediaTracker.COMPLETE){
               label.setIcon(finalIcon);
            }
        }
    });
}

}

Yarik。

答案 1 :(得分:0)

设置值后,

carLabel [i] .repaint()应该正常工作