У вас есть набор кнопок, и вы хотите поставить Королеву на одну из них.
JButton place = buttons[0, 4];
place.setIcon(queenIcon);
Теперь у этой кнопки есть королева.
Это довольно маленькая Разница между JLabel и JButton. Вы можете сделать JLabels активным, или вы можете использовать JButton с actionEvent.
Вот пример с JLabels. (Я обнаружил, что версия JButton немного лучше, потому что она центрирует значки.)
public class CheckerBoard{
Icon empty;
Icon queen;
public void placeQueen(MouseEvent evt){
JLabel label = (JLabel)evt.getSource();
label.setIcon(queen);
}
private void createIcons(){
BufferedImage none = new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB);
BufferedImage queenImg = new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB);
Graphics g = queenImg.getGraphics();
g.setColor(Color.YELLOW);
g.fillOval(0, 0, 64, 64);
g.dispose();
empty = new ImageIcon(none);
queen = new ImageIcon(queenImg);
}
public void startGui(){
createIcons();
JFrame frame = new JFrame("board");
JPanel panel = new JPanel(new GridLayout(2, 2));
for(int i = 0; i<4; i++){
JLabel label = new JLabel();
label.setBackground( (i/2 + i)%2 == 0 ? Color.BLACK : Color.WHITE );
label.setIcon(empty);
label.setOpaque(true);
label.addMouseListener( new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent evt){
placeQueen(evt);
}
});
panel.add(label);
}
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args){
EventQueue.invokeLater( ()-> new CheckerBoard().startGui() );
}
}
Теперь у каждого JLabel есть цвет фона, и он непрозрачен, поэтому он рисует этот основной цвет. Затем я устанавливаю значок на пустой значок, когда нет фрагментов, или полный значок, когда есть фрагменты.
При нажатии на доску добавляется королева. Я думаю, что вы можете увидеть проблему, хотя. Мы можем добавить кучу королев на доску. Чтобы решить эту проблему, я бы сделал класс для хранения большего количества данных.
class Piece{
Icon icon;
JLabel location;
public Piece(Icon i){
icon = i;
}
public void setLocation(JLabel label){
if(location != null){
location.setIcon(CheckerBoard.empty);
}
location = label;
location.setIcon(icon);
}
}
Затем мы немного изменим placeQueen. и сделай пустое состояние c
public void placeQueen(MouseEvent evt){
JLabel label = (JLabel)evt.getSource();
queen.setLocation(label);
}
Теперь королева только на одном куске.
Что касается использования доски в качестве джабеля, а затем добавления фигур в качестве кнопок. Если вы хотите забрать кусок, это будет легко. Нажмите на кусок. Когда вы хотите разместить его, что вы будете делать? Я думаю, вам по-прежнему нужно будет нажимать на пустые места.