【问题标题】:Java Swing Image doesn't showJava Swing 图像不显示
【发布时间】:2014-11-04 14:39:24
【问题描述】:

这是我在这里的第一篇文章,我的英语不是很好,所以我希望你们 了解我有什么问题,也希望我在这里没有做错任何事情。

我的问题:

我正在学习 atm Swing 以及它是如何工作的,但我总是遇到一些图片不显示的问题。 也许我不明白 Swing 的某些部分,所以我希望你能解释一下为什么图片没有加载,这样我就可以学习它并做得更好:)

我尝试了很多变化,但我真的只是失败了,我不知道为什么。 我也用图形尝试过。

我的程序:

JFrame -> JPanel -> JLabel(有图片,应该放在JPanel上,或者JPanel上可能有直接的方式)

test2.jpg 在我的包文件夹中,eclipse dont 报错。

我也会将 JPanel 放在一个单独的类中,并且不会将 JFrame 扩展到 Gui 类。

这是我的 3 节课:

开始:

package verwaltungssoftware;

public class Start

{

    //Start der Applikation

    public static void main(String[] args)

    {
        System.out.println("Willkommen bei der Verwaltungssoftware fuer die Jobsuche");
        new Gui();
    }

}

桂:

package verwaltungssoftware;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;


public class Gui
{
    //Importiert Auflösung des Bildschirms
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension screenSize = tk.getScreenSize();

    //Setzt Variablen für die Auflösung
    public int aufloesungBreite = screenSize.width;
    public int aufloesungHoehe = screenSize.height;

    //Setzt die Berechnung des JFrame hauptfenster Location
    private int breite = aufloesungBreite/2 - 640;
    private int hoehe = aufloesungHoehe/2 - 400;


    public Gui()

    {
        JFrame hauptfenster = new JFrame("Verwaltungssoftware fuer die Jobsuche");
        hauptfenster.setDefaultCloseOperation(hauptfenster.EXIT_ON_CLOSE);
        hauptfenster.setResizable(false);
        hauptfenster.setLocation(breite, hoehe);
        hauptfenster.setSize(1280,800);
        hauptfenster.setLayout(new BorderLayout(5,5));

        //Addet hauptpanel zum JFrame
        Panel hauptpanel = new Panel();
        hauptfenster.add(hauptpanel);   
        hauptpanel.setVisible(true);
        hauptfenster.setVisible(true);
    }


}

和小组:

package verwaltungssoftware;
import java.awt.BorderLayout;
import java.awt.Image;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Panel extends JPanel
{
    private static final long serialVersionUID = 6769810448979262470L;

    //Variablen

    Image icon1;


    //Konstruktor
    public Panel()

    {
        try 
        {
            icon1  = ImageIO.read(getClass().getResource("test2.jpg"));
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }

        JPanel panelhauptfenster = new JPanel();
        panelhauptfenster.setLayout(new BorderLayout (5,5));
        panelhauptfenster.setSize(1280,800);
        panelhauptfenster.setLocation(0,0);
        panelhauptfenster.setVisible(true);

        JLabel myLabel=new JLabel();
        myLabel.setLocation(0,0);
        myLabel.setSize(panelhauptfenster.getWidth(),panelhauptfenster.getHeight());
        myLabel.setIcon(new ImageIcon(icon1));
        myLabel.setVisible(true);

        panelhauptfenster.add(myLabel);
    }
}

非常感谢您的帮助。

【问题讨论】:

  • getClass().getResource("test2.jpg") ..图像是否位于verwaltungssoftware 目录/路径中,getResource 期望找到它?
  • 我更改路径时正确的路径给了我一个错误:线程“main”java.lang.IllegalArgumentException中的异常:输入== null!在 javax.imageio.ImageIO.read(ImageIO.java:1388) 在 verwaltungssoftware.Panel.(Panel.java:25) 在 verwaltungssoftware.Gui.(Gui.java:34) 在 verwaltungssoftware.Start。 main(Start.java:13) 图片在包verwaltungssoftware中
  • 好哦。将getClass().getResource("test2.jpg") 因素放入我输入答案并尝试的源代码中。上面代码中的方法有许多我纠正的缺陷。

