Java - manipular componentes en paneles diferentes

 
Vista:
Imágen de perfil de Diego
Val: 41
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

manipular componentes en paneles diferentes

Publicado por Diego (16 intervenciones) el 13/10/2021 04:01:02
Saludos, busco orientación sobre como hacer que un JLabel cambie algunas de sus propiedades cuando pulse un jbutton, como por ejemplo texto o imagen de fondo.

El caso es que tengo un JFrame en el cual tengo dos JPanels. En uno tengo un scrollpane y un jlabel dentro del scroll; en el otro JPanel tengo un jbutton el cual debe afectar al label del primer panel. Los paneles los tengo en clases diferentes.

¿Qué tema me puede servir de guía para implementar lo que quiero?

Espero que me haya hecho entender.

gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

manipular componentes en paneles diferentes

Publicado por Kabuto (1077 intervenciones) el 14/10/2021 12:06:12
Hay varias formas de hacerlo.

Por ejemplo, si ese botón siempre va a estar dedicado a cambiar ese JLabel en concreto, puedes asociarlos creando tu propia clase JButton, la cuál tenga un atributo JLabel, que será una referencia a la etiqueta que ha de alterar.
Esa referencia puede recibirla por el constructor, o por un setter.

Además, directamente se le puede añadir un ActionListener para que cada vez que se pulse un botón, altere al JLabel según lo que necesitemos.

Aquí te pongo un ejemplo, donde la acción lo que haría será cambiar el color de fondo de la etiqueta por un color al azar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
 
import javax.swing.JButton;
import javax.swing.JLabel;
 
public class Boton extends JButton {
 
	private JLabel lbAsociado;
 
	public Boton(JLabel asociado) {
		super("Cambiar JLabel");
		lbAsociado = asociado;
		addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				alterarColor();
			}
		});
	}
 
	private void alterarColor() {
		Random azar = new Random();
		int R = azar.nextInt(256);
		int G = azar.nextInt(256);
		int B = azar.nextInt(256);
		lbAsociado.setBackground(new Color(R,G,B));
	}
 
}


Luego, en un JFrame, declaramos una etiqueta y un objeto de nuestra clase Boton

Podemos ponerlos en distintos JPanel o no, va a dar igual. Lo importante es que al construir el boton le pasemos la referencia a la etiqueta, así estarán "conectados" sin importar donde los coloquemos luego en la interfaz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.awt.BorderLayout;
 
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
 
public class Test extends JFrame {
 
	private JLabel etiqueta;
	private Boton btAlterar;
 
	public Test() {
 
		etiqueta = new JLabel("Cambia mi color");
		etiqueta.setOpaque(true);
		etiqueta.setBorder(BorderFactory.createEmptyBorder(25, 25, 25, 25));
 
		JPanel pnLabel = new JPanel();
		pnLabel.add(etiqueta);
		pnLabel.setBorder(BorderFactory.createCompoundBorder(
				BorderFactory.createEmptyBorder(50, 50, 50, 50),
				BorderFactory.createRaisedSoftBevelBorder()));
 
		btAlterar = new Boton(etiqueta); //Asociamos la etiqueta con el boton
		JPanel pnBoton = new JPanel();
		pnBoton.add(btAlterar);
 
		setLayout(new BorderLayout());
		add(pnLabel, BorderLayout.CENTER);
		add(pnBoton, BorderLayout.SOUTH);
 
 
		setTitle("Alterar JLabel");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new Test();
			}
		});
	}
}


Si probamos, tendremos un botón que permite cambiar el color de fondo de la etiqueta.

imagen_2021-10-14_120512

Pero en realidad podríamos hacer cualquier cosa con ella.
Puesto que el botón tiene "conexión" directa con la etiqueta mediante la referencia que recibe por el constructor, puede actuar sobre ella para cualquier cosa que necesitemos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Diego
Val: 41
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

manipular componentes en paneles diferentes

Publicado por Diego (16 intervenciones) el 15/10/2021 03:09:45
Gracias, tendré en cuenta ese ejemplo para próximos proyectos. Ahora pondré los códigos de las clases que tengo para ver si se entiende mi idea. Este es un programa copiado de otro en el que ya me habías ayudado, pero ahora lo que intento es que cada panel sea independiente en una clase individual y que desde "el panel de control" pueda modificar componentes del "panel mapa"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Aplicación que pretende gestionar mapas, fichas y lanzamientos de dados para partidas de juegos de rol
package Presentacion;
 
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
 
 
 
public class Principal extends JFrame {
 
 
    PanMapa panMapa;
    PanControl panControl;
    PanDados panDados;
 
    public Principal() throws IOException {
 
        initComponentes();
 
 
 
    } // fin del constructor
 
 
 
    public void initComponentes() {
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setResizable(false);
        this.setTitle("MAPAS ROL");
        this.setLayout(null);
        // componentes
        {
            panMapa = new PanMapa();
            panMapa.setLocation(0, 0);
            this.add(panMapa);
        }
        {
            panControl = new PanControl();
            panControl.setLocation(901, 0);
            this.add(panControl);
        }
        {
            panDados = new PanDados();
            panDados.setLocation(901, 301);
            this.add(panDados);
        }
 
         pack();
        setSize(1340, 720);
        setLocationRelativeTo(null);
        setVisible(true);
    }
 
    public static void main(String[] args) throws IOException {
 
        JFrame.setDefaultLookAndFeelDecorated(true);
        try {
            //   UIManager.setLookAndFeel("com.jtattoo.plaf.bernstein.BernsteinLookAndFeel");
            //UIManager.setLookAndFeel("com.jtattoo.plaf.luna.LunaLookAndFeel");
            // UIManager.setLookAndFeel("com.jtattoo.plaf.graphite.GraphiteLookAndFeel");
            UIManager.setLookAndFeel("com.jtattoo.plaf.texture.TextureLookAndFeel");
        } catch (Exception e) {
 
        }
        Principal frm = new Principal();
        frm.setVisible(true);
 
    } // fin del main
} // fin de la clase Principal




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// esta clase servirá para visualizar los mapas y las fichas
package Presentacion;
 
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.filechooser.FileNameExtensionFilter;
 
public class PanMapa extends JPanel {
 
    File fichero;
    JFileChooser jfchCargarMapa = new JFileChooser();
    JScrollPane scroll;
    public JLabel lblMapa;
    PanControl panControl;
    ImageIcon icon;
 
 
    public PanMapa() {
        iniComponentes();
 
    }
 
    private void iniComponentes() {
        setVisible(true);
        setLayout(null);
 
        {
            scroll = new JScrollPane();
            scroll.setBounds(0, 0, 200, 200);
 
 
            this.add(scroll);
            {
                lblMapa = new JLabel();
                this.scroll.setViewportView(lblMapa);
 
            }
 
        }
 
        setSize(900, 690);
    } // fin del método iniComponentes
 
    public void cargarMapa() {
 
        int seleccion;
 
        FileNameExtensionFilter filtro = new FileNameExtensionFilter("JPG y PNG", "jpg", "png");
        jfchCargarMapa.setFileFilter(filtro);
        seleccion = jfchCargarMapa.showOpenDialog(this);
        if (JFileChooser.APPROVE_OPTION == seleccion) {
 
            fichero = jfchCargarMapa.getSelectedFile();
            try {
                icon = new ImageIcon(fichero.toString());
                lblMapa.setIcon(icon);
 
            } catch (Exception ex) {
 
                JOptionPane.showMessageDialog(null, "Error abriendo la imagen " + ex);
 
            }
 
 
        }
 
    } // fin de método cargarMapa
 
 
 
} // fin de la clase PanMapa



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package Presentacion;
 
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
 
public class PanControl extends JPanel {
 
    private JButton btnAgregarMap;
    private JButton btnCrearFicha;
    public JComboBox combo;
 
    File fichero;
    JFileChooser jfchCargarMapa = new JFileChooser();
    JFileChooser jfchCargarFicha = new JFileChooser();
    PanMapa panMapa;
 
    public PanControl() {
 
        iniComponentes();
 
    } // fin constructor
 
