No hacer esto ya no se puede agregar el mismo componente más de una vez a una contenedor visualizado. Es mejor usar varios JLabels pero hacer que usen el mismo ImageIcon. ImageIcons se pueden utilizar más de una vez con facilidad:
public MainFrame() {
pieceIcon[0] = new ImageIcon(System.getProperty("user.dir") +
"/images/piece1.png");
pieceIcon[1] = new ImageIcon(System.getProperty("user.dir") +
"/images/piece2.png");
this.add(boardPanel);
displayGUIboard();
}
public void displayGUIboard() {
boardPanel.add(new JLabel(pieceIcon[0]);
boardPanel.add(new JLabel(pieceIcon[0]);
}
Como acotación al margen: en cuenta que ninguno de las variables debe ser estática.
Editar: con respecto a su reciente edición:
Esto funciona
boardLabels[0] = new JLabel(pieces[1]);
boardLabels[1] = new JLabel(pieces[1]);
cuando se utiliza ImageIcons, pero quiero evitar esto, ya que para actualizar el tablero tendré para eliminar y luego volver a cargar los JLabels. Yo preferiría simplemente actualizar las etiquetas ya cargadas."
Solución
No, no tiene que cambiar JLabels en absoluto. Mantenga sus JLabels donde están, sino simplemente cambiar los iconos que sean titulares utilizando el método de JLabel setIcon(...)
.
Editar
Además, no hay que confundir con las variables de objetos. Incluso si se crea un montón de variables JLabel, si todos ellos se refieren al mismo objeto JLabel, todavía no se puede agregar un objeto JLabel más de una vez a un contenedor.
Editar usted Estado:
El código es una parte de la función de visualización para un juego.Una matriz de enteros representará la placa que se interpreta (pero no en el código anterior) y las imágenes correctas de Jlabel se colocarán en un panel de distribución de cuadrícula para mostrar la interfaz gráfica de la placa. He conseguido que el código de la pantalla funcione bien, pero en mi versión actual elimina las jlabels de la placa y luego crea nuevas JLabels (pieza ...) ... pero preferiría que se actualizase a sí misma de la matriz entera en lugar de eliminarla las etiquetas, leyendo la matriz y luego recreando las etiquetas.
Por lo tanto, cree un JPanel que use GridLayout y llénelo con JLabels inalterables. Luego simplemente cambie los íconos que tienen las JLabels en función de los valores mantenidos por la matriz int. Puede crear un método que simplifique y automatice este proceso.
Editar respecto:
edición he intentado esto antes, pero se produce una excepción de puntero nulo.
Luego solucione esto como lo haría con cualquier NPE. Averigüe qué línea arroja el NPE, verifique las variables en la línea, al menos uno es nulo, y luego corríjalo para que inicialice la variable antes de intentar usarla.
Editar
por ejemplo:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import javax.swing.*;
@SuppressWarnings("serial")
public class GridExample extends JPanel {
public static final int[][] MAP = {
{1, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2},
{1, 1, 0, 0, 2, 2, 2, 2, 2, 2, 2},
{1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2},
{1, 1, 1, 0, 0, 2, 2, 2, 2, 2, 2},
{1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2},
{1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2},
{1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2},
{1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2},
{1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2},
{1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2},
{1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2}
};
public static final Color[] COLORS = {};
private JLabel[][] labelGrid = new JLabel[MAP.length][MAP[0].length];
public GridExample() {
setLayout(new GridLayout(MAP.length, MAP[0].length));
for (int r = 0; r < labelGrid.length; r++) {
for (int c = 0; c < labelGrid[r].length; c++) {
labelGrid[r][c] = new JLabel();
labelGrid[r][c].setIcon(Ground.getGround(MAP[r][c]).getIcon());
add(labelGrid[r][c]);
}
}
}
private static void createAndShowGui() {
GridExample mainPanel = new GridExample();
JFrame frame = new JFrame("GridExample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
enum Ground {
DIRT(0, new Color(205,133, 63)), GRASS(1, new Color(0, 107, 60)),
WATER(2, new Color(29, 172, 214));
private int value;
private Color color;
private Icon icon;
private Ground(int value, Color color) {
this.value = value;
this.color = color;
icon = createIcon(color);
}
private Icon createIcon(Color color) {
int width = 24; // how to use const in enum?
BufferedImage img = new BufferedImage(width, width, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.setColor(color);
g.fillRect(0, 0, width, width);
g.dispose();
return new ImageIcon(img);
}
public int getValue() {
return value;
}
public Color getColor() {
return color;
}
public Icon getIcon() {
return icon;
}
public static Ground getGround(int value) {
for (Ground ground : Ground.values()) {
if (ground.getValue() == value) {
return ground;
}
}
return null;
}
}
que muestra una cuadrícula de interfaz gráfica de usuario:

Obtener un recurso de aplicación de una ruta relativa a la 'user.dir' es muy *** *** frágil. Dado que estas imágenes son aparentemente inherentes a la aplicación, deben agregarse al Jar como [recurso incrustado] (http://stackoverflow.com/tags/embedded-resource/info). –