したがって、私はJButtonのサブクラスであるSquare Squareの複数のオブジェクトを持っています。私はスクエアのいくつかのインスタンスが含まれているクラスボードのインスタンスを持っています。私がしたいことは、ボタン(正方形)の1つを押し、その上に形(円)を描くことです。そのためには、Squareクラスにboolean変数、つまりisClickedがあります。これは基本的にpaintComponentメソッドで描画する必要があるかどうかを決定します。複数のJButtonの上に描画
問題は、ボタンが奇妙なやり方で動作することです。驚くべきことに、唯一のものがあれば、全く問題はありません。最初は、問題はスレッドに関連すると思っていましたが、メインコードをinvokeLaterメソッドに入れましたが、それはまったく役に立たなかった。
私はBufferedImageを使用して解決策を見ましたが、自分のやり方で問題を解決する可能性があるかどうかを確認したいと思います。
恐らく完璧な英語ではないかもしれません。
広場クラス:
public class Square extends JButton implements ActionListener {
private int number;
private boolean isClicked;
public Square(int x) {
number = x;
isClicked = false;
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
if (!isClicked) {
super.paintComponent(g);
} else {
System.out.println("EXECUTED for: " + number);
g2d.drawOval(this.getX(), this.getY(), 100, 100);
}
}
@Override
public void actionPerformed(ActionEvent e) {
isClicked = !isClicked;
System.out.println(isClicked + " " + number);
repaint();
}
}
ボードクラス:
public class Board extends JPanel {
private static final int BOARD_WIDTH = (int) (TicTacToe.WIDTH * 0.7);
private static final int VERTICAL_LINE_LENGTH = (int) (TicTacToe.WIDTH * 0.5);
private static final int HORIZONTAL_LINE_LENGTH = (int) (TicTacToe.HEIGHT * 0.8);
private static final int STROKE_WIDTH = 5;
private Square[] squares;
public Board() {
}
public void addButtons() {
squares = new Square[9];
for (int i = 0; i < 3; i++) {
Square square = new Square(i);
square.setPreferredSize(new Dimension(30, 30));
square.addActionListener(square);
this.add(square);
squares[i] = square;
((GridLayout)this.getLayout()).setHgap(30);
((GridLayout)this.getLayout()).setVgap(30);
}
}
public Square[] getButtons() {
return squares;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(new BasicStroke(STROKE_WIDTH));
// Horiztontal lines
g2d.drawLine(0, TicTacToe.HEIGHT/3,
BOARD_WIDTH, TicTacToe.HEIGHT/3);
g2d.drawLine(0, 2 * TicTacToe.HEIGHT/3,
BOARD_WIDTH, 2 * TicTacToe.HEIGHT/3);
// Vertical lines
g2d.drawLine(BOARD_WIDTH/3, 0, BOARD_WIDTH/3,
TicTacToe.HEIGHT);
g2d.drawLine(2 * BOARD_WIDTH/3, 0, 2 * BOARD_WIDTH/3,
TicTacToe.HEIGHT);
}
}
主な方法:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Board board = new Board();
board.setPreferredSize(new Dimension((int) (WIDTH * 0.7), HEIGHT));
board.setLayout(new GridLayout(3, 3));
board.addButtons();
GameOptions opt = new GameOptions();
opt.setPreferredSize(new Dimension((int) (WIDTH * 0.3), HEIGHT));
JFrame frame = new JFrame("Tic Tac Toe");
frame.setLayout(new FlowLayout());
frame.add(board);
frame.add(opt);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
あなたは基本的にImageIconを作成してボタンに渡す必要があると言っていますか?それはあまりにも単純な音... D – Mantas
@マンタ:私はあなたが私の意味を示すためにコードを編集しました。 –