Autor Tema: Java ejemplo JPanel, JButton, addActionListener y método actionPerformed  (Leído 13711 veces)

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Hola a todos!

Tengo unas dudas de concepto y si es posible quisiera que alguien me explicara lo más detalladamente posible por qué lo del segundo programa ES UN DISPARATE!!!!!???

He hecho 2 programas iguales, pero en el segundo he cambiado un par de lineas que hace que no me funcione.Si analizo el primer ejercicio sé por qué está bien(básicamente porque funciona :P), pero no sé exactamente por qué el segundo está mal.

Mi plantemiento en el segundo es: Si en la clase PanelArriba creo un objeto(creado-->"PanelPrincipal pa=new PanelPrincipal();") de la clase PanelPrincipal,
entonces ese objeto creado puedo usarlo dentro del metodo actionPerformed sin problemas y así hacer que el programa funcione).Sé que este planteamiento es erroneo, y me gustaría saber por qué

A ver si hay suerte (siempre la ha habido en este foro:P) y alguien me puede ayudar, así voy avanzando en mis estudios básicos de Java. Muchas gracias por todo y saludos!!!!

PS. En los comentarios del segundo programa puntualizo los cambios con respecto al primero


Código: [Seleccionar]

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class PanelPrincipal extends JFrame{
JPanel principal=new JPanel();
JPanel panel2=new JPanel();


PanelArriba arriba=new PanelArriba(this);

JButton rojo=new JButton("Rojo");
JButton azul=new JButton("Azul");

public PanelPrincipal(){

super("Panel principal");

setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

rojo.addActionListener(arriba);
azul.addActionListener(arriba);

panel2.add(rojo);
panel2.add(azul);

principal.setBorder(BorderFactory.createLineBorder(Color.black));
panel2.setBorder(BorderFactory.createLineBorder(Color.black));

arriba.setBorder(BorderFactory.createLineBorder(Color.black));

BoxLayout horizontal=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(horizontal);

principal.add(arriba);
principal.add(panel2);

add(principal);

setVisible(true);

}

public static void main(String[]args){
PanelPrincipal p=new PanelPrincipal();

}
}
class PanelArriba extends JPanel implements ActionListener{

PanelPrincipal pa;
public PanelArriba(PanelPrincipal princip){
this.pa=princip;

}

@Override
public void actionPerformed(ActionEvent e) {
Object ob=e.getSource();
if(ob==pa.azul){
setBackground(Color.blue);

}else if(ob==pa.rojo){
setBackground(Color.red);
}
}
}



Aqui dejo el segundo (que es como el primero PERO con algunos cambios que hace que NO funcione)
Código: [Seleccionar]

import java.awt.*;

import javax.swing.*;
import java.awt.event.*;

public class PanelPrincipal extends JFrame{
JPanel principal=new JPanel();
JPanel panel2=new JPanel();


PanelArriba arriba=new PanelArriba(); //Aqui hay un cambio con respecto al primer programa.
//Esta linea anteriormente era---->"PanelArriba arriba=new PanelArriba(this);"



JButton rojo=new JButton("Rojo");
JButton azul=new JButton("Azul");




public PanelPrincipal(){

super("Panel principal");

setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

rojo.addActionListener(arriba);
azul.addActionListener(arriba);




panel2.add(rojo);
panel2.add(azul);





principal.setBorder(BorderFactory.createLineBorder(Color.black));
panel2.setBorder(BorderFactory.createLineBorder(Color.black));

arriba.setBorder(BorderFactory.createLineBorder(Color.black));

BoxLayout horizontal=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(horizontal);

principal.add(arriba);
principal.add(panel2);





add(principal);

setVisible(true);


}


public static void main(String[]args){

PanelPrincipal p=new PanelPrincipal();

}
}
class PanelArriba extends JPanel implements ActionListener{

PanelPrincipal pa=new PanelPrincipal();


//En el programa anterior aqui tenía un constructor y le pasaba como parametros "PanelPrincipal princip" ...
//...en este al no tener que pasarle parametro no hago un constructor






@Override
public void actionPerformed(ActionEvent e) {

Object ob=e.getSource();

if(ob==pa.azul){

setBackground(Color.blue);


}else if(ob==pa.rojo){

setBackground(Color.red);



}



}


}

« Última modificación: 26 de Agosto 2015, 19:29 por César Krall »

SamML

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 19
    • Ver Perfil