标签: java image swing embedded-resource


【解决方案1】:

以下来源有效。变化包括:

  • 返回合理的首选尺寸。删除所有对 setSize(..) 的调用。
  • 分离出添加图像的面板,而是直接将其添加到Panel 实例。
  • 但是Panel 被重命名为ImagePanel,所以这与现有的 AWT 类的名称不同!
  • 删除对setVisible(..) 的调用。唯一适用的是顶级容器,如JFrameJDialog。其余的,将它们添加到本身可见的容器中。

import java.awt.*;
import javax.swing.*;
import java.net.URL;
import javax.imageio.ImageIO;

class Gui {
    //Importiert Auflösung des Bildschirms
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension screenSize = tk.getScreenSize();

    //Setzt Variablen für die Auflösung
    public int aufloesungBreite = screenSize.width;
    public int aufloesungHoehe = screenSize.height;

    //Setzt die Berechnung des JFrame hauptfenster Location
    private int breite = aufloesungBreite/2 - 640;
    private int hoehe = aufloesungHoehe/2 - 400;


    public Gui() {
        JFrame hauptfenster = new JFrame("Verwaltungssoftware fuer die Jobsuche");
        hauptfenster.setDefaultCloseOperation(hauptfenster.EXIT_ON_CLOSE);
        hauptfenster.setResizable(false);
        hauptfenster.setLocation(breite, hoehe);
        hauptfenster.setSize(1280,800);
        hauptfenster.setLayout(new BorderLayout(5,5));

        //Addet hauptpanel zum JFrame
        ImagePanel hauptpanel = new ImagePanel();
        hauptfenster.add(hauptpanel);   
        hauptpanel.setVisible(true);
        hauptfenster.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                new Gui();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

class ImagePanel extends JPanel {
    //Variablen
    Image icon1;

    //Konstruktor
    public ImagePanel() {
        try  {
            URL url = new URL("http://i.stack.imgur.com/7bI1Y.jpg");
            icon1  = ImageIO.read(url);
        } catch (Exception e)  {
            e.printStackTrace();
        }

        setLayout(new BorderLayout (5,5));
        JLabel myLabel=new JLabel(new ImageIcon(icon1));
        add(myLabel);
    }

    // very important!
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(icon1.getWidth(this), icon1.getHeight(this));
    }
}

【讨论】:

  • 好工作图片正在加载,但我不知道如何将面板放到框架上。当preferedsize 从中获取宽度和长度时,我必须在某处设置面板的大小,因为我将它添加到gui JFrame。当我明白正确的图标在 getpreferedsize 之后具有面板的大小时
  • 如果您需要进一步的帮助,请准备一个 MCVE(最小完整可验证示例),就像我发布的那样。值得注意的是,它需要是一个源文件(可能有多个类,尽管只有一个 public 类)并且应该热链接到图像。
  • 我犯了一个错误,它可以工作,但我不能在示例中使用像你这样的 URL,因为我有一个 PATH。我想我需要像下面写的康提那样做。但是存在java无法从Imageicon转换为image的问题。
  • “我不能在示例中使用像你这样的 URL,因为我有一个 PATH” 你确实意识到 getResource(..) 返回一个 URL,对吗?不要考虑你的应用程序如何。最终会看起来或它将使用什么图像。我建议简单地热链接到图像,以便(当您运行代码时)您可以看到它,我们可以看到它,并且将来任何人都可以看到它。我链接到的图像在Example images for code and mark-up Q&As 中提到。我专门要求它我们可能热链接到的示例图像。不要打扰..
  • 好吧,它现在可以工作了,当我现在查看代码时,我真的很愚蠢 :) 非常感谢 Thompson。抱歉,我首先不明白你所说的热链接是什么意思。
【解决方案2】:

试试这样。 icon1= new ImageIcon(getClass().getResource("/test2.jpg"))

【讨论】:

  • 无法从 Imageicon 转换为图像
  • 抱歉没能听懂。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2010-09-07
  • 2021-06-08
  • 2010-10-09
相关资源
最近更新 更多