    private void iniComponentes() {
        setVisible(true);
        setBackground(Color.blue);
        setBorder(javax.swing.BorderFactory.createTitledBorder("Mapa y Fichas"));
        setLayout(null);
 
        // componentes
        {
            btnAgregarMap = new JButton("Agregar Mapa");
            btnAgregarMap.setBounds(130, 60, 200, 40);
            btnAgregarMap.setFont(new Font("Indie Flower", Font.BOLD, 20));
            btnAgregarMap.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    btnAgregarMapActionPerformed(evt);
                }
            });
            this.add(btnAgregarMap);
 
        }
        {
            btnCrearFicha = new JButton("Crear Ficha");
            btnCrearFicha.setBounds(150, 210, 150, 40);
            btnCrearFicha.setFont(new Font("Indie Flower", Font.BOLD, 20));
            btnCrearFicha.setBackground(new Color(238, 238, 0));
            btnCrearFicha.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    // btnAgregarFichaActionPerformed(evt);
                }
            });
            this.add(btnCrearFicha);
 
        }
        {
            combo = new JComboBox();
            ComboBoxModel comboModel = new DefaultComboBoxModel(new String[]{
                "Seleccione tamaño", "Minúsculo", "Diminuto", "Menudo", "Pequeño", "Mediano",
                "Grande", "Enorme", "Gargantuesco", "Colosal"
            });
 
            combo.setBounds(100, 140, 250, 60);
            combo.setModel(comboModel);
            combo.setBorder(javax.swing.BorderFactory.createTitledBorder("Ficha"));
            combo.setFont(new Font("Indie Flower", Font.BOLD, 20));
            combo.setOpaque(false);
            this.add(combo);
        }
 
        // fin de componentess
        setSize(434, 300);
    } // fin del método iniComponentes
 
    private void btnAgregarMapActionPerformed(ActionEvent evt) {
        panMapa = new PanMapa();
        this.panMapa.cargarMapa();
 
 
    } // fin del método btnAgregarMapActionPerformed
 
} // fin de la clase 




Lo que quiero es que el botón de agregar mapa del panel de control llame al método agregarMapa del panel mapa y pueda agregar una imagen al label usando el método imageIcon().
Espero se entienda la idea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

manipular componentes en paneles diferentes

Publicado por Kabuto (1077 intervenciones) el 15/10/2021 17:11:52
En el panel de control veo que ya has puesto un atributo PanMapa, pero parece que no termina de estar asociado al PanMapa que se declara en la clase Principal.
Similar al ejemplo que puse, podrías asociarlos mediante el constructor del panel de control, o bien con un setter.

Otra opción podría ser que escribieses un ActionListener en la clase Principal (que es quien tiene acceso a todos los paneles)
En este ActionListener, simplemente llamas al método de cargarMapa().
Y luego añades esta "acción" al botón del panel de control, el cuál para facilitar las cosas, en la clase PanControl tendría que estar declarado como public en lugar de private.
Marco los cambios en negrita:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class Principal extends JFrame {
 
 
    PanMapa panMapa;
    PanControl panControl;
    PanDados panDados;
 
    public Principal() throws IOException {
 
        initComponentes();
 
 
 
    } // fin del constructor
 
 
 
    public void initComponentes() {
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setResizable(false);
        this.setTitle("MAPAS ROL");
        this.setLayout(null);
        // componentes
        {
            panMapa = new PanMapa();
            panMapa.setLocation(0, 0);
            this.add(panMapa);
        }
        {
            panControl = new PanControl();
            panControl.btnAgregarMap.addActionListener(new AccionCargarMapa()); //Añadimos acción al botón
            panControl.setLocation(901, 0);
            this.add(panControl);
        }
        {
            panDados = new PanDados();
            panDados.setLocation(901, 301);
            this.add(panDados);
        }
 
         pack();
        setSize(1340, 720);
        setLocationRelativeTo(null);
        setVisible(true);
    }
 
    //Clase para la acción del botón agregar mapa
    private class AccionCargarMapa implements ActionListener {
 
        @Override
        public void actionPerformed(ActionEvent e) {
            panMapa.cargarMapa();
        }
    }
 
    public static void main(String[] args) throws IOException {
 
        JFrame.setDefaultLookAndFeelDecorated(true);
        try {
            //   UIManager.setLookAndFeel("com.jtattoo.plaf.bernstein.BernsteinLookAndFeel");
            //UIManager.setLookAndFeel("com.jtattoo.plaf.luna.LunaLookAndFeel");
            // UIManager.setLookAndFeel("com.jtattoo.plaf.graphite.GraphiteLookAndFeel");
            UIManager.setLookAndFeel("com.jtattoo.plaf.texture.TextureLookAndFeel");
        } catch (Exception e) {
 
        }
        Principal frm = new Principal();
        frm.setVisible(true);
 
    } // fin del main
} // fin de la clase Principal



No he probado el código, pero creo que podría servir.
Ya nos contarás.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Diego
Val: 41
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

manipular componentes en paneles diferentes

Publicado por Diego (16 intervenciones) el 16/10/2021 02:45:48
Ha funcionado, gracias eres muy amable. Seguiré cacharreando y vendré de seguro con más dudas y solicitando ayuda.

¡Gracias Kabuto!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar