ボードゲームで奇妙なエラーが発生しています。ボードは、JPanelのサブクラスであるGameTilesを備えた2D配列で構成されています。サイズ(600,500)を使用すると、すべて問題なく動作しますが、サイズを変更すると、左上隅に奇妙なエラーが表示されます。
エラーの画像(左上隅を参照)
さらに奇妙なのは、新しいプロジェクトを作成したときに、試してみるだけで完璧に機能したことです。絵のコードはまったく同じで、エラーは発生していません。この問題を引き起こしているのは他の何かでしょうか?
問題が修正されました
Anser:JPanelのgetXメソッドとgetYメソッドを誤ってオーバーライドしました。名前を変更したところ、完全に機能するようになりました。
Reversi.java
package org.reversi;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.reversi.gui.GameFrame;
public class Reversi {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
GameFrame frame = new GameFrame("Reversi");
frame.setSize(600,500);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
GameBoard.java
package org.reversi.gui;
import java.awt.Graphics;
import java.awt.GridLayout;
import javax.swing.JPanel;
public class GameBoard extends JPanel{
private GameTile[][] gameBoard = new GameTile[8][8];
public GameBoard() {
initiateLayout();
}
private void initiateLayout() {
setLayout(new GridLayout(8, 8));
for(int row = 0 ; row < 8 ; row++) {
for(int col = 0 ; col < 8 ; col++) {
gameBoard[row][col] = new GameTile(col,row);
add(gameBoard[row][col]);
}
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for(int row = 0 ; row < 8 ; row++)
for(int col = 0 ; col < 8 ; col++)
gameBoard[row][col].repaint();
}
}
GameFrame.java
package org.reversi.gui;
import javax.swing.JFrame;
public class GameFrame extends JFrame {
private GameBoard gameBoard;
/**
* Creates a new frame.
* @param gameTitle the title of the frame
*/
public GameFrame(String gameTitle) {
setTitle(gameTitle);
gameBoard = new GameBoard();
add(gameBoard);
}
}
GameTile.java
package org.reversi.gui;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class GameTile extends JPanel {
private BufferedImage image;
private int x;
private int y;
public GameTile(int x, int y) {
this.x = x;
this.y = y;
try {
this.image = ImageIO.read(new File("tile.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
画像へのリンク(tile.pngという名前にする必要があります):http://i.imgur.com/ejmCtui.png