Exception 如何使用paintComponent在框架上显示图像
这是我的代码:Exception 如何使用paintComponent在框架上显示图像,exception,graphics,jframe,jpanel,paintcomponent,Exception,Graphics,Jframe,Jpanel,Paintcomponent,这是我的代码: package com.dani.Game; import java.awt.*; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax.swing.*; import java.io.*; import java.util.*; public class Game extends JFrame { BufferedImage normal; public stati
package com.dani.Game;
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class Game extends JFrame {
BufferedImage normal;
public static void main(String[] args) {
Game game = new Game();
}
public Game() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
normal = ImageIO.read(new File("C:\\ImageOne.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
ImagePanel graphics = new ImagePanel();
this.add(graphics);
this.setVisible(true);
}
public class ImagePanel extends JPanel {
public void paintComponent(Graphics g) {
super.paint(g);
g.drawImage(normal,normal.getWidth(), normal.getHeight(), this);
}
}
更新:
当我尝试此操作时,会出现以下异常:
Exception in thread
"AWT-EventQueue-0" java.lang.StackOverflowError
at sun.awt.AppContext.get(Unknown Source)
at javax.swing.RepaintManager.currentManager(Unknown Source)
at javax.swing.RepaintManager.currentManager(Unknown Source)
at javax.swing.RepaintManager.currentManager(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at com.course.swing.headPrac$Drawing.paintComponent(headPrac.java:99)
at javax.swing.JComponent.paint(Unknown Source)
我做错了什么?无论如何,由于paint和paintComponent之间的调用循环,这将导致堆栈溢出。 将
super.paint(g)
替换为super.paintComponent(g)
作为起动部件
不管怎么说,这对我来说是可行的
package com.dani.Game;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game extends JFrame {
BufferedImage normal;
public static void main(String[] args) {
Game game = new Game();
}
public Game() {
this.setLayout(new BorderLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
normal = ImageIO.read(new File("d:\\providers.gif"));
} catch (IOException e) {
e.printStackTrace();
}
ImagePanel graphics = new ImagePanel();
this.add(graphics, BorderLayout.CENTER);
this.setVisible(true);
}
public class ImagePanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(normal, 0, 0, normal.getWidth(), normal.getHeight(), this);
}
}
}
包com.dani.Game;
导入java.awt.BorderLayout;
导入java.awt.Graphics;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类游戏扩展JFrame{
缓冲区图像正常;
公共静态void main(字符串[]args){
游戏=新游戏();
}
公共游戏(){
此.setLayout(新的BorderLayout());
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
试一试{
normal=ImageIO.read(新文件(“d:\\providers.gif”);
}捕获(IOE异常){
e、 printStackTrace();
}
ImagePanel graphics=新建ImagePanel();
添加(图形、边框布局、中心);
此.setVisible(true);
}
公共类ImagePanel扩展了JPanel{
公共组件(图形g){
超级组件(g);
g、 drawImage(normal,0,0,normal.getWidth(),normal.getHeight(),this);
}
}
}
我对您的代码做了一些更改,以使其正常工作
- 我在main方法中调用了SwingUtilities invokeLater方法,以确保SwingGUI在事件调度线程(EDT)上启动。Swing GUI的组件必须在EDT上定义和使用
- 我使用JFrame而不是扩展JFrame。仅当您要修改Swing组件的某个方法时,才可以扩展该组件。否则,将使用Swing组件
- 我在图像文件名中使用了正斜杠。对于Windows,Java将正向斜杠转换为反向斜杠
- 我添加了对JFrame包方法的调用,这样JFrame将根据图像大小调整自身大小
- 我在ImagePanel构造函数中添加了对setPreferredSize方法的调用,以便JPanel将是图像的大小
- 我将paintComponent方法中的super调用更正为super.paintComponent(g)
- 我更正了drawImage方法,使用图像的原点,而不是大小
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Game implements Runnable {
BufferedImage normal;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Game());
}
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
normal = ImageIO.read(new File("C:/ImageOne.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
ImagePanel graphics = new ImagePanel();
frame.add(graphics);
frame.pack();
frame.setVisible(true);
}
public class ImagePanel extends JPanel {
public ImagePanel() {
setPreferredSize(new Dimension(normal.getWidth(),
normal.getHeight()));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(normal, 0, 0, this);
}
}
}
你和什么样的例外?你甚至没有提供异常类。Antoniossss,当我替换它并运行它时,它不会给出异常,但当它打开框架时,它的空值表示我对异常的判断是正确的。现在尝试将框架的layoutmanager更改为
BorderLayout
,并使用BorderLayout.CENTER
约束将组件添加到框架中。