簡體   English   中英

使用AWT在Java中繪制圖像

[英]Drawing imageS in java using AWT

編輯:第一個問題已解決,請參見Roberto Attias的回答,並可能閱讀評論。 仍然有第二個問題。

我必須用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。

我的程序結果

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

只是一個簡單的想法,但是您知道每個圖像在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問題,如果我能看到正在發生的事情,我發現它們更容易解決。

這是您的代碼,稍作修改即可運行。 將來,請發布完全可運行的示例。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM