使用AWT在java中绘制imageS

时间:2016-12-22 15:42:25

标签: java image graphics awt

编辑:第一个问题已解决,请参阅Roberto Attias 's answer并阅读评论。还有第二个问题。

我必须用Java做一个小型2D游戏,我想尽可能坚持AWT(除非绝对必要,否则不要使用SWING或Java2D。)

我有一个窗口,我可以在上面画一个图像,但有两个问题。 首先,我无法绘制多个图像。事实上,在调试时我的一些测试我可以看到我的程序将只绘制我的两个图像以删除它们并重新绘制第一个图像。 第二,重新绘制的第一幅图像不在它应该的坐标处(它略微在左侧和下方)

现在我有类似的东西:

public class AwtManager {
    private Frame frame;
    private Panel panel;
    public AwtManager(){
        frame = new Frame("a");
        frame.setSize(800,600);
        frame.setLocation(100, 100);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEnvent){
                System.exit(0);
            }
        });

    panel = new Panel();
    // here I tried to setBounds to solve my second issue, it didn't work
    //panel.setBounds(0, 0, 800, 600);
    frame.add(panel);
    frame.setVisible(true);
    }

这部分打开我的窗户并且工作得非常好但是我的第二个问题似乎是由我的框架/面板的边框引起的,所以这里可能会有一些变化。

    public void showMytwoImagesFFS(ArrayList<ImageComponent> images){
        for (int i = 0; i < images.size(); i++) {
            panel.add(images.get(i);
            //And this is where I'm lost

        }
        // or here maybe
        frame.setVisible(true);
    }
}

在第二部分中,我尝试了我能想到的Component.paint(g),Component.update(g),Component.repaint(),Component.setVisible(true)的每个组合。

我的对象ImageComponent就是这样:

public class ImageComponent extends Component {
    private static final long serialVersionUID = 1L;
    private BufferedImage img;
    private int x;
    private int y;

    public ImageComponent(String path,int x, int y){
        try{
            img = ImageIO.read(new File(path));
            this.x = x;
            this.y = y;
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }

这个函数getPreferredSize()让我感到不安,它应该返回ImageComponent的首选大小,但显然我必须放置我的框架/面板的大小,否则它不会起作用。

    public Dimension getPreferredSize(){
        return new Dimension(800,600);
    }

最后我的油漆,更新,重新粉刷:

    public void paint(Graphics g){
        g.drawImage(img, x, y,null);    
    }

    public void update(Graphics g){
        super.update(g);
    }

    public void repaint(){
        this.getGraphics().drawImage(img, x, y, null);
    }
}

我非常怀疑这三个看起来应该是什么,但我发现这个主题的文件很难理解。

如此请求,你能帮我解决这些问题吗?顺便说一句,如果你知道Component.setVisible(boolean)是如何工作的,我想知道因为在调试mod中,这个函数让我松了一些头发。

编辑:

这是我窗口的截图,知道我要求两个红色正方形(有图像不是矩形),一个是0,0,另一个是200,200。

Result of my program

编辑2: 这是一个完全可运行的代码(我认为):

import java.awt.*;
import java.util.*;
import java.awt.event.*;

public class AwtManager {
    private Frame frame;
    private Panel panel;

    public static void main(String args[]) {
        new AwtManager();
        ArrayList<ImageComponent> images = new ArrayList<>();
        images.add(new ImageComponent("myimage.jpg", 0, 0));
        images.add(new ImageComponent("myimage.jpg", 200, 200));
        showMytwoImagesFFS(images); 
    }  


    public AwtManager(){
        frame = new Frame("a");
        frame.setSize(800,600);
        frame.setLocation(100, 100);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEnvent){
                System.exit(0);
            }
        });

        panel = new Panel();
        frame.add(panel);
        frame.setVisible(true);
    }

    public void showMytwoImagesFFS(ArrayList<ImageComponent> images){
        for (int i = 0; i < images.size(); i++) {
            panel.add(images.get(i));
        }
        frame.setVisible(true);
    }
}

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
public class ImageComponent extends Component {
    private static final long serialVersionUID = 1L;
    private BufferedImage img;
    private int x;
    private int y;

    public ImageComponent(String path,int x, int y){
        try{
            img = ImageIO.read(new File(path));
            this.x = x;
            this.y = y;
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }

    public Dimension getPreferredSize(){
        return new Dimension(800,600);
    }

    public void paint(Graphics g){
        g.drawImage(img, x, y,null);    
    }

    public void update(Graphics g){
        super.update(g);
    }

    public void repaint(){
        this.getGraphics().drawImage(img, x, y, null);
    }
}

2 个答案:

答案 0 :(得分:0)

只是想一想,但是你知道那个ArrayList中每个图像的可见性吗?即。

public void showMytwoImagesFFS(ArrayList<ImageComponent> images){
    for (int i = 0; i < images.size(); i++) {
        images.get(i).setVisible(true);//is the visibility actually true?
        panel.add(images.get(i);

    }
    // or here maybe
    frame.setVisible(true);
}

另外,你有关于你的程序目前的样子的截图吗?对于gui问题,我发现如果我能看到正在发生的事情,他们会更容易解决。

答案 1 :(得分:0)

这是您的代码,稍加修改即可运行。将来,请发布完全可运行的示例。

import java.awt.*;
import java.util.*;
import java.awt.event.*;

public class AwtManager {
    private Frame frame;
    private Panel panel;

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


    public AwtManager(){
        frame = new Frame("a");
        frame.setSize(800,600);
        frame.setLocation(100, 100);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEnvent){
                System.exit(0);
            }
        });

    panel = new Panel();
    // here I tried to setBounds to solve my second issue, it didn't work
    //panel.setBounds(0, 0, 800, 600);
    frame.add(panel);
    ArrayList<ImageComponent> images = new ArrayList<>();
    images.add(new ImageComponent("myimage.jpg", 0, 0));
    showMytwoImagesFFS(images);
    frame.setVisible(true);
  }

   public void showMytwoImagesFFS(ArrayList<ImageComponent> images){
        for (int i = 0; i < images.size(); i++) {
            panel.add(images.get(i));
        }
    }
}

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;

public class ImageComponent extends Component {
    private static final long serialVersionUID = 1L;
    private BufferedImage img;
    private int x;
    private int y;

    public ImageComponent(String path,int x, int y){
        try{
            img = ImageIO.read(new File(path));
            this.x = x;
            this.y = y;
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }

   public Dimension getPreferredSize(){
        return new Dimension(800,600);
    }
   public void paint(Graphics g){
        g.drawImage(img, x, y,null);
    }

    public void update(Graphics g){
        super.update(g);
    }

    public void repaint(){
        this.getGraphics().drawImage(img, x, y, null);
    }
}