Java-BuffereImage未出现在JFrame上
我无法在JFrame上显示图像。 框架在运行时是完全黑色的。这是我的密码:Java-BuffereImage未出现在JFrame上,java,jframe,bufferedimage,Java,Jframe,Bufferedimage,我无法在JFrame上显示图像。 框架在运行时是完全黑色的。这是我的密码: import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.util.logging.Level; import java.util.
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
public class JFrameTesting extends JFrame {
BufferedImage test = null;
public static void main(String[] args) throws URISyntaxException {
new JFrameTesting();
}
public JFrameTesting() throws URISyntaxException {
JFrame frame = new JFrame("My first JFrame!");
frame.setSize(400, 400);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
test = ImageIO.read(new File(getClass().getResource("test.png").toURI()));
} catch (IOException ex) {
Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void paint(Graphics g) {
super.paint(g);
g.drawImage(test, 200, 200, null);
}
}
我不确定我是否真的做错了什么。我在运行时没有任何错误
提前谢谢 您还没有将图像添加到JFrame中。要显示图像,需要将BuffereImage添加到组件上,然后绘制该组件。您可以使用JLabel和ImageIcon来实现这一点
public class JFrameTesting extends JFrame {
BufferedImage test = null;
ImageIcon image = new ImageIcon();
public static void main(String[] args) throws URISyntaxException {
new JFrameTesting();
}
public JFrameTesting() throws URISyntaxException {
JFrame frame = new JFrame("My first JFrame!");
try {
test = ImageIO.read(new File(getClass().getResource("test.png").toURI()));
image.setImage(test);
} catch (IOException ex) {
Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex);
}
JLabel label = new JLabel();
label.setIcon(image);
frame.add(label);
frame.setSize(400, 400);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
或者,如果需要,可以跳过标签并绘制到零部件上。在这种情况下,您必须重写JPanel的draw方法
JPanel pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 200, 200, null);
}
};
frame.add(pane);
另一个注意事项是,您正在扩展JFrame,但也在类内部创建一个新的JFrame。您可以删除额外的JFrame和所有的“frame”。该类本身是一个JFrame,因此您不需要额外的JFrame
//set the title using the setTitle method
setTitle("My first JFrame!");
add(label);
setSize(400, 400);
setVisible(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
另外,我相信ImageIO.read(…)方法可以将URI作为参数,因此您不必从它创建文件 您还没有将图像添加到JFrame中。要显示图像,需要将BuffereImage添加到组件上,然后绘制该组件。您可以使用JLabel和ImageIcon来实现这一点
public class JFrameTesting extends JFrame {
BufferedImage test = null;
ImageIcon image = new ImageIcon();
public static void main(String[] args) throws URISyntaxException {
new JFrameTesting();
}
public JFrameTesting() throws URISyntaxException {
JFrame frame = new JFrame("My first JFrame!");
try {
test = ImageIO.read(new File(getClass().getResource("test.png").toURI()));
image.setImage(test);
} catch (IOException ex) {
Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex);
}
JLabel label = new JLabel();
label.setIcon(image);
frame.add(label);
frame.setSize(400, 400);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
或者,如果需要,可以跳过标签并绘制到零部件上。在这种情况下,您必须重写JPanel的draw方法
JPanel pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 200, 200, null);
}
};
frame.add(pane);
另一个注意事项是,您正在扩展JFrame,但也在类内部创建一个新的JFrame。您可以删除额外的JFrame和所有的“frame”。该类本身是一个JFrame,因此您不需要额外的JFrame
//set the title using the setTitle method
setTitle("My first JFrame!");
add(label);
setSize(400, 400);
setVisible(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
另外,我相信ImageIO.read(…)方法可以将URI作为参数,因此您不必从它创建文件 我的代码绘制图像,但需要重新绘制。为此,您需要使用鼠标更改帧的大小
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
public class JFrameTesting extends JFrame {
BufferedImage test = null;
public static void main(String[] args) throws URISyntaxException {
new JFrameTesting();
}
public JFrameTesting() throws URISyntaxException {
JFrame frame = new JFrame("My first JFrame!");
frame.setSize(400, 400);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
System.out.println("init");
test = ImageIO.read(new File(getClass().getResource("test.png").toURI()));
System.out.println(test);
} catch (IOException ex) {
Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex);
}
final JPanel pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
System.out.println("paint");
super.paintComponent(g);
g.drawImage(test, 0, 0, null);
}
};
frame.add(pane);
frame.repaint();
}
@Override
public void paint(Graphics g) {
super.paint(g);
System.out.println("paint");
g.drawImage(test, 200, 200, null);
}
}
我的代码绘制图像,但需要重新绘制。为此,您需要使用鼠标更改帧的大小
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
public class JFrameTesting extends JFrame {
BufferedImage test = null;
public static void main(String[] args) throws URISyntaxException {
new JFrameTesting();
}
public JFrameTesting() throws URISyntaxException {
JFrame frame = new JFrame("My first JFrame!");
frame.setSize(400, 400);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
System.out.println("init");
test = ImageIO.read(new File(getClass().getResource("test.png").toURI()));
System.out.println(test);
} catch (IOException ex) {
Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex);
}
final JPanel pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
System.out.println("paint");
super.paintComponent(g);
g.drawImage(test, 0, 0, null);
}
};
frame.add(pane);
frame.repaint();
}
@Override
public void paint(Graphics g) {
super.paint(g);
System.out.println("paint");
g.drawImage(test, 200, 200, null);
}
}
您可以尝试使用此代码。
添加图像时,需要在Jframe上加载JLabel
BufferedImage test = null;
public static void main(String[] args) throws URISyntaxException {
new JFrameTesting();
}
public JFrameTesting() throws URISyntaxException {
JFrame frame = new JFrame("My first JFrame!");
JLabel label = new JLabel();
frame.setSize(800, 800);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
test = ImageIO.read(new File(getClass().getResource("test.png").toURI()));
frame.add( new JLabel(new ImageIcon(test)),BorderLayout.CENTER);
frame.setIconImage(test);
frame.setVisible(true);
label.setVisible(true);
} catch (IOException ex) {
Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void paint(Graphics g) {
super.paint(g);
g.drawImage(test, 200, 200, null);
}
}您可以尝试使用此代码。
添加图像时,需要在Jframe上加载JLabel
BufferedImage test = null;
public static void main(String[] args) throws URISyntaxException {
new JFrameTesting();
}
public JFrameTesting() throws URISyntaxException {
JFrame frame = new JFrame("My first JFrame!");
JLabel label = new JLabel();
frame.setSize(800, 800);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
test = ImageIO.read(new File(getClass().getResource("test.png").toURI()));
frame.add( new JLabel(new ImageIcon(test)),BorderLayout.CENTER);
frame.setIconImage(test);
frame.setVisible(true);
label.setVisible(true);
} catch (IOException ex) {
Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void paint(Graphics g) {
super.paint(g);
g.drawImage(test, 200, 200, null);
}
}如何运行代码?您可以在JLabel上调用setIcon(),然后将标签放在框架上尝试通过覆盖
paintComponent
方法而不是直接在框架上在JFrame
内部绘制JPanel
。这个问题可以帮助您理解为什么要避免在JFrame
上绘制可能重复的代码?您可以在JLabel上调用setIcon(),然后将标签放在框架上尝试通过覆盖paintComponent
方法而不是直接在框架上在JFrame
内部绘制JPanel
。这个问题可以帮助您理解为什么要避免在JFrame
上绘制可能重复的“您实际上还没有将图像添加到JFrame”:哦,是吗??整个drawImage在那里做什么???这是您在此处添加的内容。需要将图像添加到JFrame上的组件,而不是直接添加到JFrame上。在我的回答中,我指定重写JPanel的paintComponent方法可以作为替代方法。“您还没有将图像添加到JFrame。”:哦,是吗??整个drawImage在那里做什么???这是您在此处添加的内容。需要将图像添加到JFrame上的组件,而不是直接添加到JFrame上。在我的回答中,我指定重写JPanel的paintComponent方法作为替代方法。添加图像时,您需要在Jframe上加载JLabel。效果非常好!非常感谢。添加图像时,需要在Jframe上加载JLabel。工作非常出色!非常感谢你。