Matriz de imágenes JLabel

Estoy tratando de cargar la misma imagen almacenada de jlabel dos veces en un panel de salida de cuadrícula, sin embargo, en lugar de crear dos instancias de la imagen, la imagen solo se muestra una vez y luego se mueve.

¿Cómo puedo almacenar la misma posición JLabel en la matriz de piezas en más de una JLabel en la matriz boardLabels?

Gracias :)

public static JPanel boardPanel = new JPanel(new GridLayout(4, 0));
public static JLabel pieces[] = new JLabel[2];
private static JLabel[] boardLabels = new JLabel[4];

public MainFrame() {
    pieces[0] = new JLabel(new ImageIcon(System.getProperty("user.dir") + "/images/piece1.png"));
    pieces[1] = new JLabel(new ImageIcon(System.getProperty("user.dir") + "/images/piece2.png"));

    this.add(boardPanel);
    displayGUIboard();
}


public static void displayGUIboard() {

    //ERROR - the label in pieces[0] is not copied into both boardLabels [0] and [1]
    boardLabels[0] = pieces[0];
    boardLabels[1] = pieces[0];

    boardPanel.add(boardLabels[0]);
    boardPanel.add(boardLabels[1]);
}

public static void main(String[] args) {
    MainFrame frame = new MainFrame();
    frame.setVisible(true);
    frame.setSize(600, 600);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

Esto funciona

    boardLabels[0] = new JLabel(pieces[1]);
    boardLabels[1] = new JLabel(pieces[1]);

al usar ImageIcons, pero quiero evitar esto ya que para actualizar el tablero tendré que quitar y luego volver a cargar los JLabels. Preferiría simplemente actualizar las etiquetas ya cargadas.

editar Intenté esto antes pero arroja una excepción de puntero nulo ...

    boardLabels[0].setIcon(pieces[1]);
    boardLabels[1].setIcon(pieces[1]);

    boardPanel.add(boardLabels[0]);
    boardPanel.add(boardLabels[1]);

Respuestas a la pregunta(2)

Su respuesta a la pregunta