gpt4 book ai didi

java - JFrame 中的 BufferedImage 不显示

转载 作者:行者123 更新时间:2023-11-29 09:49:15 26 4
gpt4 key购买 nike

尝试将图像打印到窗口中。一切运行无误,如果我将 drawImage 替换为另一个图形类,它也能正常工作。但是,窗口缺少图像,我不确定为什么。同样,JFrame 和 Graphics 可以很好地绘制其他图形,但只是不在此处绘制图像。谢谢。

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.imageio.*;
import javax.imageio.stream.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;

public class GraphicsMovement2 extends JApplet{
BufferedImage image = null;

public static void main(String args[]){
BufferedImage image = null;
try {
File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");
ImageInputStream imgInpt = new FileImageInputStream(file);
image = ImageIO.read(file);
}
catch(FileNotFoundException e) {
System.out.println("x");
}
catch(IOException e) {
System.out.println("y");
}


JApplet example = new GraphicsMovement2();
JFrame frame = new JFrame("Movement");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(example);
frame.setSize(new Dimension(1366,768)); //Sets the dimensions of panel to appear when run
frame.setVisible(true);
}
public void paint (Graphics page){
page.drawImage(image, 100, 100, 100, 100, Color.RED, this);
}
}

最佳答案

您已经定义了两次 image...

BufferedImage image = null;

public static void main(String args[]){
BufferedImage image = null;

这实际上意味着当您到达 paint 方法时,它是 null,因为您还没有初始化实例变量。

您将遇到的另一个问题是,您正尝试从静态引用加载图像,但 image 未声明为 static。最好将此逻辑移动到构造函数或实例方法中。

添加到 JFrame 时,不要使用 JApplet 作为容器,最好使用类似 JPanel 的容器.在向容器中添加内容时,它会有所帮助。

你必须调用 super.paint(g)...事实上,不要覆盖paint 顶级容器的方法,如 JFrameJApplet。使用类似 JPanel 的东西并改写 paintComponent 方法。顶级容器不是双缓冲的。

paint 方法做了很多重要的工作,使用起来更容易 JComponent#paintComponent ...但不要忘记调用 super。 paintComponent

已更新

您需要在要使用的上下文中定义image

因为您将 image 声明为 GraphicsMovement2 的实例字段,所以您需要 GraphicsMovement2 的实例才能引用它。

但是,在 main 方法中,它是 static,您还声明了一个名为 image 的变量。

GraphicsMovement2paint方法看不到你在main中声明的变量,只能看到实例字段(也就是).

为了解决这个问题,您需要将图像的加载移动到 GraphicsMovement2 实例的上下文中,这可以最好地实现(在您的上下文中),但是移动图像加载到 GraphicsMovement2

的构造函数中
public GraphicsMovement2() {
try {
File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");
ImageInputStream imgInpt = new FileImageInputStream(file);
image = ImageIO.read(file);
}
catch(FileNotFoundException e) {
System.out.println("x");
}
catch(IOException e) {
System.out.println("y");
}
}

下面的两个例子会产生相同的结果...

enter image description here

简单的方法

public class TestPaintImage {

public static void main(String[] args) {
new TestPaintImage();
}

public TestPaintImage() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new ImagePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class ImagePane extends JPanel {

public ImagePane() {
setLayout(new BorderLayout());
ImageIcon icon = null;
try {
icon = new ImageIcon(ImageIO.read(new File("/path/to/your/image")));
} catch (Exception e) {
e.printStackTrace();
}
add(new JLabel(icon));
}

}
}

艰难的道路

public class TestPaintImage {

public static void main(String[] args) {
new TestPaintImage();
}

public TestPaintImage() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new ImagePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class ImagePane extends JPanel {

private BufferedImage background;

public ImagePane() {
try {
background = ImageIO.read(new File("/path/to/your/image"));
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public Dimension getPreferredSize() {
return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (background != null) {
int x = (getWidth() - background.getWidth()) / 2;
int y = (getHeight() - background.getHeight()) / 2;
g.drawImage(background, x, y, this);
}
}
}
}

花时间通读教程

关于java - JFrame 中的 BufferedImage 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13188417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com