Java ImageIO.read正在无误地终止程序
哈哈,我刚才完全失败了。删除某些内容后上载了代码 无论如何,我使用ImageIcons加载了背景,但我尝试使用BuffereImage,因为我被告知必须这样做才能在上面绘制更多图像 BuffereImage不返回任何错误,但不绘制任何内容 代码如下: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
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我要么将其设置为静态,要么就个人而言,将其删除,因为它不会增加任何价值