使图像显示在Java中

时间:2014-01-10 13:04:41

标签: java image swing bufferedimage

我一直在努力让图像显示一段时间。我已经阅读了一些不同的东西,所有这些东西似乎都有不同的显示图像的方式。有人能告诉我我做错了什么吗?我正在尝试制作一个使用2个类的程序来使图片显示在一个框架中。我想我不明白的仍然是Graphics对象是什么,Graphics2D对象是什么以及它的不同之处,以及我为了使图像显示而调用哪个类的方法。这是我的代码:

公共课笑脸{

private BufferedImage smileyFace;
private Graphics2D renderWindow;
private Dimension smileyPosition;
private File smileyFile;

public Smiley() {

    try{
    smileyFile = new File("C:\\Users\\MyName\\Desktop\\smiley.png");
    smileyFace = ImageIO.read(smileyFile);
    } 
    catch (Exception e){
        System.out.println("There was an error finding or reading the file \" smiley.png.\"");
    }

    MainScreen.graphicPane.drawImage(smileyFace,50,50, null);
}

和第二节课:

公共类MainScreen扩展了JFrame {

public static MainScreen ms;
public static Graphics2D graphicPane;

public static void main (String[] args){
    MainScreen ms = new MainScreen();
    Smiley newSmiley = new Smiley();
}

public MainScreen(){
    super("Main Screen Window");
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setVisible(true);
    this.setSize(500,800);
    this.getContentPane().setBackground(Color.black);
    graphicPane = (Graphics2D) this.getContentPane().getGraphics();
}

}

程序编译时没有任何错误,并且没有向我报告没有找到文件。

3 个答案:

答案 0 :(得分:3)

你需要一些paint方法的疼痛。为此,您将需要一个Component来绘制。你需要学习一个GUI框架,比如Swing。有一些明显的组件可以像JPanel一样绘制。使用该面板,您需要覆盖其paintComponent方法。

Graphcics对象是组件用于实际将图形绘制到组件上的对象。

Graphics2D对象只是扩展了Graphics对象的功能。

您应该查看Swing tuorial**Graphics toturial

要让你的程序运行,你会做这样的事情

public class DrawPanel extends JPanel {
    BufferedImage smileyFace;

    public DrawPanel() {
        try{
            smileyFile = new File("C:\\Users\\MyName\\Desktop\\smiley.png");
            smileyFace = ImageIO.read(smileyFile);
        } 
        catch (Exception e){
            System.out.println("There was an error finding or reading the file \" smiley.png.\"");
        }
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(smileyFace,50,50, this);
    }

    @Override 
    public Dimension getPreferredSize(){
        return new Dimension(500, 500);
    }
}

然后,您可以在另一个类中实例化该面板,将其添加到JFrame中以运行它

public class Main {
    public static void main(String[] args) {
        SwingUtiliites.invokeLater(new Runnable(){
            public void run() {
                JFrame frame  = new JFrame();
                frame.add(new DrawPanel());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

答案 1 :(得分:2)

你在你的Smiley课程的构造函数中调用它。

 MainScreen.graphicPane.drawImage(smileyFace,50,50, null);

如果您要自己绘制图像,则需要覆盖添加到主屏幕的组件中的paintComponent()

或者只是将图片添加到您添加到主屏幕的JLabel

答案 2 :(得分:2)

您以错误的方式绘制图像。

要使用drawImage(),您需要在paintComponent()的{​​{1}}方法(例如JComponent)中使用该方法,请检查下一个代码:

JPanel

或者您可以将图片添加到import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.beans.Transient; import java.io.File; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; public class Example extends JFrame { public Example() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new Smiley()); frame.pack(); frame.setVisible(true); } public static void main(String args[]) { new Example(); } class Smiley extends JPanel{ private BufferedImage smileyFace; Smiley(){ try { File smileyFile = new File("C:\\Users\\MyName\\Desktop\\smiley.png"); smileyFace = ImageIO.read(smileyFile); } catch (Exception e) { System.out .println("There was an error finding or reading the file \" smiley.png.\""); } } @Override @Transient public Dimension getPreferredSize() { return new Dimension(smileyFace.getWidth(),smileyFace.getHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(smileyFace, 0,0, this); } } } 并为您完成所有操作,更改JLabel类,如下所示:

Smile

还详细了解customPaintings