Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JWindow-won';t显示图像图标_Java_Swing_Embedded Resource_Imageicon - Fatal编程技术网

Java JWindow-won';t显示图像图标

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不会显示我的图像。我有以下代码:

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()@thewrenchinesystem
import javax.swing.Timer标准库中还有另一个计时器类喜欢与swing计时器冲突。主程序出现在启动窗口消失之前。虽然我建议使用swing
计时器,但您假设OP已在其上下文中启动程序。在询问窗口是否显示时,OP回答“是,但为空”,这表明他们没有在EDT中运行。这也不能解决图像未显示的问题。编辑给出一个错误:删除参数以匹配Timer()@thewrenchinesystem
import javax.swing.Timer标准库中还有另一个计时器类喜欢与swing计时器冲突。主程序出现在启动窗口消失之前。虽然我建议使用swing
计时器,但您假设OP已在其上下文中启动程序。在询问窗口是否显示时,OP回答“是,但为空”,这表明他们没有在EDT中运行。这也无法解决图像未显示的问题“我在应用程序中有我的jar。图片与jar在java文件夹中”-因此,基于此,我会说,不,它不在jar中…此方法的一个优点是,当找不到图像时,您将获得NPE,与您现在使用的方法不同,它会无声地失败。
ImageIO.read
也会抛出一个
IOException
,这比
ImageIcon
更好,但是如果Jar文件中不存在资源,它将无法解决问题…@MadProgrammer很难解释海报的确切含义。真正重要的是,映像位于相对于类路径根的某个位置。对于一个独立的应用程序来说,情况总是如此。许多构建系统会专门为此生成一个资源目录。如果不是呢?比如,如果执行上下文与Jar的源位置不同?这解决不了问题