Java JWindow-won';t显示图像图标
我想知道为什么我的JWindow不会显示我的图像。我有以下代码:Java JWindow-won';t显示图像图标,java,swing,embedded-resource,imageicon,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 { Thr
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);
编辑:我的代码现在是(返回原始代码):
是的,我决定使用Thread.sleep()
。我的jar从/Users/thomasokeeffe/Desktop/eclipse/AI/AI执行,这就是图片所在的位置。当我启动时,仍然会看到一个空白窗口。和System.out.println(新文件(“GenericApp.png”).exists())代码>返回true
再进行一次编辑如果我将图片放入jar文件中,会更容易吗?最奇怪的事情之一是,当我运行jar而不是在应用程序中,并将图片放在工作目录中时,它仍然显示一个空白矩形
编辑现在我已经尝试使用URL,并通过获取user.dir系统属性进行调试。我现在有两行代码来获取图片(图片与类在同一个包中):
我还尝试过使用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();
}
我做错了什么?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();
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();
如果图像在您的jar中,或者通常在您的类路径中,您可以通过
getClass().getResource(resourcePath);
其中资源路径根在类路径的根上
例如,与类位于同一目录中的图像
new JLabel(new ImageIcon(getClass().getResource("GenericApp.png")));
如果图像在您的jar中,或者通常在您的类路径中,您可以通过
getClass().getResource(resourcePath);
其中资源路径根在类路径的根上
例如,与类位于同一目录中的图像
new JLabel(new ImageIcon(getClass().getResource("GenericApp.png")));
Thread.sleep(5000)代码>可能不会有帮助。有关更多详细信息,请参阅和。这个窗口真的出现了吗?我不知道在计时器之前、之后或里面放代码的位置。部分代码放在计时器中,特别是设置可见(假)
。图像存储在哪里(在项目源的上下文中)?我在应用程序中有我的jar。pic与Jar位于java文件夹中假设映像与Jar位于同一目录中,并且程序从与Jar相同的位置执行,那么应该加载映像。尝试改用JLabel(新图像图标(ImageIO.read(新文件(“GenericApp.png”)))
,如果无法读取图像Thread.sleep(5000),它将抛出IOException
代码>可能不会有帮助。有关更多详细信息,请参阅和。这个窗口真的出现了吗?我不知道在计时器之前、之后或里面放代码的位置。部分代码放在计时器中,特别是设置可见(假)
。图像存储在哪里(在项目源的上下文中)?我在应用程序中有我的jar。pic与Jar位于java文件夹中假设映像与Jar位于同一目录中,并且程序从与Jar相同的位置执行,那么应该加载映像。尝试改用JLabel(新图像图标(ImageIO.read(新文件(“GenericApp.png”)))
,如果无法读取图像,它将抛出IOException
。它给出一个错误:删除参数以匹配Timer()@thewrenchinesystemimport javax.swing.Timer代码>标准库中还有另一个计时器类喜欢与swing计时器冲突。主程序出现在启动窗口消失之前。虽然我建议使用swing计时器,但您假设OP已在其上下文中启动程序。在询问窗口是否显示时,OP回答“是,但为空”,这表明他们没有在EDT中运行。这也不能解决图像未显示的问题。编辑给出一个错误:删除参数以匹配Timer()@thewrenchinesystemimport javax.swing.Timer代码>标准库中还有另一个计时器类喜欢与swing计时器冲突。主程序出现在启动窗口消失之前。虽然我建议使用swing计时器,但您假设OP已在其上下文中启动程序。在询问窗口是否显示时,OP回答“是,但为空”,这表明他们没有在EDT中运行。这也无法解决图像未显示的问题“我在应用程序中有我的jar。图片与jar在java文件夹中”-因此,基于此,我会说,不,它不在jar中…此方法的一个优点是,当找不到图像时,您将获得NPE,与您现在使用的方法不同,它会无声地失败。ImageIO.read
也会抛出一个IOException
,这比ImageIcon
更好,但是如果Jar文件中不存在资源,它将无法解决问题…@MadProgrammer很难解释海报的确切含义。真正重要的是,映像位于相对于类路径根的某个位置。对于一个独立的应用程序来说,情况总是如此。许多构建系统会专门为此生成一个资源目录。如果不是呢?比如,如果执行上下文与Jar的源位置不同?这解决不了问题