java - 在java中加载图像时遇到问题,有人能看看出了什么问题吗?

标签 java swing jframe loading drawimage

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class MainWindow extends JFrame{

    public static void main(String[] args) {

        JFrame mainWindow = new JFrame("Siege Arena");
        mainWindow.setResizable(false);
        mainWindow.setVisible(true);
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWindow.setSize(500, 500);
        loadpics();

    }   

    Image bg;

    public void loadpics(){
        bg = new ImageIcon("C:\\test\\Background.png").getImage();
        repaint();

    }
    public void paint(Graphics g){
        g.drawImage(bg,0,0,null);

    }



}

我想做的就是创建一个 JFrame 并在其上加载一个简单的图像,我到底该怎么做。我在这里尝试过,但失败了。有人可以帮助我吗?

最佳答案

Can someone see what is wrong?

  • JFrame 扩展,您不会添加任何新功能,并且会将自己锁定在该组件的单一使用中
  • 覆盖顶级容器的paint,例如JFrame,打破绘制链非常容易(就像您所做的那样),这会带来无穷无尽的问题
  • 不调用 super.paint 并破坏绘制链
  • 未将 ImageObserver 传递给 ImageIcon
  • 当您尝试加载图像时引用了错误的 MainWindow 实例。

如果我“猜测”正确,您正在尝试将背景图像绘制到窗口中。如果是这样,那么您尝试的方法绝对不是解决问题的方法。

相反...

  • 从扩展自 JPanel 的自定义组件开始
  • 使用paintComponent方法绘制图像
  • 考虑使用 ImageIO 而不是 ImageIcon。如果图像无法加载,ImageIO将会抛出异常。

例如...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

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

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new BackgroundPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class BackgroundPane extends JPanel {

        private BufferedImage bg;

        public BackgroundPane() {
            try {
                bg = ImageIO.read(new File("C:\\test\\Background.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

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

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

    }

}

看一下:

了解更多详情...

关于java - 在java中加载图像时遇到问题,有人能看看出了什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068870/

相关文章:

Linux 上的全屏 Java - 如何覆盖任务栏?

java - 将特定于语言环境的字符串转换为 BigDecimal 的最佳方法

java - 在 Swing 中的两个组件之间拖动

java - 更改 JFrame 中的 JPanel 大小

java - JFrame背景图像设置背景图像时,其他按钮不会出现在框架上?

java - Gradle build 不会处理印地语 unicode 字符

java - 让返回键在自定义工具栏中工作

java - 如何添加到以前的 JLabel

java - 新创建的图形对象仅在调整框架大小后显示

Java使JFrame "stay put"