Autor Tema: Java juego fichas piezas botones JLabel ImageIcon JButton JFrame MouseListener  (Leído 1532 veces)

yromanova

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Hola a todos, espero que estéis bien.

Oye, tengo una pregunta. Estoy utilizando tres botones como fichas de un juego, cada uno de ellos tiene su imagen o icon, y bueno, tambien tengo 3 fichas como tablero.
Bueno, lo que quiero saber, es que como le puedo pasar las imagenes de las dichas a los botones.

Por ejemplo, presiono la ficha 1 y luego presiona la casilla 1 del tablero para que de una forma se me settee la imagen de la ficha 1 en la casilla 1.

Esto en en lenguaje Java, IDE Neatbens, los botones se colocan no se crean.
« Última modificación: 12 de Marzo 2022, 17:30 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Informacion entre botones
« Respuesta #1 en: 14 de Octubre 2021, 02:02 »
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.
Código: [Seleccionar]
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.

Código: [Seleccionar]
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.

Código: [Seleccionar]
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
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".