Todo depende un poco de como estés escribiendo el código.
Pero como idea general, has de conseguir una forma de poder transferir el ImageIcon que aplicas a las fichas (suponiendo que uses ImageIcon) a las piezas.
Para ello conviene que el ImageIcon sea un atributo de tu clase Ficha, para así tener una referencia que poder transferir.
Pongamos un ejemplo rápido.
No se como estás creando tus fichas, yo por ejemplo, voy a crearlas a partir de la clase JLabel.
El ImageIcon será un atributo, que podré comunicar "hacia fuera" mediante un método getter.
Cada ficha, recibirá por constructor una ruta String a la imagen que ha de mostrar como icono.
import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class Ficha extends JLabel {
private ImageIcon icono;
public Ficha(String rutaImg) {
setOpaque(true);
setBackground(Color.WHITE);
icono = new ImageIcon(Ficha.class.getClassLoader().getResource(rutaImg));
setIcon(icono);
setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createRaisedSoftBevelBorder(),
BorderFactory.createEmptyBorder(10,10,10,10)));
}
public ImageIcon getIcono() {
return icono;
}
public void deSeleccionar() {
setBackground(Color.WHITE);
}
public void seleccionar() {
setBackground(Color.BLUE);
}
}
Los método seleccionar() y deSeleccionar() lo único que hacen es cambiar el color de fondo.
La idea es que la ficha que se seleccione, su fondo visible alrededor del icono cambie de color. Así parece que lo que cambia es su borde, y se puede distinguir en todo momento la ficha actualmente seleccionada.
Ahora, viene la clase Pieza.
Puedo reutilizar la clase que puse como ejemplo en el otro tema. Simplemente la transformo en un JButton, le añado un constructor que no me pida los atributos boolean(ahora no los necesitamos) y hago que se pinten con un icono por defecto.
En este caso, será un interrogante, para indicar que la Pieza/botón está a la espera de recibir una imagen a partir de una ficha.
import javax.swing.ImageIcon;
import javax.swing.JButton;
public class Pieza extends JButton {
public boolean esClara;
public boolean esGrande;
public boolean esRedonda;
public boolean esHueca;
public Pieza() {
setIcon(new ImageIcon(Pieza.class.getClassLoader().getResource("img/interrogante.png")));
}
public Pieza(boolean esClara, boolean esGrande, boolean esRedonda, boolean esHueca) {
this.esClara = esClara;
this.esGrande = esGrande;
this.esRedonda = esRedonda;
this.esHueca = esHueca;
setIcon(new ImageIcon(Pieza.class.getClassLoader().getResource("img/interrogante.png")));
}
}
Y ahora, una clase JFrame para mostrar las piezas y los botones.
En esta clase, usaré dos tipos de MouseListener.
Uno será para las fichas, y lo que hará es que cuando se clicke una ficha, se marcará como seleccionada y se recogerá en un atributo, el ImageIcon asociado a esa ficha.
El otro MouseListener será para los botones. Lo que hará será que cuando se pulse un botón, se le aplicará el ImageIcon que hemos recogido de alguna ficha seleccionada.
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class PruebaImagenes extends JFrame {
private Ficha ficha1; private Ficha ficha2;
private Ficha ficha3; private Ficha ficha4;
private Pieza pieza1; private Pieza pieza2;
private Pieza pieza3; private Pieza pieza4;
private ImageIcon seleccion;
public PruebaImagenes() {
setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
add(new PanelFichas());
add(new PanelPiezas());
setTitle("Test Imagenes");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private class PanelFichas extends JPanel {
public PanelFichas() {
ficha1 = new Ficha("img/peon1.png");
ficha2 = new Ficha("img/peon2.png");
ficha3 = new Ficha("img/alfil.png");
ficha4 = new Ficha("img/reina.png");
ficha1.addMouseListener(new SeleccionIcono());
ficha2.addMouseListener(new SeleccionIcono());
ficha3.addMouseListener(new SeleccionIcono());
ficha4.addMouseListener(new SeleccionIcono());
setLayout(new GridLayout(1,4,5,5));
add(ficha1); add(ficha2); add(ficha3); add(ficha4);
}
}
private class PanelPiezas extends JPanel {
public PanelPiezas() {
pieza1 = new Pieza();
pieza2 = new Pieza();
pieza3 = new Pieza();
pieza4 = new Pieza();
pieza1.addMouseListener(new AplicarIcono());
pieza2.addMouseListener(new AplicarIcono());
pieza3.addMouseListener(new AplicarIcono());
pieza4.addMouseListener(new AplicarIcono());
setLayout(new GridLayout(2,2));
add(pieza1); add(pieza2); add(pieza3); add(pieza4);
}
}
//MouseListener para las FICHAS
private class SeleccionIcono implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
//Deseleccionamos todas las fichas
ficha1.deSeleccionar(); ficha2.deSeleccionar();
ficha3.deSeleccionar(); ficha4.deSeleccionar();
//Detectamos la seleccion actual
Ficha seleccionada = (Ficha) e.getSource();
//Marcamos como seleccionada
seleccionada.seleccionar();
//Capturamos su icono
seleccion = seleccionada.getIcono();
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) { }
}
//MouseListener para las PIEZAS
private class AplicarIcono implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
if (seleccion == null)
JOptionPane.showMessageDialog(null, "Seleccione primero una FICHA",
"Aplicar imagen", JOptionPane.WARNING_MESSAGE);
else {
//Detectamos pieza a la que se aplicará
Pieza seleccionada = (Pieza) e.getSource();
//Aplicamos icono
seleccionada.setIcon(seleccion);
}
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) { }
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new PruebaImagenes();
}
});
}
}
En este video puede verse como funciona:
https://www.youtube.com/watch?v=dq6WyiXFSfQ