저는 타워 방어 게임을 작성 중이며 JFrame에로드 된 버퍼 이미지가있는 JPanels 목록을 배치해야합니다. 그러나 for 루프를 사용하여 JPanels를 JFrame에 배치합니다. 그러나 프로그램을 실행하면 목록의 마지막 JPanel 만 표시됩니다. 이미지가 다른 이미지 위에 놓여 있지 않은지 확인하기 위해 3 개의 별도 위치에 배치되었습니다. 내가 지금이 문제를 해결할 수있는 방법을이미지 목록을로드 할 때 하나의 이미지 만 표시됩니다.
import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
public class BasicEnemy extends Entity {
JPanel ePanel;
Graphics g;
public BasicEnemy(double x, double y, BufferedImage image) {
super(x, y, image);
ePanel = new JPanel();
ePanel.setVisible(true);
}
protected void paintComponent(Graphics g) {
g.drawImage(getImage(), (int)(getXCoord()),
(int)(getYCoord()), null);
}
}
다음 JPanel의 내 코드가 JFrame의에 배치되고 여기에
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class GameScreen extends JPanel
implements MouseListener {
private ArrayList<JPanel> images;
private TDGame currentGame;
private JFrame frame;
private static final int width = 700;
private static final int length = 700;
public void mouseExited(MouseEvent e) {
this.repaint();
}
public void mouseEntered(MouseEvent e) {
this.repaint();
}
public void mouseReleased(MouseEvent e) {
this.repaint();
}
public void mousePressed(MouseEvent e) {
this.repaint();
}
public void mouseClicked(MouseEvent e) {
this.repaint();
}
public GameScreen() {
super();
images = new ArrayList<JPanel>();
currentGame = new TDGame();
frame = new JFrame("Tower Defense");
frame.setSize(width, length);
frame.setVisible(true);
frame.pack();
frame.getContentPane().add(this,BorderLayout.CENTER);
currentGame.EnemyForce.add(currentGame.EnemyForce.size(),
new BasicEnemy(0, 0, LoadImage()));
currentGame.EnemyForce.add(currentGame.EnemyForce.size(),
new BasicEnemy(250, 250, LoadImage2()));
currentGame.EnemyForce.add(currentGame.EnemyForce.size(),
new BasicEnemy(0, 0, LoadImage1()));
this.repaint();
}
public BufferedImage LoadImage() {
BufferedImage img = null;
try {
img = ImageIO.read(new File("Saturn-Intruder.png"));
} catch (IOException e) {
}
return img;
}
public BufferedImage LoadImage1() {
BufferedImage img = null;
try {
img = ImageIO.read(new File("Level1-TD.jpeg"));
} catch (IOException e) {
}
return img;
}
public BufferedImage LoadImage2() {
BufferedImage img = null;
try {
img = ImageIO.read(new File("BlackBird-Intruder.jpeg"));
} catch (IOException e) {
}
return img;
}
@Override
protected void paintComponent(Graphics g) {
for(int i = 0; i < currentGame.Defense.size(); i++) {
frame.add(currentGame.Defense.get(i));
}
for(int i = 0; i < currentGame.EnemyForce.size(); i++) {
frame.add(currentGame.EnemyForce.get(i));
}
for(int i = 0; i < currentGame.ShotsFired.size(); i++) {
frame.add(currentGame.ShotsFired.get(i));
}
}
}
: 여기
는 JFrame의를 만들어 내 클래스의 코드입니다 모든 이미지가 배치 될뿐 아니라 하나입니까?
1) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 2) 빈칸 한 줄의 공백은 소스 코드에서 항상 * 충분합니다. '{'또는'}'앞의 공백 행은 일반적으로 중복됩니다. 3) 클래스에 대한 일반적인 [Java 명명 규칙 (Java 命名 規則)] (http://java.sun.com/docs/books/books/books/jls/second_edition/html/names.doc.html#73307) (특히 이름에 사용 된 사례)을 배우십시오. , 메소드 및 속성 이름을 일관되게 사용하십시오. 4) 코드 블록에 일관되고 논리적 인 들여 쓰기를 사용하십시오. 코드의 들여 쓰기는 사람들이 프로그램 흐름을 이해하도록 돕기위한 것입니다. –
1) 최상위 컨테이너의 크기를 설정하지 마십시오. 대신 내용을 배치하고'pack()'을 호출하십시오. 2) 배포 시점까지, 해당 자원은 [태그 : 내장 자원]이 될 가능성이 큽니다. 그렇다면 리소스는'File' 대신'URL'에 의해 접근되어야합니다. 'URL'을 구성하는 방법은 태그에 대한 [info page] (http://stackoverflow.com/tags/embedded-resource/info)를 참조하십시오. 3) ** paintComponent (..) 메소드 내에서 컴포넌트를 추가하지 마십시오. ** 그 자체로는'repaint()'와 무한 루프를 트리거합니다. 4) 이미지를 페인팅 할 때'null '대신에'ImageObserver'를 사용하십시오. –
사실, 그 소스를 더 많이 볼수록, 새로운 학습 소스와 함께 그것을 던지고 신선한 것으로 시작해야한다고 생각합니다. 그것은 구제가 불가능합니다. –