EDIT: Первый вопрос решен, см. Roberto Attias 's answer и, возможно, прочитайте комментарий. Еще есть второй вопрос.Рисование imageS в java с использованием AWT
Мне нужно сделать небольшую 2D-игру на Java, и я хочу как можно больше придерживаться 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 (г), Component.update (г), 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), я бы хотел знать, потому что в debug mod эта функция заставила меня потерять некоторые волосы.
EDIT:
Вот скриншот моего окна, зная, что я попросил два красных квадрата (есть изображения не прямоугольник), один 0,0, другая на 200, 200.
EDIT 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