初めて Swing を使用していますが、少し問題があります。私が持っているのは、4 つの JPanel に分割された JFrame です。JFrame には、このように動作する MouseListener があります。
クリック時に、クリックが左側のバーの内側にある場合は、13 個のアイコンのどれが選択されているかを判断します。クリックが右側の「ゲーム ペイン」内にあり、アイコンが選択されている場合は、クリックした場所に配置します。
これはここで行われます
@Override
public void mouseClicked(MouseEvent event) {
// TODO Auto-generated method stub
xPos = event.getX();
yPos = event.getY()-25;
//If click is inside tool bar
if(xPos<=75){
if(yPos>-1 && yPos<48)
//First tool image
image = new ImageIcon(getClass().getResource(_image path_)).getImage();
else if(yPos>=48 && yPos<96)
//Second tool image
image = new ImageIcon(getClass().getResource(_image path_)).getImage();
else if(yPos>=96 && yPos<144)
//Third tool image
image = new ImageIcon(getClass().getResource(_image path_)).getImage();
else if(yPos>=144 && yPos<192)
//Fourth tool image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=192 && yPos<240)
//Fifth tool image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=240 && yPos<288)
//Sixth tool image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=288 && yPos<336)
//Seventh tool image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=336 && yPos<384)
//First NPC image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=384 && yPos<432)
//second NPC image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=432 && yPos<480)
//Third NPC image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=480 && yPos<528)
//First Decoration image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=528 && yPos<576)
//Second Decoration image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
else if(yPos>=576 && yPos<=625)
//Third Decoration image
image = new ImageIcon(getClass().getResource(imagepath)).getImage();
}
//If click is within Game Pane
else if (xPos>75 && yPos<625){
//A tool has been selected
if(image!=null){
placedTool = this.image;
this.image = null;
placeable = true;
}
}
//An image and location on the game pane has been selected
if(placeable && this.image==null){
ImageInfo newImg = new ImageInfo(xPos, yPos, image);
gamePane.additions.add(newImg);
gamePane.repaint();
System.out.println("IMAGE PLACED @ " + xPos + ", " + yPos);
placeable = false;
}
System.out.println("CLICK: (" + xPos + "," + yPos +")");
}
imagepath は 50x50 アイコンのパスです。この部分はエラーなく正常に動作します。ただし、gamePane は正しく再描画されません。
今のところ、gamePane には単に背景画像があります。コンポーネントが追加されると、それらは上にペイントされるはずです。ただし、ペイントされるのは背景画像だけです。Graphics.drawImage(); を使用して Z コンポーネントを指定する方法はありますか? gamePane の paintComponent 関数について私が持っているものは次のとおりです(これが主な問題であるため、太字になっています)。
@Override
protected void paintComponent(Graphics g) {
g.drawImage(backgroundImg, 0, 0, null);
for(ImageInfo add : additions){
g.drawImage(add.getImage(), add.getX(), add.getY(), null);
}
}
このように追加が定義されている場所
リストの追加 = new ArrayList();
ImageInfo クラスには、画像、x 座標、および y 座標が含まれているだけです。
public class ImageInfo {
private int x;
private int y;
private Image image;
public int getX() {
return x;
}
public int getY() {
return y;
}
public Image getImage() {
return image;
}
public ImageInfo(int x, int y, Image image) {
super();
this.x = x;
this.y = y;
this.image = image;
}
}
修繕:
mKorbelさん、ありがとうございます。mouseClicked メソッドの外側ですべての画像を定義することによって
Image tool1 = new ImageIcon(getClass().getResource(toolBar.TOOL1)).getImage();
Image tool2 = new ImageIcon(getClass().getResource(toolBar.TOOL2)).getImage();
Image tool3 = new ImageIcon(getClass().getResource(toolBar.TOOL3)).getImage();
Image tool4 = new ImageIcon(getClass().getResource(toolBar.TOOL4)).getImage();
Image tool5 = new ImageIcon(getClass().getResource(toolBar.TOOL5)).getImage();
Image tool6 = new ImageIcon(getClass().getResource(toolBar.TOOL6)).getImage();
Image tool7 = new ImageIcon(getClass().getResource(toolBar.TOOL7)).getImage();
Image npc1 = new ImageIcon(getClass().getResource(toolBar.NPC1)).getImage();
Image npc2 = new ImageIcon(getClass().getResource(toolBar.NPC2)).getImage();
Image npc3 = new ImageIcon(getClass().getResource(toolBar.NPC3)).getImage();
Image decor1 = new ImageIcon(getClass().getResource(toolBar.DECOR1)).getImage();
Image decor2 = new ImageIcon(getClass().getResource(toolBar.DECOR2)).getImage();
Image decor3 = new ImageIcon(getClass().getResource(toolBar.DECOR3)).getImage();
そして、次のような mouseClicked 関数の実行
@Override
public void mouseClicked(MouseEvent event) {
// TODO Auto-generated method stub
xPos = event.getX();
yPos = event.getY()-25;
//If click is inside tool bar
if(xPos<=75){
if(yPos>-1 && yPos<48)
//First tool image
image = tool1;
else if(yPos>=48 && yPos<96)
//Second tool image
image = tool2;
else if(yPos>=96 && yPos<144)
//Third tool image
image = tool3;
else if(yPos>=144 && yPos<192)
//Fourth tool image
image = tool4;
else if(yPos>=192 && yPos<240)
//Fifth tool image
image = tool5;
else if(yPos>=240 && yPos<288)
//Sixth tool image
image = tool6;
else if(yPos>=288 && yPos<336)
//Seventh tool image
image = tool7;
else if(yPos>=336 && yPos<384)
//First NPC image
image = npc1;
else if(yPos>=384 && yPos<432)
//second NPC image
image = npc2;
else if(yPos>=432 && yPos<480)
//Third NPC image
image = npc3;
else if(yPos>=480 && yPos<528)
//First Yard Decoration image
image = decor1;
else if(yPos>=528 && yPos<576)
//Second Yard Decoration image
image = decor2;
else if(yPos>=576 && yPos<=625)
//Third Yard Decoration image
image = decor3;
}
//If click is within Game Pane
else if (xPos>75 && yPos<625){
//A tool has been selected
if(image!=null){
placedTool = this.image;
this.image = null;
placeable = true;
}
}
if(placeable && this.image==null){
GamePiece newImg = new GamePiece(placedTool, xPos, yPos);
gamePane.additions.add(newImg);
gamePane.repaint();
System.out.println("IMAGE PLACED @ " + xPos + ", " + yPos);
placeable = false;
}
System.out.println("CLICK: (" + xPos + "," + yPos +")");
}
画像は、前に指定された paintComponent メソッドによって、背景画像の上に追加されました。少し位置がずれていますが、まだ見えます。