Java ImageIO.read正在无误地终止程序

Java ImageIO.read正在无误地终止程序,java,swing,user-interface,jpanel,imageicon,Java,Swing,User Interface,Jpanel,Imageicon,哈哈,我刚才完全失败了。删除某些内容后上载了代码 无论如何,我使用ImageIcons加载了背景,但我尝试使用BuffereImage,因为我被告知必须这样做才能在上面绘制更多图像 BuffereImage不返回任何错误,但不绘制任何内容 代码如下: import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.image

哈哈,我刚才完全失败了。删除某些内容后上载了代码

无论如何,我使用ImageIcons加载了背景,但我尝试使用BuffereImage,因为我被告知必须这样做才能在上面绘制更多图像

BuffereImage不返回任何错误,但不绘制任何内容

代码如下:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Client {
    static JFrame client = new JFrame();

    public static void drawBackground() throws IOException {
        BufferedImage background = ImageIO.read(new File("Resources/Images/Background.png"));
        client.setTitle("Keldagrim: The lost Empire");
        client.setSize(1280, 720);
        client.setDefaultCloseOperation(client.EXIT_ON_CLOSE);
        Container pane = client.getContentPane();
        BackgroundPanel backgroundPanel = new BackgroundPanel(background);
        pane.add(backgroundPanel);
        client.pack();
        client.setVisible(true);
    }

    public static void drawLogin() {
        ImagePanel loginBox = new ImagePanel(new ImageIcon("Resources/Images/LoginBox.png").getImage());
        client.add(loginBox);
        client.repaint();
        System.out.println("Painted");
    }

    public static void main(String[] args) {
        try {
            drawBackground();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        drawLogin();
    }

}

    class ImagePanel extends JPanel {

    private Image img;

    public ImagePanel(String img) {
        this(new ImageIcon(img).getImage());
    }

    public ImagePanel(Image img) {
        this.img = img;
        Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);
    }

    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }

}


class BackgroundPanel extends JPanel {
    BufferedImage backgroundImage;
    public BackgroundPanel(BufferedImage image){
        backgroundImage = image;
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(backgroundImage, null, 50,50);
    }
}
试试这个:

if (backgroundImage != null) {
         Client c =   new Client(backgroundImage);
         c.drawClient();
} else {
            System.out.println("Error: No background Image.");
}

有很多事情不适合你

  • 您没有在任何地方实际调用
    drawClient
    ,因此框架从未创建过。实际上,我会放弃这个方法,因为它没有增加任何价值,实际上是在混淆问题
  • 您使用的是对背景图像的静态引用,这意味着在整个应用程序中只能使用一个图像,而不管您创建了多少个“客户端”面板。然后将该引用传递到面板,这是一种浪费
  • 虽然您确实应该记录错误(并显示错误消息),但至少应该将堆栈跟踪转储到控制台,这将使您的生活更加轻松
  • 设置好框架后,调用
    setVisible
    ,如果不设置,就会发生有趣的事情
  • 尝试使用类似于

    public class Client extends JPanel {
    
        private Image backgroundImage;
    
        public Client(Image backgroundImage) {
            this.backgroundImage = backgroundImage;
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception ex) {
                    }
    
                    BufferedImage background = null;
                    try {
                        background = ImageIO.read(new File("Resources/Images/Background.png"));
                        JFrame client = new JFrame();
                        client.setTitle("Keldagrim: The lost Empire");
                        client.setSize(1280, 720);
                        client.setDefaultCloseOperation(client.EXIT_ON_CLOSE);
                        client.setContentPane(new Client(background));
                        client.setVisible(true);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            });
        }
    }
    
    另外,作为旁注,您并没有实际绘制背景,但我怀疑这是另一个问题;)

    试着看一看


    使用
    e.printStackTrace()开始。您从不调用
    drawClient
    ,因此它从不启动事件调度线程,当执行到达主方法的末尾时,JVM将终止(因为不再有非守护进程线程在运行)添加:使用
    this
    而不是在drawClient方法中创建新的客户端实例。
    client
    是一个面板。如果没有某种窗口,它无法在屏幕上显示…@Legend我要么将其设置为静态,要么就个人而言,将其删除,因为它不会增加任何价值