Donc, j'ai plusieurs objets de la classe Square, qui est la sous-classe de JButton. J'ai une instance de la classe Board, qui contient quelques instances de Square. Ce que je veux faire, c'est quand j'appuie sur l'un des boutons (carrés), dessinez une forme (un cercle) sur le dessus. Pour ce faire, j'ai une variable booléenne dans la classe Square, à savoir isClicked, qui décide en gros de ce qui doit être dessiné dans la méthode paintComponent.Dessin au-dessus de plusieurs JButtons
Le problème est que les boutons commencent à se comporter bizarrement quand j'en ai quelques-uns. Étonnamment, s'il n'y en a qu'un seul, il n'y a aucun problème. Au début, j'avais pensé que le problème pouvait être lié aux threads, cependant, j'ai mis le code principal dans la méthode invokeLater et cela n'a pas aidé du tout.
J'ai vu une solution en utilisant BufferedImage, mais je voudrais voir s'il y a une possibilité de résoudre le problème à ma façon.
Désolé pour l'anglais peut-être pas parfait.
classe Square:
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();
}
}
classe Conseil:
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);
}
}
méthode principale:
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);
}
});
Donc, vous dites simplement que je devrais créer ImageIcon et le passer à un bouton? Cela semble trop simple ...: D – Mantas
@Mantas: J'ai modifié le code pour vous montrer ce que je voulais dire. –