Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: caludo en 26 de Agosto 2015, 03:14
-
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
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)
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);
}
}
}
-
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 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.
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!
-
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
-
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!)