1

试图将图像打印到窗口中。一切都运行没有错误,如果我用另一个图形类替换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);
  }
}
4

3 回答 3

7

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

BufferedImage image = null;

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

这实质上意味着当您使用该paint方法时,null您还没有初始化实例变量。

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

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

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

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

更新

您需要image在将要使用的上下文中进行定义。

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

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

paint方法GraphicsMovement2看不到您在 中声明的变量main,只有实例字段(即null)。

为了解决这个问题,您需要将图像的加载移动到 的实例的上下文中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");
    }
}

下面的两个示例将产生相同的结果...

在此处输入图像描述

简单的方法

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);
            }
        }
    }
}

花时间阅读教程

于 2012-11-02T02:35:37.317 回答
2

当您甚至不使用小程序时,您的类不应该扩展 JApplet——这没有任何意义。反而

  • 让您的绘图类扩展 JPanel
  • 在 JPanel 的 paintComponent 方法中绘制
  • 将此 JPanel 添加到 JFrame 的 contentPane。
  • 阅读Swing 绘画教程。您无法猜测这些东西并期望它能够工作,教程将向您展示它是如何正确完成的。
于 2012-11-02T02:24:39.037 回答
2

不要混合文件设备,

File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");

应替换为:

File file = new File("C:/Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");

于 2012-11-02T02:31:30.990 回答