所以,我有类Square的多个对象,它是JButton的子类。我有一个班级委员会的实例,其中包含Square的几个实例。我想要做的是当我按下其中一个按钮(正方形)时,在其上绘制一个形状(一个圆形)。为此,我在Square类中有一个布尔变量,即isClicked,它基本上决定了paintComponent方法中必须绘制的内容。在多个JButton上绘图
问题是,当我有几个按钮时,按钮开始表现得很怪异。令人惊讶的是,如果只有其中一个,那完全没有问题。起初,我认为这个问题可能与线程有关,但是,我把主代码放到了invokeLater方法中,并且根本没有任何帮助。
我看到了一个使用BufferedImage的解决方案,但我想看看是否有任何可能性来解决这个问题。
对不起,可能不完美的英语。
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();
}
}
板类:
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
@Mantas:我编辑了代码来向你展示我的意思。 –