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
约束将组件添加到框架中。