2016-12-22 135 views
0

編輯:第一個問題解決了,請參閱Roberto Attias 's answer,也許可以閱讀註釋。還有第二個問題。使用AWT在java中繪製圖像

我不得不在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(真),我能想到的。

我的目標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); 
    } 
} 
+0

「第一個問題解決了」,你不給沒有積分?你是一個應有盡有的失敗者 – gpasch

+0

對不起,我忘記了我可以給予重點,我專注於「已接受的迴應」,我現在不能承認,我知道我仍然有問題。 無論如何,感謝上帝,你已經注意到我對SO問題(這些神聖點中只有11個)提出問題並不陌生,並沒有稱之爲「失敗者」。 – Krowk

+0

顯然我不能指出,我需要15個,我該怎麼辦? – Krowk

回答

0

只是快速的想法,但你知道的VISI每個圖像在該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的問題,我發現如果我能看到發生了什麼,它們更容易解決。

+0

我只是看着它,如果我問:images.get(i).isVisible(); 我對這兩個圖像都有效 我會在幾秒鐘內添加屏幕截圖。 – Krowk

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

對不起,我不認爲這會是一個問題,我會爲這個問題添加一個完全可運行的代碼。 在您的版本中,在構造函數中調用showMyTwoImagesFFS(ArrayList )之前,第一個frame.setVisible()可能適用於這種情況,但不是如果我想在幾秒後彈出一個圖像,那? – Krowk

+0

我不確定你什麼時候打算添加這些。在大多數情況下,UI在初始化時被排除。如果您需要在可視化後修改UI外觀(添加/刪除組件,更改佈局管理器等),您可能需要調用'revalidate()' –

+0

哦,我不知道,我會做一些測試記住 – Krowk