Hasta el momento se ha tocado cosas básicas de la GUI de Java, pero en esta ocasión les mostraré un pequeño truquito para cuando necesitemos crear muchos objetos (botones, cuadros de texto, etiquetas, etc, etc) con una función en común. Para este pequeño truco se usara el concepto de lo que es un Arreglo de Objetos en Java, Arreglos en Java, el uso de Jpanel en Java y una pizca de creatividad 😉
El ejemplo a mostrar son los botones numéricos de una calculadora, como la que tiene la calculadora predeterminada de nuestro Sistema Operativo. Primero vean el código sin usar el arreglo de botones:
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 | package arrobjetos; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class ArrObjetos implements ActionListener{ JButton jb1, jb2, jb3, jb4, jb5, jb6, jb7, jb8, jb9; JPanel jp1, jp2, jp3; JLabel jl1, jl2; private ArrObjetos (){//constructor de la clase JFrame frMain = new JFrame("Arreglo de Botones"); frMain.setLayout(new BorderLayout(60, 20)); jl1 = new JLabel(); //creacion jlabel que muestra el numero pulsado jl1.setText("Aquí ira el numero que se pulse"); mostrarBot(); frMain.add(jl1, BorderLayout.NORTH); frMain.add(jp2, BorderLayout.SOUTH); frMain.setSize(400, 300); frMain.setLocation(300, 200); frMain.setVisible(true); frMain.setResizable(false); frMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void mostrarBot(){//metodo donde se encontrara el jpanel que contiene los botones jp2 = new JPanel(new GridLayout(3, 3, 20, 5)); //creacion de los botones jb1 = new JButton("1"); jb2 = new JButton("2"); jb3 = new JButton("3"); jb4 = new JButton("4"); jb5 = new JButton("5"); jb6 = new JButton("6"); jb7 = new JButton("7"); jb8 = new JButton("8"); jb9 = new JButton("9"); //añadiendo los botones al jpanel jp2.add(jb9); jp2.add(jb8); jp2.add(jb7); jp2.add(jb6); jp2.add(jb5); jp2.add(jb4); jp2.add(jb3); jp2.add(jb2); jp2.add(jb1); //añadiendo el listener para el evento del click jb1.addActionListener(this); jb2.addActionListener(this); jb3.addActionListener(this); jb4.addActionListener(this); jb5.addActionListener(this); jb6.addActionListener(this); jb7.addActionListener(this); jb8.addActionListener(this); jb9.addActionListener(this); } public static void main(String[] args) { ArrObjetos trin = new ArrObjetos();//se invoca el constructor } @Override public void actionPerformed(ActionEvent e) { jl1.setText(e.getActionCommand());//cuando se presione un boton se mostrara el numero en el jlabel } } |
package arrobjetos; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class ArrObjetos implements ActionListener{ JButton jb1, jb2, jb3, jb4, jb5, jb6, jb7, jb8, jb9; JPanel jp1, jp2, jp3; JLabel jl1, jl2; private ArrObjetos (){//constructor de la clase JFrame frMain = new JFrame("Arreglo de Botones"); frMain.setLayout(new BorderLayout(60, 20)); jl1 = new JLabel(); //creacion jlabel que muestra el numero pulsado jl1.setText("Aquí ira el numero que se pulse"); mostrarBot(); frMain.add(jl1, BorderLayout.NORTH); frMain.add(jp2, BorderLayout.SOUTH); frMain.setSize(400, 300); frMain.setLocation(300, 200); frMain.setVisible(true); frMain.setResizable(false); frMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void mostrarBot(){//metodo donde se encontrara el jpanel que contiene los botones jp2 = new JPanel(new GridLayout(3, 3, 20, 5)); //creacion de los botones jb1 = new JButton("1"); jb2 = new JButton("2"); jb3 = new JButton("3"); jb4 = new JButton("4"); jb5 = new JButton("5"); jb6 = new JButton("6"); jb7 = new JButton("7"); jb8 = new JButton("8"); jb9 = new JButton("9"); //añadiendo los botones al jpanel jp2.add(jb9); jp2.add(jb8); jp2.add(jb7); jp2.add(jb6); jp2.add(jb5); jp2.add(jb4); jp2.add(jb3); jp2.add(jb2); jp2.add(jb1); //añadiendo el listener para el evento del click jb1.addActionListener(this); jb2.addActionListener(this); jb3.addActionListener(this); jb4.addActionListener(this); jb5.addActionListener(this); jb6.addActionListener(this); jb7.addActionListener(this); jb8.addActionListener(this); jb9.addActionListener(this); } public static void main(String[] args) { ArrObjetos trin = new ArrObjetos();//se invoca el constructor } @Override public void actionPerformed(ActionEvent e) { jl1.setText(e.getActionCommand());//cuando se presione un boton se mostrara el numero en el jlabel } }
Una vez que se ejecute el código se vera la siguiente ventana, prueba el código, vé lo que pasa, si quieres modificalo 😉
Lo anterior fue sin usar el arreglo, esto lo hice con la intención de que vean el ahorro de lineas de código y la manipulación con el Arreglo de Botones, el siguiente código contiene el ejemplo usando el concepto de Arreglo:
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 | package arrobjetos; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class ArrObjetos implements ActionListener{ JButton []arrBtn = new JButton[9];//arreglo de botones JPanel jp1; JLabel jl1, jl2; private ArrObjetos (){//constructor de la clase JFrame frMain = new JFrame("Arreglo de Botones"); frMain.setLayout(new BorderLayout(10, 20)); jl1 = new JLabel();//creacion jlabel que muestra el numero pulsado jl1.setText("Aquí ira el numero que se pulse"); mostrarBot(); frMain.add(jl1, BorderLayout.NORTH); frMain.add(jp1, BorderLayout.SOUTH); frMain.setSize(400, 300); frMain.setLocation(300, 200); frMain.setVisible(true); frMain.setResizable(false); frMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void mostrarBot(){//metodo donde se encontrara el jpanel que contiene los botones jp1 = new JPanel(new GridLayout(3, 3, 20, 5)); for(int i=arrBtn.length-1; i>=0; i--){//ciclo para crear, añadir, establecer propiedades a los botones arrBtn[i] = new JButton(""+(i+1)); jp1.add(arrBtn[i]); arrBtn[i].setMargin(new Insets(1, 1, 1, 1)); arrBtn[i].addActionListener(this); }//fin ciclo } public static void main(String[] args) { ArrObjetos trin = new ArrObjetos(); //se invoca el constructor } @Override public void actionPerformed(ActionEvent e) { jl1.setText(e.getActionCommand());//cuando se presione un boton se mostrara el numero en el jlabel } } |
package arrobjetos; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class ArrObjetos implements ActionListener{ JButton []arrBtn = new JButton[9];//arreglo de botones JPanel jp1; JLabel jl1, jl2; private ArrObjetos (){//constructor de la clase JFrame frMain = new JFrame("Arreglo de Botones"); frMain.setLayout(new BorderLayout(10, 20)); jl1 = new JLabel();//creacion jlabel que muestra el numero pulsado jl1.setText("Aquí ira el numero que se pulse"); mostrarBot(); frMain.add(jl1, BorderLayout.NORTH); frMain.add(jp1, BorderLayout.SOUTH); frMain.setSize(400, 300); frMain.setLocation(300, 200); frMain.setVisible(true); frMain.setResizable(false); frMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void mostrarBot(){//metodo donde se encontrara el jpanel que contiene los botones jp1 = new JPanel(new GridLayout(3, 3, 20, 5)); for(int i=arrBtn.length-1; i>=0; i--){//ciclo para crear, añadir, establecer propiedades a los botones arrBtn[i] = new JButton(""+(i+1)); jp1.add(arrBtn[i]); arrBtn[i].setMargin(new Insets(1, 1, 1, 1)); arrBtn[i].addActionListener(this); }//fin ciclo } public static void main(String[] args) { ArrObjetos trin = new ArrObjetos(); //se invoca el constructor } @Override public void actionPerformed(ActionEvent e) { jl1.setText(e.getActionCommand());//cuando se presione un boton se mostrara el numero en el jlabel } }
Las lineas que nos interesan son las siguientes:
– 15 : Declaramos e instanciamos el Arreglo de Botones de 9 elementos.
– 42 a 47: Ciclo en el cual creamos cada elemento con su respectivo numero, ademas de esto los añadimos al JPanel, y le agregamos el listener para el evento con el mouse.
Aunque el ahorro de lineas en este ejemplo no fue mucho, les aseguro que si deseamos configurar mas propiedades, si usamos mas objetos, veremos el ahorro de lineas 😉 El resultado del ultimo código es exactamente igual a la imagen después del primero código que se ha puesto como ejemplo.
Hola JAGonzales, mi pregunta es: si tienes un array con acciones en un panel, y se quiere hacer una conjunto de es panel añadiendolos en un Jframe todos, por ejemplo
PanelConAcciones pCA1 = new panelConAcciones(this);
PanelConAcciones pCA2 = new panelConAcciones(this);
PanelConAcciones pCA3 = new panelConAcciones(this);
PanelConAcciones pCA4 = new panelConAcciones(this);
add(PanelConAcciones pCA1) ;
add(PanelConAcciones pCA2) ;
add(PanelConAcciones pCA3) ;
add(PanelConAcciones pCA4) ;
La accion del boton que tenemos en PanelConAcciones para que sean independientes a cada panel como las puedo imprlementar?
Agradecida de antemano
holaaa 😀 … se puede con JOption??
Hola, claro, para esto es útil hacer lo siguiente:
Una vez ejecutes lo anterior, no pasara nada 😀 No es por que no funcione, simplemente es por que no le he añadido los eventos a los botones. Simplemente modifica el código a tu gusto y realiza pruebas 😉 Dale rienda suelta a tu curiosidad. Exitos!
necesito el código para graficar una matriz para un juego donde hay cuatro jugadores que se moverán aleatoria mente la ventana viene de otra donde se introducen la magnitud de l amatriz