Re:Dudas de concepto al pasar parametro a un metodo, uso de eventos.Java
« Respuesta #1 en: 26 de Agosto 2015, 14:58 »
Creo, y digo creo, que debes usar return para entregar el objeto creado al asignar la clase PanelArriba cuando quieras usarlo fuera de esa función. Si no simplemente creas un objeto de caracter local, entiendo.

Saludos.

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2074
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola Caludo, después de mirar tus códigos no le veo un diseño coherente a ninguno de los dos.

No veo por qué tienes necesidad de usar una clase interna PanelArriba

En este código he puesto simplemente el panel  principal y los dos paneles. En el panel de abajo se añaden los botones. Los botones registran los eventos de qué botón es pulsado y se encargan de cambiar el color de fondo del panel correspondiente.

Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class PanelPrincipal extends JFrame{
    JPanel principal=new JPanel();
    JPanel panel2=new JPanel();
    JPanel arriba=new JPanel();
    JButton rojo=new JButton("Rojo");
    JButton azul=new JButton("Azul");

    public PanelPrincipal(){

        super("Panel principal");
        setSize(400,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel2.add(rojo);
        panel2.add(azul);
        principal.setBorder(BorderFactory.createLineBorder(Color.blue));
        panel2.setBorder(BorderFactory.createLineBorder(Color.green));

        arriba.setBorder(BorderFactory.createLineBorder(Color.pink));

        BoxLayout horizontal=new BoxLayout(principal,BoxLayout.Y_AXIS);
        principal.setLayout(horizontal);
        principal.add(arriba);
        principal.add(panel2);

        add(principal);
        setVisible(true);

        rojo.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    arriba.setBackground(Color.red);
                }
            } );

        azul.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    arriba.setBackground(Color.blue);
                }
            } );
    }

    public static void main(String[]args){
        PanelPrincipal p=new PanelPrincipal();
    }
}

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Re:Dudas de concepto al pasar parametro a un metodo, uso de eventos.Java
« Respuesta #3 en: 27 de Agosto 2015, 02:04 »
Creo, y digo creo, que debes usar return para entregar el objeto creado al asignar la clase PanelArriba cuando quieras usarlo fuera de esa función. Si no simplemente creas un objeto de caracter local, entiendo.

Saludos.
Hola SamML. Gracias por la respuesta. Es posible que te haya entendido mal, pero en principio no puedo usar return, ya que sería en el metodo "public void actionPerformed(ActionEvent e)" y este es un metodo (de tipo void)de la interface ActionListener

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Hola Cesar!

Muchas gracias por tu respuesta. Sé que tiene más sentido como lo has hecho tu. Como estoy empezando en este mundo de la POO de Java, la idea era hacer un ejercicio que tuviera el mismo resultado pero hacerlo de maneras diferentes. Mi intensión en este caso era probar "conectar"(no se me ocurre una palabra mejor,aún debo aprender más sobre más vocabulario de programación) 2 paneles que pertenecieran a clases diferentes, por eso creé la clase PanelPrincipal(ahí tengo 1 panel principal además de otro panel donde añado botones) y la clase JPanel PanelArriba..O sea basicamente quería hacer pruebas.
Mi duda sobre todo era por qué(además del diseño poco coherente) alguien me pueda decir como funciona las lineas(del primer ejercicio)--->

   PanelPrincipal pa;
    public PanelArriba(PanelPrincipal princip){
    this.pa=princip;
   
    }

Sé que aqui estoy creando una variable "pa" de tipo "PanelPrincipal" y más tarde a esa variable le doy el valor de la variable "princip".LLamo a  ese constructor  en la creación del objeto-->"PanelArriba arriba=new PanelArriba(this);"

Pero mi duda viene en el segundo ejemplo que pongo, por qué es tan disparatado(de hecho no me funciona) hacerlo como lo he hecho, quizás SamML(el usuario que me ha contestado anteriormente) tenga razón y según como lo he hecho es más lógico con un "return", pero el metodo de la interface no me lo permite.

Una vez más gracias por todo, sé que tu manera de hacerlo es la correcta, simplemente intento hacerlo de otras maneras para aprender
PS. Si me pudieras aclarar mis errores en el segundo te lo agradecería muchisimo!(Más que una solución busco entenderlo!)
« Última modificación: 27 de Agosto 2015, 08:44 por Alex Rodríguez »

 

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".