JWindow不会显示ImageIcon

时间:2015-07-19 00:57:02

标签: java swing embedded-resource imageicon

我想知道为什么我的JWindow不会显示我的图像。我有这段代码:

JWindow window = new JWindow();
JPanel jp = new JPanel();
JLabel l = new JLabel(new ImageIcon("GenericApp.png"));
jp.add(l);
window.add(jp);
window.setBounds(500, 150, 300, 200);
window.setVisible(true);
try {
    Thread.sleep(5000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
window.setVisible(false);

编辑:我的代码现在(回到原始版本):

final JWindow window = new JWindow();
JPanel jp = new JPanel();
JLabel l = new JLabel(new ImageIcon(Asset.class.getResource("GenericApp.png")));
jp.add(l);
window.add(jp);
window.setBounds(500, 150, 300, 200);
window.setVisible(true);
try{
    Thread.sleep(5000);
}catch(InterruptedException e){
    e.printStackTrace();
}
window.setVisible(false);

是的,我决定使用Thread.sleep()。我的jar从/ Users / thomasokeeffe / Desktop / eclipse / AI / AI执行,这就是图片所在的位置。我启动时仍然会得到一个空白的JWindow。 System.out.println(new File("GenericApp.png").exists());返回true。

如果我把图片放在jar文件中,那么对我来说会更容易吗?其中一个最奇怪的事情是,当我在应用程序中运行jar并将图片放在工作目录中时,它仍然显示一个空白矩形.......

编辑到目前为止,我已尝试使用URL,并通过获取user.dir系统属性进行调试。我现在有两行代码用于获取图片(图片与课程在同一个包中):

URL url = this.getClass().getResource("GenericApp.png");
JLabel l = new JLabel(new ImageIcon(url));

我也尝试过使用InputStream:

InputStream is = this.getClass().getResourceAsStream("GenericApp.png");
Image image = null;
try {
    image = ImageIO.read(is);
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

我做错了什么?

2 个答案:

答案 0 :(得分:0)

如果图像在你的罐子里或一般在你的类路径中,你可以通过

获取它
getClass().getResource(resourcePath);

资源路径根植于类路径的根目录。

例如,与您的班级在同一目录中的图像将是

new JLabel(new ImageIcon(getClass().getResource("GenericApp.png")));

答案 1 :(得分:-1)

Gui代码适用于事件调用。当您的功能在主线程中执行时,屏幕上不会发生任何变化。屏幕上的实际更改是在对代码的调用之间完成的。这意味着您的功能应该尽快完成。

所以要得到表明你需要返回的东西。

要将某些代码排队以便稍后执行,可以使用javax.swing.Timer:

JWindow window = new JWindow();
JPanel jp = new JPanel();
JLabel l = new JLabel(new ImageIcon("GenericApp.png"));
jp.add(l);
window.add(jp);
window.setBounds(500, 150, 300, 200);
window.setVisible(true);
Timer timer = new Timer(5000, new ActionListener(){
    void actionPerformed(ActionEvent e){
        window.setVisible(false);
    }
});
timer.setRepeats(false);//only do this once
timer.start();