我想知道为什么我的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();
}
我做错了什么?
答案 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();