編輯:第一個問題解決了,請參閱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
編輯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);
}
}
「第一個問題解決了」,你不給沒有積分?你是一個應有盡有的失敗者 – gpasch
對不起,我忘記了我可以給予重點,我專注於「已接受的迴應」,我現在不能承認,我知道我仍然有問題。 無論如何,感謝上帝,你已經注意到我對SO問題(這些神聖點中只有11個)提出問題並不陌生,並沒有稱之爲「失敗者」。 – Krowk
顯然我不能指出,我需要15個,我該怎麼辦? – Krowk