Dibujar en Java con la Clase Graphics
Dibujar en Java con la Clase Graphics
Graphics
Posted by p_geek On enero 24, 2019 In Lenguajes No comments
Afortunadamente java ofrece un gran soporte para gráficos e incluso existe una clase Graphics2D para
dibujos bidimensionales. Sin embargo, en este articulo hablaremos solamente de graphics y ciertos
elementos que deberás conocer para dibujar.
Primero debes saber que Graphics funciona con un sistema de coordenadas (todas las herramientas y
lenguajes que soporten dibujo lo tienen). La coordenada X indica la posición horizontal del elemento y
este se dibuja de izquierda a derecha, la coordenada Y funciona de arriba a abajo dibujando los
elementos de esta forma. A diferencia de las coordenadas en matemáticas en Java Y se desplaza hacia
abajo cuando su valor es positivo.
Ademas, la parte superior izquierda siempre tendrá las coordenadas(x, y) con valor (0, 0). Tomando
esta como referencia para posicionar tus dibujos, podrás apreciar lo explicado a continuación:
La clase Graphics permite establecer colores y fuentes a sus dibujos, es posible dibujar: texto, imágenes,
círculos, rectángulos, arcos, lineas y poligonos (fillPolygon, este metodo permite crear multiples dibujos
como: triángulos, hexágonos y otros. Pues por parámetro debes pasar un arreglo de posiciones en X y Y
logrando diversas figuras).
¿Como dibujar?
Para poder comenzar a crear nuestros primeros dibujos, debemos crear un marco y agregar un panel. El
panel es nuestra hoja (literal) que permite aplicar los dibujos de la clase Graphics (el contexto grafico es
nuestro panel). Ya creado nuestro marco con panel ahora debemos establecer el método para dibujar:
Con el método anterior seremos capaces de dibujar, es importante llamar al método padre utilizando
super, pues con esto indicamos que pinte nuevamente el contexto, si usted no hace el llamado es posible
que se dibuje una vez o no dibuje nada. El código completo con el marco y panel (contexto grafico) es:
1
2 package contextografico;
3
4 import [Link];
5
public class PrimerDibujo {
6
7 public static void main(String[] args) {
8 JFrame f = new JFrame("Ventana con Contexto Grafico");
9 PanelDibujo panel=new PanelDibujo();
10 [Link](panel);
[Link](280, 150, 500, 400);
11 [Link](JFrame.EXIT_ON_CLOSE);
12 [Link](true);
13 }
14
15 }
16
1
package contextografico;
2
3
import [Link].*;
4 import [Link].*;
5
6 public class PanelDibujo extends JPanel {
7
8 @Override
9 public void paintComponent(Graphics g) {
[Link](g);
10 }
11
12 }
13
1
2 public class PanelDibujo extends JPanel {
3
@Override
4 public void paintComponent(Graphics g) {
5 [Link](g);
6 [Link]( 40, 35, 80, 80, 0, 360);
7 [Link](160, 75, 200, 75);
[Link]([Link]);
8 [Link]( 40, 150, 80, 70, 0, 360);
9 }
10
11 }
12
Cabe mencionar que los métodos que al comienzo tienen fill tiene un comportamiento de dibujo especial
y es que estos crean el dibujo relleno con el color establecido (en la imagen anterior se dibuja un arco
relleno de color naranja).
Un método util conocido como translate, recibe por parámetro dos valores y son las posiciones X y Y.
Al establecer el valor de coordenadas cambia el punto de origen. Por ende, los dibujos serán dibujados a
partir de los valores establecidos como punto de origen, ejemplo:
1
2 public class PanelDibujo extends JPanel {
3
@Override
4 public void paintComponent(Graphics g) {
5 [Link](g);
6 [Link]([Link]);
7 [Link]([Link]()/2, [Link]()/2);
8 [Link](40, 10, 50, 50);
[Link](-40, -80, 50, 50);
9 [Link](-5, -5, 10, 10);
10 }
11
12 }
13
La posición donde se encuentra el circulo dibujado, es el nuevo punto de origen y a partir de este serán
dibujadas las figuras. Para obtener el centro del marco, obtienes el ancho y alto del Panel y lo divides
entre 2 (podrás observar que el circulo esta centrado).
¿Dibujar una figura dentro de otra?
Algo realmente sencillo de hacer, puedes apreciar el siguiente ejemplo:
1
2 public class PanelDibujo extends JPanel {
3
@Override
4 public void paintComponent(Graphics g) {
5 [Link](g);
6 [Link]([Link]);
7 [Link]([Link]()/2, [Link]()/2);
8 [Link](40, 10, 50, 50);//dibujo de rectangulo
[Link]([Link]);
9 [Link](40, 10, 50, 50); //dibujo de circulo
10 }
11
12 }
13
Usted simplemente deberá poner las mismas posiciones X, Y. Pues los dibujos se realizan de izquierda a
derecha, con esto se asegura de dibujar figuras «anidadas».
Los métodos utilizados en los ejemplos no son todos. Para mi punto de vista los métodos mencionados,
te facilitaran la creación de dibujos. Si deseas conocer los demás métodos puedes revisar el API de
JAVA.
Sin embargo, actualmente con el avance de la tecnologia existen procesadores con multiples nucleos y
aqui realmente ocurre el paralelismo. Afortunadamente JAVA tiene su propia maquina virtual
encargada de administrar la ejecucion de procesos creados por el propio lenguaje, esto facilita la tarea de
creación. Pero la cosa no solo termina aqui, ya que pueden surgir varios problemas con la programacion
concurrente una de ellas es la incongruencia de datos.
Ejemplo:
Tenemos una variable contador = 0, imagina que estas lanzando multiples hilos para incrementar en uno
el valor de la variable. Entonces entra en juego el hilo 1 e incrementa contador = 1 (pero aun no escribe
ese valor en la variable), entonces el gestor del sistema operativo le dice: oye hilo 1, espera que te voy a
suspender y ahora entra en juego el hilo 2, la variable contador aun tiene el valor cero, por lo que el hilo
2 toma ese valor lo incremente en uno y este escribe el valor siendo contador = 1.
El gestor del sistema operativo decide retomar el hilo 1 y este vuelve a escribir el numero 1 y se supone
que la variable contador debe ser igual a 2.
Este es un problema muy comun al utilizar Thread (hilos), por lo que debes solucionar el problema
sincronizando la ejecución de estos. Sin embargo, en este articulo no explicare el procedimiento (lo
menciono para que tengas una idea de lo que puede suceder).
Comencemos a crear hilos, primero explicare a crearlos utilizando la clase Thread (heredando de esta).
1
2 package hilos;
3
public class HiloUtilizandoThread extends Thread {
4
5 public HiloUtilizandoThread(String tarea) {
6 [Link] = tarea;
7 }
8
9 @Override
10 public void run() {
[Link](tarea);
11 }
12
13 private String tarea;
14
15 }
16
El metodo run() es el corazón del subproceso encargado de ejecutar la acción (aqui debemos poner el
código a ejecutar). Sin embargo, no debe ejecutar los hijos mediante este metodo, pues no estaria
aplicando programación concurrente (mas adelante mencionare como lanzar hilos).
Otra forma de implementar Hilos es utilizando la clase Runnable, existen dos formas de crear hilos.
Debido a que, si una clase donde quieras crear hilos ya este heredando de otra clase (por lo cual no
podras heredar de Thread pues sabemos que Java no permite herencia multiple). Sin embargo, JAVA
permite interfaces multiples y es por ese motivo que se pueden implementar hilos en 2 formas. El código
para implementar hilos utilizando Runnable es el siguiente:
1 package hilos;
2
public class HiloUtilizandoRunnable implements Runnable {
3
4
public HiloUtilizandoRunnable(String tarea) {
5 [Link] = tarea;
6 }
7
8 @Override
9 public void run() {
[Link](tarea);
10 }
11
12 private String tarea;
13
14 }
15
16
Ahora debemos lanzar los hilos creados, podemos hacerlo con el código mostrado a continuación:
1
2 package hilos;
3
4 public class HilosMain {
5
6 public static void main(String[] args) {
//Creacion de hilos utilizando la clase Thread
7 HiloUtilizandoThread hilo1 = new HiloUtilizandoThread("Tarea 1 con Thread");
8 HiloUtilizandoThread hilo2 = new HiloUtilizandoThread("Tarea 2 con Thread");
9 [Link]();
10 [Link]();
11 //Creacion de hilos utilizando la interfaz Runnable
Thread hiloR1 = new Thread(new HiloUtilizandoRunnable("Tarea 1 con Runnable"
12 Thread hiloR2 = new Thread(new HiloUtilizandoRunnable("Tarea 2 con Runnable"
13 [Link]();
14 [Link]();
15 }
16
17 }
18
El sistema operativo tiene una cola encargada de gestionar los procesos en ejecución, el
metodo start() pone los hilos creados en la cola del sistema operativo y este se encarga de gestionar la
ejecución (el orden de ejecución de hilos, depende del sistema operativo).
Sin embargo, aveces suele ser complicado crear este tipo de menú. Afortunadamente, explicare de
manera breve una forma sencilla de implementarlo. Cabe mencionar, que solo mencionare los métodos
necesarios para poder llevar acabo el menú emergente y no hablare a fondo sobre esta clase.
1
2 package menuemergente;
3
4 import [Link];
5
public class MenuEmergente {
6
7 public static void main(String[] args) {
8 PanelMenuEmergente panel = new PanelMenuEmergente();
9 JFrame f = new JFrame("Evento Menu Emergente");
10 [Link](panel);
[Link](150, 100, 500, 400);
11 [Link](JFrame.EXIT_ON_CLOSE);
12 [Link](true);
13 }
14
15 }
16
La siguiente clase es nuestro JPanel con el menú previamente creado, tiene una clase interna anónima
encargada de gestionar eventos. Se realizo de esta forma para facilitar el código a ustedes y sea
entendible para aquellos usuarios que apenas comienzan.
Escribir un programa que permita cambiar el color del panel mediante un menú emergente, el menú
emergente debe desplegarse al presionar clic derecho.
1 package menuemergente;
2
import [Link];
3 import [Link].*;
4 import [Link].*;
5
6 public class PanelMenuEmergente extends [Link] {
7
8 private JMenuItem colorVerde;
9 private JMenuItem colorAmarillo;
private JMenuItem colorRojo;
10 private JMenuItem colorNegro;
11
12 public PanelMenuEmergente() {
13 initComponents();
14 addMenuEmergente();
addEventos(new ControladorMenus(this));
15 }
16
private final void addEventos(ControladorMenus controlador) {
17 [Link](controlador);
18 [Link](controlador);
19 [Link](controlador);
20 [Link](controlador);
21 }
22
private final void addMenuEmergente() {
23 JPopupMenu menuEmergente = new JPopupMenu();
24
25 colorVerde = new JMenuItem("Verde");
26 colorAmarillo = new JMenuItem("Amarillo");
27 colorRojo = new JMenuItem("Rojo");
28
29 JMenu otroColores = new JMenu("Otros Colores");
colorNegro = new JMenuItem("Negro");
30 [Link](colorNegro);
31
32 [Link](colorVerde);
33 [Link](colorAmarillo);
34 [Link](colorRojo);
[Link](otroColores);
35
36
[Link](menuEmergente);
37 }
38
39 private class ControladorMenus implements ActionListener {
40
41 private JPanel panel;
42
43 public ControladorMenus(JPanel panel) {
[Link] = panel;
44 }
45
46 @Override
47 public void actionPerformed(ActionEvent e) {
48 switch ([Link]()) {
49 case "Amarillo":
[Link]([Link]);
50 break;
51 case "Verde":
52 [Link]([Link]);
53 break;
case "Rojo":
54 [Link]([Link]);
55 break;
56 case "Negro":
57 [Link]([Link]);
58 }
}
59
60 }
61
62
63
64
65
66
67
68 private void initComponents() {
69 setLayout(new [Link]());
70 }
71
72 }
73
74
75
76
77
El primer paso es crear el menu, para ello creamos diferentes opciones de menú (JMenuItem) indicando
mediante texto el color de fondo que establecerán.
Adicionalmente, se crea un menu (JMenu). Esto se realiza con el fin de crear una opción llamada
«Otros» que muestre mas colores, en otras palabras es un menú dentro de otro menú.
Ejecutamos nuestro proyecto y ahora cada que presionamos clic derecho sobre el contexto, se despliega
nuestro menú emergente.
Ademas, las opciones de menu pueden usar la interfaz ActionListener. Por este motivo se creo la
clase ControladorMenus encargada de gestionar este tipo de eventos de acción.
Tiene un constructor que recibe por parámetro un objeto de tipo JPanel, esto se hace para lograr cambiar
el color de fondo. Obteniendo como resultado lo siguiente al presionar la opción de menú con el color
deseado:
Espero sea de utilidad este breve ejemplo, puedes realizar cosas mas interesantes teniendo estas bases
mencionadas. Solo debes imaginar todas las posibilidades.
Al gestionar eventos usted podrá obtener los valores cuando el usuario se encuentre manipulado el
JSlider.
Para comenzar, primero debe saber que existe una interfaz nombrada ChangeListener, permite saber el
cambio de estado de la barra.
Esta interfaz es realmente sencilla, solo cuenta con un metodo llamado:
stateChanged(ChangeEvent e); se activa cuando el usuario comienza a mover la flecha del JSlider,
gracias a esto podemos obtener el valor seleccionado.
Teniendo en claro esta función de la interfaz, ahora realizaremos un ejemplo sencillo. A continuación
explicaremos los requisitos del ejemplo:
Escribir un programa que tenga una barra de valores del 0 al 100, el valor seleccionado deberá escribirse
en un botón.
1
2 package eventosjslider;
3
4 import [Link];
5
public class EventosJSlider {
6
7 public static void main(String[] args) {
8 PanelSlider panel = new PanelSlider();
9 JFrame f = new JFrame("Evento en JSlider");
10 [Link](panel);
[Link](150, 100, 300, 400);
11 [Link](JFrame.EXIT_ON_CLOSE);
12 [Link](true);
13 }
14
15 }
16
En nuestro panel, hemos agregado nuestro JSlider y JButton, para ello utilizamos el administrador de
diseño GridLayot para dividir el contenido en dos columnas. Ademas, creamos una clase interna
anónima para gestionar los eventos de JSlider.
1 package eventosjslider;
2
import [Link];
3 import [Link];
4
5 public class PanelSlider extends [Link] {
6
7 public PanelSlider() {
8 initComponents();
9 [Link](new ControladorJSlider());
}
10
11 private class ControladorJSlider implements ChangeListener {
12
13 @Override
14
15
16 public void stateChanged(ChangeEvent e) {
17 [Link]("Valor: " + [Link]());
18 }
19
20 }
21
22 // <editor-fold defaultstate="collapsed" desc="Generated
23 Code">
private void initComponents() {
24
25 barraValores = new [Link]();
26 botonValores = new [Link]();
27
28 setLayout(new [Link](1, 2));
29
30 [Link](10);
[Link](1);
31 [Link]([Link]);
32 [Link](true);
33 [Link](true);
34 add(barraValores);
35
36 [Link]("Valor 50");
add(botonValores);
37 }// </editor-fold>
38
39
40 // Variables declaration - do not modify
41 private [Link] barraValores;
42 private [Link] botonValores;
// End of variables declaration
43
}
44
45
46
Como la clase ControladorJSlider se encargara de gestionar los eventos, esta debe implementar la
interfaz ChangeListener. Posteriormente debemos registrar el evento a nuestro JSlider, esto podemos
hacerlo mediante el metodo:
addChangeListener(ChangeListener object); este recibe por parametro un objeto de tipo
ChangeListener, por este motivo le pasamos por parametro la clase ControladorJSlider.
Cuando tu desplaces la flecha de la barra el valor del botón se actualiza de forma automática, como se
muestra en la siguiente imagen:
Esto es posible, gracias al evento utilizado en nuestra barra. El ejemplo realizado es muy sencillo. Sin
embargo, tu puedes crear cosas mas complejas mediante los valores obtenidos. Otro ejemplo seria:
modificar el factor de transparencia de un dibujo utilizando Graphics2D.
Ademas, manejar este tipo de eventos resulta realmente sencillo. Es importante conocer este tipo de
eventos, pues te ayudaran a brindar mejor funcionalidad a tu software.
Comencemos hablando de la interfaz DocumentListener, cuenta con 3 métodos sencillos. Los cuales
son:
changedUpdate(DocumentEvent e); este método notifica cuando se ha realizado un cambio al
documento. Este metodo realmente se ocupa pocas veces. Los siguientes métodos que mencionare son
los mas usados al momento de codificar.
insertUpdate(DocumentEvent e); este método se invoca cuando el usuario comienza a insertar texto
dentro del campo de texto.
removeUpdate(DocumentEvent e); a diferencia del método anterior, este hace lo contrario. Se activa
cuando el usuario comienza a remover o eliminar texto del campo de texto.
Una vez comprendido el funcionamiento de cada método, realizaremos el siguiente ejemplo:
Escribiremos un programa que solo permita insertar como máximo 10 caracteres y mínimo 8, cuando se
exceda el limite, el campo se pondrá en color rojo y cuando se encuentre dentro del rango se pondrá en
verde.
Primero comenzaremos creando nuestra ventana, lo podemos realizar mediante el siguiente código:
1
2 package eventoscampos;
3
4 import [Link];
5
public class EventosCampos {
6
7 public static void main(String[] args) {
8 PanelCampos panel = new PanelCampos();
9 JFrame f = new JFrame("Eventos a campo de texto");
10 [Link](panel);
[Link](150, 100, 800, 600);
11 [Link](JFrame.EXIT_ON_CLOSE);
12 [Link](true);
13 }
14
15 }
16
Ahora el siguiente paso es crear nuestro panel con el campo de texto, en este caso hemos creado un
panel utilizando el administrador de diseño BorderLayout. Ademas, se creo una clase interna
llamada ControladorCampos encargada de gestionar los eventos de tipo DocumentListener, debido a
que esta clase implementa la interfaz nosotros sabemos que se encarga de gestionar los métodos de este
tipo de eventos.
1 package eventoscampos;
2
import [Link];
3 import [Link];
4 import [Link];
5 import [Link];
6
7 public class PanelCampos extends [Link] {
8
public PanelCampos() {
9 initComponents();
10 addEventos(new ControladorCampos());
11 }
12
13 public void addEventos(ControladorCampos oyente) {
14 Document documento = [Link]();
[Link](oyente);
15 }
16
17 private class ControladorCampos implements DocumentListener {
18
19 private int numeroCaracteres;
20
21 @Override
22 public void insertUpdate(DocumentEvent e) {
numeroCaracteres++;
23 if(numeroCaracteres >= 8 && numeroCaracteres <= 10) {
24 [Link]([Link]);
25 }else {
26 [Link]([Link]);
}
27
}
28
29 @Override
30 public void removeUpdate(DocumentEvent e) {
31 numeroCaracteres--;
32 if(numeroCaracteres < 8 || numeroCaracteres > 10) {
[Link]([Link]);
33 }else {
34 [Link]([Link]);
35 }
36 }
37
38 @Override
public void changedUpdate(DocumentEvent e) {
39
40 }
41
42 }
43
44 private void initComponents() {
45 campoCaracteres = new [Link]();
setLayout(new [Link]());
46 add(campoCaracteres, [Link]);
47 }
48
49 private [Link] campoCaracteres;
50 }
51
52
53
54
55
56
57
58
Tomando en cuenta la descripción del ejercicio que se tenia que realizar, dentro del
método insertUpdate si el método se encuentra dentro del rango de 8 a 10 caracteres se pintara de color
verde. En caso contrario se pintara de color rojo.
Ahora ya sabes manejar eventos de tipo DocumentEvent, esto te sera de gran utilidad incluso al validar
una contraseña o un correo electrónico.
Incluso, si deseas realizar cálculos de cambio al realizar una venta. Podrás simular el calculo del cambio
en tiempo real.
Manejo de Eventos de Acción (ActionListener) en
Java
Posted by p_geek On febrero 5, 2019 In Lenguajes No comments
El manejo de eventos de accion es uno de los eventos mas sencillos de implementar. Debido a que
solamente consta de un metodo. Sin embargo, es uno de los mas usados, pues permite agregar eventos de
tipo accion (al presionar) en algunos componentes.
Algunos componentes donde puede aplicarse el evento de tipo accion son: los botones, JTextField. Para
los botones el metodo se invoca al momento de presionar, en JTextField funciona de manera diferente y
este metodo se llama cuando el usuario hace un enter.
Para aplicar este evento realizare un ejemplo sencillo, consta de un boton. Sin embargo, cuando el
usuario presiona este boton el color de fondo se cambia. Ademas, si presiona nuevamente el boton, el
fondo cambia a un color diferente.
Primero crearemos nuestro marco y panel. Dentro del panel agregaremos el boton:
1
2 package eventoaccion;
3
import [Link];
4
5
public class EventoAccion {
6
7 public static void main(String[] args) {
8 JFrame f = new JFrame("Evento de Accion");
9 [Link](new PanelAccion());
10 [Link](100, 200, 500, 400);
[Link](JFrame.EXIT_ON_CLOSE);
11 [Link](true);
12 }
13
14 }
15
1 package eventoaccion;
2
import [Link];
3 import [Link];
4 import [Link];
5
6 public class PanelAccion extends JPanel {
7
8 public PanelAccion() {
9 addComponentes();
}
10
11 public void addComponentes() {
12 setLayout(new BorderLayout());
13
14 JButton cambiarColorFondo = new JButton("Cambiar Color de Fondo");
15 [Link](new OyenteAccion(this));
16 add(cambiarColorFondo, [Link]);
17 }
18
}
19
20
Para agregar el evento (poner a la escucha) lo hacemos con el metodo addActionListener, por
parametro recibe un objeto de tipo ActionListener.
ActionListener es una interfaz, solo contiene un metodo. A diferencia de las demas interfaces de
eventos, este tipo de evento no contiene una clase adaptadora pues tan solo tiene un metodo y no tendria
sentido. El metodo es:
actionPerformed: este metodo es llamado cuando se realiza una accion (se presiona un boton o
presionan enter dentro de un campo de texto).
A continuacion debemos crear la siguiente clase, donde se implementa la interfaz y el metodo invocado
del evento. Dentro del metodo agregaremos el codigo necesario para cambiar el fondo de pantalla con
diferentes colores:
1
2 package eventoaccion;
3
4 import [Link];
5 import [Link];
6 import [Link];
7
public class OyenteAccion implements ActionListener {
8
9 private PanelAccion panel;
10
11 public OyenteAccion(PanelAccion panel) {
12 [Link] = panel;
13 }
14
15 @Override
public void actionPerformed(ActionEvent e) {
16 int r = (int) ([Link]() * 256);
17 int g = (int) ([Link]() * 256);
18 int b = (int) ([Link]() * 256);
19 [Link](new Color(r, g, b));
20 }
21
}
22
23
Sabemos que el codigo de colores RGB, tiene un rango de valores de 0 a 255. Por este motivo se crean
tres variables de tipo entero.
Podras observar que nunca tomaremos en cuenta el valor 255 si realizamos la multiplicacion por el
mismo. Por este motivo, multiplicamos por 256, si haces las operaciones correspondientes mostradas
anteriormente podras notar que el resultado final es 255.
Lo explicado acerca de los colores, no es realmente el tema. Pero, me parece interesante y algo
importante que conozcas este tipo de cosas, pues a futuro pueden ser de gran ayuda.
Debes saber que java ofrece una interfaz y clase adaptadora, en esta ocasión usaremos la interfaz.
Primero comencemos creando nuestro método main encargado de crear y ejecutar las instancias.
1
2 package eventoventana;
3
import [Link];
4
5
public class MainVentana {
6
7 public static void main(String[] args) {
8 Ventana ventana = new Ventana();
9 [Link](JFrame.DO_NOTHING_ON_CLOSE);
10 [Link](new OyenteVentana(ventana));
[Link](500, 200, 500, 400);
11 [Link](true);
12 }
13
14 }
15
Ahora el siguiente paso es crear nuestra ventana y agregarle el evento. El código es:
1 package eventoventana;
2
3 import [Link];
4
5 public class Ventana extends JFrame {
6
7 public void addEventos(OyenteVentana oyente) {
8 [Link](oyente);
}
9
10 }
11
El ultimo paso es crear nuestra clase que implemente la interfaz WindowListener. Sin embargo, antes
mencionare el funcionamiento de cada método.
1 package eventoventana;
2
import [Link];
3 import [Link];
4 import [Link];
5 import [Link];
6
7 public class OyenteVentana implements WindowListener {
8
9 private Ventana ventana;
10
public OyenteVentana(Ventana ventana) {
11 [Link] = ventana;
12 }
13
14 @Override
15 public void windowOpened(WindowEvent e) {
16 [Link](ventana, "Ventana iniciada por primera vez");
}
17
18
@Override
19 public void windowClosing(WindowEvent e) {
20 int opcion = [Link](ventana, "¿Quieres salir del prog
21 JOptionPane.YES_NO_OPTION);
22 if(opcion==JOptionPane.YES_OPTION) {
[Link](0);
23
24
25
26
}
27 }
28
29 @Override
30 public void windowClosed(WindowEvent e) {
31 [Link]("La ventana se ha cerrado");
}
32
33
@Override
34 public void windowIconified(WindowEvent e) {
35 [Link]("la ventana se a minimizado ");
36 }
37
38 @Override
public void windowDeiconified(WindowEvent e) {
39 [Link]("La ventana se a maximizado");
40 }
41
42 @Override
43 public void windowActivated(WindowEvent e) {
44 [Link]("La ventana esta activa (tienes el foco)");
[Link]().setBackground([Link]);
45 }
46
47 @Override
48 public void windowDeactivated(WindowEvent e) {
49 [Link]("La ventana no esta activa (no tienes el foco)");
[Link]().setBackground([Link]);
50 }
51
52 }
53
54
55
56
Explicare detenidamente como aprovechar windowClosing. Para lograr que el método funcione, primero
debe desactivar la función del botón cerrar que ofrece la ventana. Esto podemos hacerlo con el siguiente
código:
1 [Link](JFrame.DO_NOTHING_ON_CLOSE);
Con el código anterior le decimos que por mas que presionen el botón cerrar, la ventana no sera cerrada.
Sin embargo, tras presionar el botón, se activa el método windowClosing (se lanza un evento). Dentro de
este podemos poner cualquier código. Por ejemplo: preguntar si realmente desea salir de la ventana.
Ademas, cuando la ventana tiene el foco (La ventana esta sobre todas las demás) se activa
windowActivated, dentro del método agregue el código necesario para cambiar el color de fondo a rojo.
Podrá comprender de lo que hablo con la siguiente imagen:
Sin embargo, cuando usted no tiene el foco (la ventana esta detrás de otra) se invoca windowDeactivated
y el color del fondo se cambia a negro.
Los demas metodos se comprenden de manera facil. Por lo que, no es necesario explicarlos, ademas olo
imprimen un mensaje en consola
El manejo de eventos de mouse se implementa mediante dos formas diferentes, la primera es utilizando
clases de interfaz. Otra opción es utilizando las clases adaptadoras.
Los eventos de mouse son varios, afortunadamente he preparado un ejemplo que permitirá comprender
de manera sencilla el funcionamiento de cada método. Para ello, primero mencionaremos los métodos a
continuación:
Métodos pertenecientes a la interfaz
MouseListener o clase MouseAdapter
mouseClicked: Se activa cuando se presiona y dejas de presionar el botón, sin mover el mouse. Por lo
que, si mantienes presionado, mueves el mouse y sueltas el botón se activara otro método
nombrado mouseDragged.
mouseEntered: Cuando se encuentra dentro del área de un componente, este método se invoca. Por
ejemplo: tenemos un panel al cual agregamos este tipo de evento, este método me permite saber cuando
se encuentra el cursor dentro del panel (componente).
mouseExited: Se lanza cuando el cursor sale del área de un componente, retomando el ejemplo del
panel del método anterior. Funciona de manera contraria, pues el método se activa cuando el cursor esta
dentro del panel y este sale del área conformada por el componente.
mousePressed: Se activa cuando el botón del mouse se mantiene presionado.
mouseReleased: Cuando el botón del mouse deja de ser presionado, se invoca el método.
1
2 package eventomouse;
3
4 import [Link];
5
6 public class EventoRaton {
7
public static void main(String[] args) {
8 JFrame f = new JFrame("Eventos de Mouse");
9 PanelRaton panel = new PanelRaton();
10 OyenteRaton oyente = new OyenteRaton(panel);
11 [Link](oyente);
[Link](panel);
12 [Link](JFrame.EXIT_ON_CLOSE);
13 [Link](true);
14 [Link](300, 200, 500, 400);
15 }
16
17 }
18
Ahora creamos el panel, este componente nos permite dibujar dentro y agregar mas componentes.
Dentro de este, realizare los métodos necesarios para dibujar de acuerdo al comportamiento del usuario
con el mouse.
1
2
3
package eventomouse;
4
5 import [Link].*;
6 import [Link];
7
8 public class PanelRaton extends JPanel {
9
10 private int x = 0;
private int y = 0;
11 private boolean band = false;
12
13 public void addEventos(OyenteRaton e) {
14 [Link](e);
15 [Link](e);
16 }
17
public void setCoordenadas(int x, int y) {
18 this.x = x;
19 this.y = y;
20 }
21
22 public void setBandera(boolean band) {
[Link] = band;
23
}
24
25 @Override
26 public void paintComponent(Graphics g) {
27 [Link](g);
28 [Link](x, y);
[Link](-10, -10, 20, 20);
29 if(band) {
30 [Link]([Link]);
31 [Link](-25, -20, 50, 40);
32 // band = false;
33 }
}
34
35 }
36
37
38
Hasta ahora hemos creado nuestra ventana y panel. El paso final es crear nuestro OyenteRaton, dentro de
esta clase agregare todos los métodos necesarios para implementar este tipo de evento. Ademas, me
tome la molestia de escribir una pequeña descripción en cada método indicando el comportamiento.
1 package eventomouse;
2
import [Link];
3 import [Link].*;
4
5
6 public class OyenteRaton implements MouseListener, MouseMotionListener {
7
8 private PanelRaton panel;
9
public OyenteRaton(PanelRaton panel) {
10 [Link] = panel;
11 }
12
13 @Override
14 public void mouseClicked(MouseEvent e) {
//se invoca cuando presionas y dejas de presionar el boton sin mover el cur
15 [Link]([Link](), [Link]());
16 [Link](true);//se activa la bandera, permitiendo dibujar un recta
17 PanelRaton.
18 }
19
20 @Override
public void mousePressed(MouseEvent e) {
21 //se llama cuando se mantiene presionado el boton.
22 [Link]([Link]);
23 }
24
25 @Override
26 public void mouseReleased(MouseEvent e) {
//se llama cuando has dejado de presionar el boton del mouse.
27 [Link](null);
28 }
29
30 @Override
31 public void mouseEntered(MouseEvent e) {
//se llama cuando el mouse entra a los limites del componente.
32 //Cuando sale y entra de la ventana (en este caso).
33 [Link]("Acabas de entrar al area del componente");
34 }
35
36 @Override
37 public void mouseExited(MouseEvent e) {
//se llama cuando el cursor sale de los limites del componente.
38 [Link]("Acabas de salir del area del componente");
39 }
40
41 //Los siguientes metodos pertenecen a MouseMotionListener
42 @Override
public void mouseDragged(MouseEvent e) {
43
//es llamado cuando mantienes presionado el boton y mueves el cursor.
44 [Link]([Link](), [Link]());
45 [Link]();
46 }
47
48 @Override
public void mouseMoved(MouseEvent e) {
49 //Se llama al moveerse el cursor.
50 /*recomiendo comentar la siguiente linea, para apreciar mejor el mensaje de
51 // [Link]("estas moviendo el cursor");
52
53
54
55
}
56
57 }
58
59
60
61
Los eventos generados solamente son tres, podrás implementarlos utilizando la clase KeyListener o
KeyAdapter.
KeyListener: es una interfaz, por lo que obliga a re-escribir todos los métodos. Cada método con una
acción especifica para detectar el evento.
KeyAdapter: esta clase ya implementa la interfaz, por este motivo no es necesario re-escribir todos los
métodos. Solo re-escribirás los métodos que pienses utilizar.
1
2
3
4
5
6
package eventoteclado;
7
8 import [Link];
9
1 public class EventoTeclado {
0
1 public static void main(String[] args) {
1 JFrame f = new JFrame("Eventos de Teclado");
PanelTeclado panel = new PanelTeclado();
1
OyenteTeclado oyente = new OyenteTeclado(panel);
2 [Link](oyente);
1 [Link](panel);
3 [Link](JFrame.EXIT_ON_CLOSE);
1 [Link](true);
[Link](300, 200, 500, 400);
4 }
1
5 }
1
6
1
7
1
8
1 package eventoteclado;
2
import [Link];
3
4
public class PanelTeclado extends JPanel {
5
6 public void addEventos(OyenteTeclado e) {
7 /*Cuando usamos un evento de teclado, es necesario indicarle donde se
8 tendrá el foco,
9 sino indica el foco, nunca funcionara el evento.*/
[Link](true);
1 [Link](e);
0 }
1
1 }
1
2
1
3
1
4
Si trabajamos con eventos de teclado, es importante indicar quien tendrá el foco (con esto me refiero, a
la parte donde se usaran los eventos de teclado). Esto lo hacemos con el método: setFocusable(). Sino
indica quien tendrá el foco, los eventos de teclado no funcionaran, podrás observar que dentro del
código anterior se pasa por parámetro el valor true al método, indicando que tiene el foco.
addKeyListener: indica que usara eventos de teclado, por parámetro recibe un objeto de tipo
KeyListener.
1 package eventoteclado;
2
import [Link];
3 import [Link].*;
4
5 public class OyenteTeclado implements KeyListener {
6
7 private PanelTeclado panel;
8
9 public OyenteTeclado(PanelTeclado panel) {
10 [Link] = panel;
}
11
12
@Override
13 public void keyTyped(KeyEvent e) {
14 [Link]("Solo funciona cuando presiona teclas que no son Fin, AL
15 otros.");
16 }
17
@Override
18 public void keyPressed(KeyEvent e) {
19 [Link]("color");
20 switch ([Link]()) {
21 case KeyEvent.VK_R://cambia fondo a color rojo
[Link]([Link]);
22 break;
23 case KeyEvent.VK_G://cambia fondo a color verde
24 [Link]([Link]);
25 break;
26 case KeyEvent.VK_B://cambia fondo a color azul
[Link]([Link]);
27 }
28 [Link]("Se activa al presionar cualquier tipo de telcla.");
29 }
30
31 @Override
public void keyReleased(KeyEvent e) {
32
33
34
35 [Link](null);
[Link]("Se lanzara msg cuando se deja de pulsar la telcla.");
36 }
37
38 }
39
40
41
El código anterior funciona de manera sencilla, con el objetivo de mostrarte la función de cada método
de manera fácil.
Dentro del metodo keyPressed agregue el codigo para cambiar el color de fondo, si usted mantiene
presionada la tecla R, G o B. Cambia el color de fondo al correspondiente:
Sin embargo, en el momento cuando dejas de presionar la tecla, el color de fondo vuelve a la
normalidad. Cabe mecionar, que al metodo keyTyped no se agrego codigo extra, pues funciona similar
al keyPressed.
Como Crear Pestañas con JTabbedPane en Java
Posted by p_geek On enero 26, 2019 In Lenguajes No comments
Crear pestañas con java utilizando la clase JTabbedPane brinda mejor aspecto a las interfaces.
Ademas, crea un diseño amigable en cuanto a usabilidad.
Ofrece múltiples ventajas, pues para crear (agregar) pestañas recibe por parámetro objetos
Component lo cual incrementa posibilidades de agregar múltiples elementos. Por ejemplo:
usted podrá agregar distintos paneles y dentro de los paneles agregar mas elementos que
conformen formularios, entre otros. Ademas, ofrece gran facilidad de implementación.
Para comenzar a crear nuestras primeras pestañas, como de costumbre primero debemos
crear nuestra ventana (marco) con un panel.
1 package paneles;
2
import [Link].*;
3
4
public class Paneles {
5
6 public static void main(String[] args) {
7
8 JFrame f = new JFrame("Ventana con Pestañas y paneles");
9 [Link](new PanelMezclado());
10 [Link](500, 400);
[Link](150, 100);
11 [Link](JFrame.EXIT_ON_CLOSE);
12 [Link](true);
13 }
14
15 }
16
Ahora crearemos la instancia a la clase JTabbedPane y agregaremos pestañas con diferentes
componentes. Realmente es fácil implementar pestañas y se logra haciéndolo con el siguiente
código:
1 //Panel con etiquetas
2 JTabbedPane pVista = new JTabbedPane();
3 add(pVista, [Link]);//Agregamos al panel nuestro objeto JTabbedPane
4 [Link]("Panel con malla", addPanelConMalla());
[Link]("Panel con bordes", addPanelConBorder());
5 [Link]("Mezcla de paneles", addMezclaPaneles());
6
Para una implementación sencilla, basta con utilizar el método addTab(). Y este tiene una
sobre carga de métodos, algunos ofrecen la posibilidad de agregar un icono a la pestaña. Sin
embargo, el utilizado en el código permite agregar un texto a la pestaña y obviamente el
contenido.
Los objetos Comoponent pasados por parámetro son:
1
2 private Component addPanelConMalla() {
JPanel panel = new JPanel();
3 GridLayout grid = new GridLayout(2, 2);
4 [Link](grid);
5 JButton boton1 = new JButton("Primer Botón");
6 JButton boton2 = new JButton("Último Botón");
7 [Link](boton1);
[Link](new JButton("Otro Botón"));
8 [Link](boton2);
9 return panel;
10 }
11
Este método y los demás son de tipo Component, con el código anterior utilizamos el
administrador de diseño GridLayout y se agregamos tres botones.
1
2 private Component addPanelConBorder() {
JPanel panel = new JPanel();
3 BorderLayout layout = new BorderLayout();
4 [Link](layout); //&amp;lt;=Asignar el Layout
5 [Link](new JButton("Norte"), "North");
6 [Link](new JButton("Sur"), "South");
7 [Link](new JButton("Este"), "East");
[Link](new JButton("Oeste"), "West");
8 [Link](new JButton("Centro"), "Center");
9 return panel;
10 }
11
Ahora hacemos uso de BorderLayout y agregamos varios botones, podrás notar que existe la
posibilidad de crear pestañas con diferentes componentes cada una.
1
2 private Component addMezclaPaneles() {
3 JPanel panel = new JPanel();
4 BorderLayout layout = new BorderLayout();
[Link](layout);
5
6 JPanel panelNorte = new JPanel();
7 [Link]([Link]);
8 [Link](BorderFactory.
9 createLineBorder([Link], 5));
[Link](panelNorte, [Link]);
10 [Link](new JButton("Aceptar"));
11 [Link](new JButton("Cancelar"));
12 [Link](new JButton("Botón"), "Center");
13
14 return panel;
15 }
16
Finalmente usamos el mismo administrador de diseño que el código anterior, pero agregamos
botones y un border dando un aspecto diferente.
Como podrás notar, este tipo de pestañas da mejor aspecto y utilidad a nuestras aplicaciones.
Ademas, el método utilizado para lograr este funcionamiento solamente es uno. Sin embargo,
si deseas agregar funciones extras recomiendo visitar el API de JAVA (pues solo mencione el
método necesario para lograr esta función).
Ademas crear un cuadro de dialogo que permita abrir y guardar archivos, da un aspecto mas
profesional a la interfaz. Por esta y mas razones se recomienda implementar esta clase conocida como
JFIleChooser.
En este articulo nos limitaremos a enseñar como manipular archivos, pues crearemos un articulo especial
sobre el tema. Para comenzar a crear nuestro cuadro de dialogo, creare una ventana con menú (aunque
esto no es necesario, puede implementarlo de diferentes formas):
1
2 package menus;
3
4 import [Link];
5
6 public class Menus {
7
public static void main(String[] args) {
8 JFrame f = new JFrame("Ventana con menus");
9 BarraMenu barra = new BarraMenu();
10 [Link](new OyenteMenu());
11 [Link](barra);
[Link](400, 300);
12 [Link](120, 100);
13 [Link](JFrame.EXIT_ON_CLOSE);
14 [Link](true);
15 }
16
17 }
18
1 package menus;
2
import [Link].*;
3
4
public class BarraMenu extends JMenuBar {
5
6 private JMenu archivo;
7 private JMenuItem abrir;
8 private JMenuItem guardar;
9 private JMenuItem salir;
10
public BarraMenu() {
11 addMenus();
12
13
14 }
15
16 public final void addMenus() {
17 archivo = new JMenu("Archivo");
18 add(archivo);
19 abrir = new JMenuItem("Abrir");
[Link](abrir);
20 guardar = new JMenuItem("Guardar");
21 [Link](guardar);
22 [Link]();
23 salir = new JMenuItem("Salir");
[Link](salir);
24 }
25
26 public void addEventos(OyenteMenu e) {
27 [Link](e);
28 [Link](e);
29 [Link](e);
}
30
31 }
32
33
34
Explicare de forma breve que hace el código anterior, el primer cuadro de código simplemente se
encarga de crear el marco (JFrame) e instancias para usar las demás clases, el segundo bloque crea el
menú, el tercero es donde se gestiona los eventos de tipo ActionListener.
Dentro de la clase donde se gestionan los eventos, se agregara el código para crear cuadros de dialogo.
La clase JFileChooser ofrece varios métodos con funciones diferentes. Sin embargo, mencionare los
básicos (los mas utilizados).
Para crear a comenzar nuestro primer cuadro de dialogo, primero debemos crear una instancia a la clase
JFileChooser y después debemos hacer uso de los siguientes métodos:
Código:
1 package menus;
2
import [Link];
3 import [Link];
4 import [Link];
5 import [Link];
6
7
8
9
10 public class OyenteMenu implements ActionListener {
11
12 private JFileChooser seleccion;
13
14 public OyenteMenu() {
15 seleccion = new JFileChooser();
16 }
17
@Override
18 public void actionPerformed(ActionEvent e) {
19 String tipo = [Link]();
20 switch (tipo) {
21 case "Abrir":
opcionAbrir();
22
break;
23 case "Guardar":
24 opcionGuardar();
25 break;
26 case "Salir":
[Link](0);
27 }
28 }
29
30 //Codigo para crear cuadro de dialogo con JFileChooser
31 public void opcionAbrir() {
32 [Link](new FileNameExtensionFilter("Archivo de Texto", "*")
int opcion = [Link](null);
33 if (opcion == JFileChooser.APPROVE_OPTION) {
34 String ruta = [Link]().getAbsolutePath();
35 }
36 }
37
38 public void opcionGuardar() {
int opcion = [Link](null);
39 if (opcion == JFileChooser.APPROVE_OPTION) {
40 String ruta = [Link]().getAbsolutePath();
41 }
42 }
//Fin de codigo JFileChooser
43
44
}
45
46
47
48
El codigo agrega eventos y permite detectar las opciones pulsadas del usuario. El resultado final puede
ser apreciado en la primer imagen del post. Espero sea de gran utilidad lo explicado y tengan curiosidad
de implementar lo aprendido en mas proyectos GUIs.
Como Dibujar Figuras en Java Utilizando la Clase
Graphics
Posted by p_geek On enero 24, 2019 In Lenguajes No comments
Afortunadamente java ofrece un gran soporte para gráficos e incluso existe una clase
Graphics2D para dibujos bidimensionales. Sin embargo, en este articulo hablaremos
solamente de graphics y ciertos elementos que deberás conocer para dibujar.
La clase Graphics permite establecer colores y fuentes a sus dibujos, es posible dibujar: texto,
imágenes, círculos, rectángulos, arcos, lineas y poligonos (fillPolygon, este metodo permite
crear multiples dibujos como: triángulos, hexágonos y otros. Pues por parámetro debes pasar
un arreglo de posiciones en X y Y logrando diversas figuras).
¿Como dibujar?
Para poder comenzar a crear nuestros primeros dibujos, debemos crear un marco y agregar
un panel. El panel es nuestra hoja (literal) que permite aplicar los dibujos de la clase Graphics
(el contexto grafico es nuestro panel). Ya creado nuestro marco con panel ahora debemos
establecer el método para dibujar:
Con el método anterior seremos capaces de dibujar, es importante llamar al método padre
utilizando super, pues con esto indicamos que pinte nuevamente el contexto, si usted no hace
el llamado es posible que se dibuje una vez o no dibuje nada. El código completo con el marco
y panel (contexto grafico) es:
1
2 package contextografico;
3
4 import [Link];
5
public class PrimerDibujo {
6
7 public static void main(String[] args) {
8 JFrame f = new JFrame("Ventana con Contexto Grafico");
9 PanelDibujo panel=new PanelDibujo();
10 [Link](panel);
[Link](280, 150, 500, 400);
11 [Link](JFrame.EXIT_ON_CLOSE);
12 [Link](true);
13 }
14
15 }
16
1
package contextografico;
2
3
import [Link].*;
4 import [Link].*;
5
6 public class PanelDibujo extends JPanel {
7
8 @Override
9 public void paintComponent(Graphics g) {
[Link](g);
10 }
11
12 }
13
1
2 public class PanelDibujo extends JPanel {
3
@Override
4 public void paintComponent(Graphics g) {
5 [Link](g);
6 [Link]( 40, 35, 80, 80, 0, 360);
7 [Link](160, 75, 200, 75);
[Link]([Link]);
8 [Link]( 40, 150, 80, 70, 0, 360);
9 }
10
11 }
12
Cabe mencionar que los métodos que al comienzo tienen fill tiene un comportamiento de
dibujo especial y es que estos crean el dibujo relleno con el color establecido (en la imagen
anterior se dibuja un arco relleno de color naranja).
Un método util conocido como translate, recibe por parámetro dos valores y son las posiciones
X y Y. Al establecer el valor de coordenadas cambia el punto de origen. Por ende, los dibujos
serán dibujados a partir de los valores establecidos como punto de origen, ejemplo:
1
2 public class PanelDibujo extends JPanel {
3
@Override
4 public void paintComponent(Graphics g) {
5 [Link](g);
6 [Link]([Link]);
7 [Link]([Link]()/2, [Link]()/2);
8 [Link](40, 10, 50, 50);
[Link](-40, -80, 50, 50);
9 [Link](-5, -5, 10, 10);
10 }
11
12 }
13
La posición donde se encuentra el circulo dibujado, es el nuevo punto de origen y a partir de
este serán dibujadas las figuras. Para obtener el centro del marco, obtienes el ancho y alto del
Panel y lo divides entre 2 (podrás observar que el circulo esta centrado).
¿Dibujar una figura dentro de otra?
Algo realmente sencillo de hacer, puedes apreciar el siguiente ejemplo:
1
2 public class PanelDibujo extends JPanel {
3
@Override
4 public void paintComponent(Graphics g) {
5 [Link](g);
6 [Link]([Link]);
7 [Link]([Link]()/2, [Link]()/2);
8 [Link](40, 10, 50, 50);//dibujo de rectangulo
[Link]([Link]);
9 [Link](40, 10, 50, 50); //dibujo de circulo
10 }
11
12 }
13
Usted simplemente deberá poner las mismas posiciones X, Y. Pues los dibujos se realizan de
izquierda a derecha, con esto se asegura de dibujar figuras «anidadas».
Los métodos utilizados en los ejemplos no son todos. Para mi punto de vista los métodos
mencionados, te facilitaran la creación de dibujos. Si deseas conocer los demás métodos
puedes revisar el API de JAVA.
JMenuItem: esta clase es un componente que debe agregarse a un JMenu y sera nuestra lista que se
despliegue al presionar el menu (menu padre). Ademas, tras presionar nuestro submenu (JMenuItem)
este lanza un evento el cual podremos manipular utilizando los métodos ofrecidos por la clase.
Para comenzar a crear nuestro primer menu, debemos crear un marco (ventana). Podemos hacerlo
creando una instancia directamente de la clase como se muestra a continuación:
El siguiente paso es crear una instancia de la clase JMenu y posteriormente hacer uso del metodo add().
Este permite agregar componentes de tipo JMenuItem y JMenu, usted debe pasar por parámetro el texto
que desea mostrar.
addSeparator(): este metodo crea una linea que permite una mejor visión (algo estético para mejorar el
diseño del menu).
Tipos de Eventos Comunes de la GUI (Interfaz
Grafica de Usuario)
Posted by p_geek On enero 19, 2019 In Lenguajes No comments
¿Que son los eventos?
Definiremos de manera breve este concepto, un evento es el resultado de una acción realizada por el
usuario dentro de una interfaz grafica.
Sin embargo, nosotros hablaremos sobre los eventos que maneja java. En java debemos saber que todo
es orientado 100% a objetos, con esto podemos entender que es realmente un evento. Es un objeto
encargado de guardar la información por ejemplo: el nombre del origen de evento, el tipo de evento.
Ademas, los eventos pueden ser generados de diversas formas: al presionar una tecla, escribir texto
dentro de un campo, al desplazar o hacer clic con el mouse, al maximizar, minimizar y cerrar la ventana,
entre otros. Sin embargo, hablare de los mas comunes dentro de aplicaciones GUI.
Objeto origen: como decía anteriormente, este objeto puede ser un componente por ejemplo: botones,
ventanas, opciones de menu, entre otros.
Cuando presionan dicho objeto se crea un evento (objeto origen) en cargado de guardar información
sobre la acción realizada.
Objeto evento: se encarga de guardar la información necesaria para identificar el tipo de evento, ademas
puede guardar el nombre del origen.
Objeto oyente: este objeto siempre sera de tipo Listener y es encargado de estar a la escucha (de
chismoso) de cuando un evento (objeto origen) es creado. Este ejecuta la acción asociada al evento. Sin
embargo, cada oyente debe tener su registro al origen correspondiente pues dependiendo el origen tendra
una serie de metodos.
Para que tengas una mejor idea del esquema para aplicar a una GUI te dejo la siguiente imagen:
Clasificación de Eventos
Debemos saber que cada objeto origen genera un tipo especifico de evento que debe ser representada
con su clase adecuada.
Tipos de Oyentes
Son clases que deben representar los tipos de eventos que escuchan, estas clases deben implementar una
o varias interfaces para ejecutar metodos de acuerdo al tipo de evento.
Sin embargo, la mayoría de interfaces tienen mas de un metodo que tal vez no debas usar. Debido a este
motivo han creado una serie de clases adaptadoras encargadas de cumplir la misma función, pero la
ventaja es que solo usas los metodos que necesites (son clases que ya implementan las interfaces
mencionadas anteriormente y estas tambien se utilizan para crear oyentes).
Los eventos permiten incrementar la funcionalidad del programa, permitiendo al usuario interactuar de
manera facil. Pues tu como desarrollador, puedes hacer que un boton por ejemplo: cambie el color de
fondo o ejecute funciones mas complejas. En este articulo solo doy una breve introducción, en futuros
artículos explicare como implementar los diferentes tipos de eventos.
add(botonSur, [Link]);
Como podrás observar al metodo add() se le pasa un segundo parametro indicando la
posición del componente.
Algo importante que no he mencionado, todos los componentes creados ya sea un boton,
panel, entre otros (cualquier componente) debe ser agregado al panel (JPanel) mediante el
metodo mencionado anteriormente.
GridLayout
Hasta ahora hemos visto FlowLayout, BorderLayout y en breve GridLayout, todos estos
administradores de diseño tienen una sobre carga de constructores. Pero en la mayoría de los
casos GridLayout(numeroFilas, numeroColumnas) recibe por parametro el numero de filas y
columnas creando una especie de tabla o matriz (como gustes verlo).
Los componentes se agregan de acuerdo al orden de filas, los componentes se colocan en la
primer fila de izquierda a derecha cubriendo el numero de columnas y al terminar la fila se
pasa con la siguiente realizando el mismo procedimiento. La siguiente imagen te ayuda a
comprender lo explicado:
El código para utilizar GridLayout es:
1
2 class ProbandoEsquemas extends JPanel {
3
4 private JButton[] botones;
5
6 public ProbandoEsquemas() {
addComponentes();
7 }
8
9 public final void addComponentes() {
10 setLayout(new GridLayout(2, 5));
11 botones = new JButton[10];
for (int i = 0; i<10; i++) {
12 botones[i] = new JButton(i + "");
13 add(botones[i]);
14 }
15 }
16
17 }
18
Finalmente usted podrá poner a prueba todos estos JPanel utilizando una ventana:
La clase JSlider tiene sobrecarga de constructores, el constructor utilizado en el ejemplo recibe por
parametro un valor minimo, maximo y uno por defecto donde colocara la flecha (indicador) que nosotros
podemos desplazar dentro de ese rango, en otras palabras el minimo y maximo establecen un rango de
numero de inicio a fin.
Ejemplo: En el código anterior pasamos por parametro los valores JSlider(100, 200, 150); indicando
que nuestro valor inicial es 100 y final 200. El tercer valor pasado por parametro indica la posición del
indicador (flecha) donde debe colocarse por defecto.
setMajorTickSpacing(25): con este metodo estamos diciendo que cada 25 valores va a colocar una
etiqueta indicando el valor debajo o al lado (Cuando la orientación esta en vertical).
setMinorTickSpacing(5): este simplemente divide los valores cada 5, pero estos se colocan dentro del
espacio dejado por el metodo anterior, podrás observar el cambio con la siguiente imagen:
setPaintLabels(true): este metodo se encarga de dibujar los valores numéricos, por lo cual debes pasar
un valor de tipo boolean.
setPaintTicks(true): dibuja las lineas encargadas de dividir los espacios dejados con los metodos
setMajorTickSpacing() y setMinorTickSpacing().
setOrientation([Link]): Recibe por parametro constantes de clase (son valores
enteros) los cuales permiten determinar la posición de la barra.
Por ejemplo, para poder utilizar una calculadora se recomienda saber resolver las operaciones de suma,
resta, multiplicacion, division de manera que el usuario sepa lo que esta haciendo. Sucede lo mismo al
momento de crear una ventana en Java ya que podrías elaborar una sin mucho trabajo utilizando el
asistente que ofrece el compilador (por ejemplo: netbeans) pero no tendras idea del código detrás de
esto. Es por ello que a continuación te explicare los códigos para realizar una ventana:
1 package ventana;
2
import [Link];
3
4
public class Ventana {
5
6 public static void main(String[] args) {
7 JFrame v=new JFrame("Primera Ventana");
8 //[Link](100, 100);
9 //[Link](600, 400);
[Link](JFrame.EXIT_ON_CLOSE);
10 [Link](true);
11 [Link](new Panel());
12 [Link](100, 100, 600, 400);
13 [Link]("x=" + [Link]() + ", y=" + [Link]());
14 [Link]("ancho=" + [Link]() + ", alto=" + [Link]());
}
15
16 }
17
18
19
Utilizando la clase JFrame se crea una ventana, esta clase tiene una serie de metodos de los cuales
hablare.
setVisible(true): recibe por parametro un dato de tipo boolean y puede ser false o true, si pones false la
ventana no sera visible y por ende sabes que sucede al pasar por parametro el valor true.
Prácticamente nuestra ventana esta terminada, pero ¿que pasa al cerrar nuestra ventana? esta no
cierra completamente y podremos observar como el compilador aun dice que la ventana esta en
ejecución. Para solucionar este problema debemos usar el metodo:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE): recibe por parametro constantes de clase
(simplemente son valores de tipo entero) dentro del API podemos observar los valores de cada constante
y saber el comportamiento que recibe. En este caso la constante que pasamos por parametro le indica
que al momento de pulsar en la X de la ventana esta debe salir y terminar el «proceso».
Finalmente el metodo:
add(panel): permite agregar un componente, siempre debemos pasar por parametro un objecto de tipo
JPanel.
Las ventanas van acompañadas de uno o varios JPanel, los cuales tienen administradores de diseño que
tienen un comportamiento distinto al insertar componentes, este tema sera tratado en otro articulo.
[Link]/
Como primer paso, vamos a crear y lanzar hilos. Ademas se declaran las variables necesarias.
h2 llega primero y le pregunta al cerrojo: ¿esta ocupado el cerrojo? este le dice, no, adelante. Ahora el
h2 se encuentra activo, después llega h1 y hace la misma pregunta ¿esta ocupado el cerrojo? este le dice,
si, así que te mandare a la espera.
Activo: h2 – Espera: h1, h3, … , h5
Cuando h2 termina de realizar su tarea, despierta a todos los hilos produciendo una especie de concurso
para que solamente un hilo entre nuevamente a la sección critica.
El código anterior no incluye los métodos productor y consumidor, ahora toca hablar de ellos. Primero
comenzare:
Creando el productor
1 public void productor() {
synchronized (lock) {
2 if (rebanadas == 0) {
3 rebanadas = 10;
4 [Link]();
5
6 [Link]("Productor ha terminado de cocinar " + rebanadas + "
}
7 esperar();
8 }
9 }
10
Simplemente preguntamos, si productor es igual a cero entonces produces diez rebanadas. Ahora con el
objeto utilizado como cerrojo debemos notificar a todos los hilos que despierten (con esto indicamos que
aquellos hilos que sean consumidores, pueden comenzar a tomar rebanadas). Después de notificarle a
todos los hilos, nuestro hilo actual (hilo productor) debe dormir y esperar a que el consumidor lo
despierte (le notifique que no hay rebanadas).
Creando el consumidor
1
2 public void consumidor() {
3 synchronized (lock) {
4 if (rebanadas > 0) {
5 [Link]("Consumidor tiene la rebanada numero: " + rebanadas);
rebanadas--;
6 try {
7 sleep(1000);
8 } catch (InterruptedException ex) {
9 [Link]("Error de interrupcion");
}
10 } else {
11 [Link]();
12 esperar();
13 }
14 }
}
15
16
Con el código, primero nos aseguramos de tener rebanadas. Mientras rebanadas sea mayor a cero podrán
tomar una rebanada.
Si no existen rebanadas, debemos notificar al productor (realmente se notifican todos los hilos que están
a la espera) que ya no existen rebanadas. El hilo actual (hilo consumidor) debe esperar hasta que el
productor le notifique que ha terminado de cocinar.
Si analizas detenidamente lo explicado y el código, haces pruebas comentando partes del código. Podras
entender facilmente la relacion productor consumidor.
Manejo de Eventos de Ventana
(WindowListener/WindowAdapter) en Java
Posted by p_geek On febrero 3, 2019 In Lenguajes No comments
El Manejo de Eventos de Ventana puede ser útil en distintos aspectos. Permite crear software con
funciones especificas. Supongamos que usted desea conectar una base de datos al momento de abrir la
ventana por primera vez, podrá lograr este comportamiento gracias a los eventos de ventana.
Otro uso de los eventos de ventana, es en un programa de reloj. Este debe mostrar la hora al momento de
iniciar por primera vez. Sin embargo, tan solo son algunas aplicaciones de este tipo de evento, pues seras
capaz de crear software realmente interesante.
Debes saber que java ofrece una interfaz y clase adaptadora, en esta ocasión usaremos la interfaz.
Primero comencemos creando nuestro método main encargado de crear y ejecutar las instancias.
1
2 package eventoventana;
3
import [Link];
4
5
public class MainVentana {
6
7 public static void main(String[] args) {
8 Ventana ventana = new Ventana();
9 [Link](JFrame.DO_NOTHING_ON_CLOSE);
10 [Link](new OyenteVentana(ventana));
[Link](500, 200, 500, 400);
11 [Link](true);
12 }
13
14 }
15
Ahora el siguiente paso es crear nuestra ventana y agregarle el evento. El código es:
1 package eventoventana;
2
3 import [Link];
4
5 public class Ventana extends JFrame {
6
7 public void addEventos(OyenteVentana oyente) {
8 [Link](oyente);
}
9
10 }
11
El ultimo paso es crear nuestra clase que implemente la interfaz WindowListener. Sin embargo, antes
mencionare el funcionamiento de cada método.
1 package eventoventana;
2
import [Link];
3 import [Link];
4 import [Link];
5 import [Link];
6
7 public class OyenteVentana implements WindowListener {
8
9 private Ventana ventana;
10
public OyenteVentana(Ventana ventana) {
11 [Link] = ventana;
12 }
13
14 @Override
15 public void windowOpened(WindowEvent e) {
16 [Link](ventana, "Ventana iniciada por primera vez");
}
17
18
19
20
21
@Override
22 public void windowClosing(WindowEvent e) {
23 int opcion = [Link](ventana, "¿Quieres salir del prog
24 JOptionPane.YES_NO_OPTION);
25 if(opcion==JOptionPane.YES_OPTION) {
[Link](0);
26
}
27 }
28
29 @Override
30 public void windowClosed(WindowEvent e) {
31 [Link]("La ventana se ha cerrado");
}
32
33
@Override
34 public void windowIconified(WindowEvent e) {
35 [Link]("la ventana se a minimizado ");
36 }
37
38 @Override
public void windowDeiconified(WindowEvent e) {
39 [Link]("La ventana se a maximizado");
40 }
41
42 @Override
43 public void windowActivated(WindowEvent e) {
[Link]("La ventana esta activa (tienes el foco)");
44
[Link]().setBackground([Link]);
45 }
46
47 @Override
48 public void windowDeactivated(WindowEvent e) {
49 [Link]("La ventana no esta activa (no tienes el foco)");
[Link]().setBackground([Link]);
50 }
51
52 }
53
54
55
56
Explicare detenidamente como aprovechar windowClosing. Para lograr que el método funcione, primero
debe desactivar la función del botón cerrar que ofrece la ventana. Esto podemos hacerlo con el siguiente
código:
1 [Link](JFrame.DO_NOTHING_ON_CLOSE);
Con el código anterior le decimos que por mas que presionen el botón cerrar, la ventana no sera cerrada.
Sin embargo, tras presionar el botón, se activa el método windowClosing (se lanza un evento). Dentro de
este podemos poner cualquier código. Por ejemplo: preguntar si realmente desea salir de la ventana.
Ademas, cuando la ventana tiene el foco (La ventana esta sobre todas las demás) se activa
windowActivated, dentro del método agregue el código necesario para cambiar el color de fondo a rojo.
Podrá comprender de lo que hablo con la siguiente imagen:
Sin embargo, cuando usted no tiene el foco (la ventana esta detrás de otra) se invoca windowDeactivated
y el color del fondo se cambia a negro.
Los demas metodos se comprenden de manera facil. Por lo que, no es necesario explicarlos, ademas olo
imprimen un mensaje en consola.
Recursividad, algo realmente interesante y complejo para aquellos usuarios que comienzan con este
paradigma. La recursividad se puede definir como: Un metodo que se llama asi mismo.
Sin embargo, para realizar esto debes de cumplir ciertas «restricciones» pues de no hacerlo, el llamado
podría realizarse de manera infinita y este se ejecutaría hasta consumir todos los recursos de la memoria.
Por este motivo siembre se debe tener un caso base.
¿Que es un caso base?
El caso base (con la palabra podrías darte una idea) es el punto donde sabes que debes detenerte (en este
caso el propio metodo debe saber cuando detener las llamadas que se hace a el mismo).
calculaFactorial(5);
El metodo recursivo lo primero que hace es preguntar si num es igual a cero, en este caso num vale 5 por
lo tanto no se cumple y en caso de no cumplirse la condición debe retornar un valor, analicemos
detenidamente la siguiente linea:
return 5 * 4!;
La llamada recursiva del metodo, podemos observarla de manera facil de esta forma. Sin embargo, se
podría decir que aun no ejecuta la operación, debido a que las operaciones son realizadas cuando se ha
llegado al caso base. Por lo que, una vez que num sea igual a cero se cumple la primera condición y
devuelve uno.
Como ahora no se hace un llamado recursivo, se sabe que a llegado a su fin (caso base) y debe comenzar
a realizar todas las operaciones pendientes. Esto se podrá observar mejor en la siguiente imagen:
Finalmente podrás observar que la diferencia entre el metodo recursivo y no recursivo es notable, no se
tú pero a mi me parece mas complejo la creación del metodo sin recursividad ademas de tener mas lineas
de codigo.
Crear nuestra listas enlazadas de manera personalizada ofrece una gran serie de ventajas en diversos
aspectos, pues usted seria capaz de implementar funciones que por defecto la clase ArrayList<> de java
no tiene. Una de esas funciones podría ser: devolver el numero anterior y siguiente del numero buscado.
Ejemplo:
usted tiene una lista enlazada con los siguientes datos: 1–>2–>8–>5–>
anterior=2 y siguiente=5, esto solo es un ejemplo sencillo ya que usted podría realizar cosas más
interesantes.
Comencemos creando un nuevo proyecto, puede ponerle cualquier nombre. Posteriormente creamos
una clase NodoLista, esta clase permite definir el tipo de información que usted desea almacenar en su
lista enlazada, como decía anteriormente esta información puede ser de tipo: entero (en este ejemplo se
muestra asi) o incluso usted sera capaz de pasar por parametro una clase creada (personalizada).
1 package default;
2
3
public class NodoLista {
4
5 NodoLista sig;
6 int dato;
7
8 public NodoLista(int dato) {
9 [Link]=dato;
sig=null;
10 }
11
12 }
13
Realmente esta clase no tiene nada complejo, solo recibe por parametro el tipo de dato que desea recibir
y el «puntero» (en java no existe ese termino, para fines prácticos lo llamaremos asi). El «puntero» o
referencia simplemente se encarga de apuntar la información creando una colección en forma de lista
enlazada, en realidad esta variable hace referencia a la ubicación del nodo a apuntar.
El «puntero» en este caso es la variable siguiente, esta debe ser igual a null ya que no esta haciendo
referencia a ningún dato.
La siguiente clase Lista, debe contener toda la logica que cumpla con el comportamiento de una lista
enlazada, aqui nosotros nos encargaremos de crear los metodos necesarios para que todo funcione de
acuerdo a nuestras necesidades.
A diferencia de la cola y pila una lista no tiene una regla que seguir al insertar datos, una lista
enlazada permite insertar al frente, final o en cierto punto especifico.
1 package default;
2
public class Lista {
3
4
NodoLista ini, fin;
5 int tamanio;
6
7 public Lista() {
8 ini=fin=null;
9 }
10
public boolean estaVacia() {
11 return ini==null;
12 }
13
14 public void insertarFinal(int dato) {
15 NodoLista nuevo=new NodoLista(dato);
16 if(estaVacia()) {
ini=nuevo;
17 }else {
18 [Link]=nuevo;
19 }
20 fin=nuevo;
tamanio++;
21 }
22
23 public void insertarInicio(int dato) {
NodoLista nuevo=new NodoLista(dato);
24 if(estaVacia()) {
25 fin=nuevo;
26 }else {
27 [Link]=ini;
28 }
ini=nuevo;
29 tamanio++;
30 }
31
32 public int borrarDelInicio() {
33
34 int elemento = [Link];
35
36 if(inicio==fin) {
inicio=null;
37 fin=null;
38 }else {
39 inicio=[Link];
40 }
41
return elemento;
42
43
}
44
45 public int borrarDelFinal() {
46
47 int elemento = [Link];
48
49 if(inicio==fin) {
50 inicio=null;
fin=null;
51 }else {
52 Nodo temporal=inicio;
53
54 while([Link]!=fin) {
55 temporal=[Link];
56 }
57
fin=temporal;
58 [Link]=null;
59 }
60
61 return elemento;
62
63 }
64
public void mostrarLista() {
65 NodoLista recorrer=ini;
66 [Link]();
67 while(recorrer!=null) {
68 [Link]("[" + [Link] + "]------>;");
69
70
71
72
73
74
75 recorrer = [Link];
}
76 }
77
78 }
79
80
81
82
83
84
El código de esta clase solo contiene las funciones principales de insertar, borrar y mostrar. Sin embargo,
usted sera capaz de personalizar o agregar nuevos metodos.
Finalmente creamos una clase donde nos encargaremos de llamar a nuestros metodos creados y poner en
marcha todo el código:
1 package default;
2
import [Link];
3
4
public class ListaSimpleEnlazada {
5
6 public static void main(String[] args) {
7
8 Lista mylista=new Lista();
9
10 int select=0;
11 int dato_inicio;
12
do {
13
14
try {
15 select = [Link]([Link](null,
16 "1=Agregar elemento al inicio de la lista"
17 + "\n2=Agregar elemento al final de la lista"
18 + "\n3=Eliminar un elemento del inicio de la lista"
+ "\n4=Eliminar un elemento del Final de la lista"
19 + "\n5=Mostrar los datos de la lista"
20 + "\n6=Salir", "Menu de Opciones", 3));
21
22 switch(select) {
23
24 case 1:
25 try {
dato_inicio = [Link]([Link](null, "Inserta un elemen
26 "Insertando al inicio", 3));
27 [Link](dato_inicio);
28 }catch(NumberFormatException e) {
29 [Link](null, "Error" + [Link]());
30 }
break;
31
32
case 2:
33 try {
34 dato_inicio = [Link]([Link](null, "Inserta un elemen
35 "Insertando al final", 3));
36 [Link](dato_inicio);
}catch(NumberFormatException e) {
37 [Link](null, "Error" + [Link]());
38 }
39 break;
40
41 case 3:
dato_inicio = [Link]();
42 [Link](null, "El elemento eliminado es: " + dato_inicio,
43 "Eliminando nodo del inicio", JOptionPane.INFORMATION_MESSAGE);
44 break;
45
46 case 4:
47 dato_inicio = [Link]();
[Link](null, "El elemento eliminado es: " + dato_inicio,
48 "Eliminando nodo del Final", JOptionPane.INFORMATION_MESSAGE);
49 break;
50
51 case 5:
52 [Link]();
53 break;
54
case 6:
55 break;
56
57 default:
58 [Link](null, "Opcion Incorrecta");
59 }
60
}catch(NumberFormatException e) {
61 [Link](null, "Error" + [Link]());
62 }
63
64 }while(select!=6);
65
66 }
67
68 }
69
70
71
72
73
74
75
76
77
78
Si usted tiene un buen conocimiento en java le resultara facil entender el código, sino es asi ¡animo! siga
practicando y estudiando, pronto vera la luz al final del tunel.
Polimorfismo, esta palabra al principio puede sonar algo difícil pero realmente no es asi. El
polimorfismo se define como la capacidad de comportarse a un metodo de acuerdo a la instancia creada,
para que entiendas te explicare con un ejemplo en la vida cotidiana.
El metodo se comporta de manera diferente dependiendo de la clase con la cual esta interactuando,
debido a que cada clase implementa un comportamiento distinto.
Ejemplo:
supongamos que existe un metodo visitante(), este visitante tiene una serie de llamadas. Cuando te marca
tu madre o padre te vas a comportar de manera educada al contestar el telefono. Sin embargo, cuando un
amigo te marca te comportas de una manera no educada hablando no formal.
Digamos que tu madre y padre conforman una clase Padres y tu amigo esta dentro de una clase
Amigos. El metodo visitante() se comporta de manera diferente de acuerdo a la clase referenciada.
Ahora te mostrare otro ejemplo en código para que esto quede mas claro:
1
package polimorfismo;
2
3
public abstract class Operaciones {
4
5 protected int num1;
6 protected int num2;
7
8 public Operaciones() {
9 num1 = 10;
num2 = 5;
10 }
11
12 public abstract void operaciones();
13
14 }
15
La clase operación es nuestra superclase, dentro de ella definimos el metodo operaciones() como
abstracto al definir un metodo de esta forma le indicamos que va a tener diferente comportamiento,
importante mencionar que no siempre se utiliza abstract para hacer polimorfismo ya que puede estar
presente simplemente utilizando herencia y re-escribiendo los metodos.
1
package polimorfismo;
2
3 public class Suma extends Operaciones {
4
5 @Override
6 public void operaciones() {
7 int suma = num1 + num2;
[Link]("suma: " + suma);
8 }
9
10 }
11
Nuestra clase suma debe heredar de Operaciones, aqui aplicamos la frase «es un«. ¿La suma es un? es
una operación lo cual permite heredar de operaciones, cuando nosotros heredamos de esta clase
automaticamente el compilador marca error y aparece debido a que en la clase padre se ha definido un
metodo abstracto obligando a siempre re-escribir el metodo en nuestra subclase.
Lo explicado anteriormente puede aplicarse a una nueva clase en este caso llamada Multiplicación,
podrás observar que sucede lo mismo que la clase Suma.
1 package polimorfismo;
2
public class Multiplicacion extends Operaciones {
3
4
5 @Override
6 public void operaciones() {
7 int multiplicacion = num1 * num2;
8 [Link]("multiplicacion: " + multiplicacion);
}
9
10
}
11
Debemos poner en uso lo creado anteriormente, para ello debemos hacerlo utilizando la
claseMainOperaciones y haciendo referencia a las clases creadas:
1
2 package polimorfismo;
3
public class MainOperaciones {
4
5 public static void main(String[] args) {
6 Operaciones operacion;
7 operacion = new Suma(); // aqui se esta aplicando el polimorfismo
8 [Link](); //operacion suma
operacion = new Multiplicacion(); //polimorfismo
9 [Link](); //operacion multiplicacion
10 }
11
12 }
13
Es importante mencionar que una clase abstracta e interfaz no pueden ser instanciadas. Por este motivo
se ha creado una variable operación de tipo Operaciones (me refiero a la clase).
¿Como es posible crear una instancia?
Se puede lograr gracias al polimorfismo, como podrás observar la variable operación se comporta de
manera diferente, debido a la referencia realizada con distintas clases.
Como las variables num1 y num2 se han iniciado con valores 10 y 5, al ejecutar el metodo main nos
muestra los siguientes resultados:
suma: 15
multiplicacion: 50
Al principio el polimorfismo puede sonar algo complejo, pero mediante practica y entendiendo el porque
de las cosas veras lo facil de su implementación.
Pila, se podría decir que es como una lista enlazada pero a diferencia una pila tiene restricciones al igual
que una cola. Una pila funciona de manera contraria a una cola, sabemos que una cola funciona de
acuerdo a la siguiente frase: Primero en entrar, primero en salir. Entonces, ya podrías imaginar como
funciona una pila «Ultimo en entrar, primero en salir«.
Podrás crear una pila reutilizando el código de una lista enlazada aplicando herencia. Sin embargo, para
no complicar las cosas realizaremos el código desde cero.
Las pilas tienen una gran serie de aplicaciones, usted sera capaz de convertir expresiones regulares a
infija, posfija y prefija. Ademas, esta presente en todos los sistemas operativos ya que gracias a su gran
potencial permiten gestionar las llamadas de metodos que realizan los programas en ejecución.
Como es costumbre, el código que mostraremos mas adelante contiene los metodos básicos de una pila,
ejemplo: empujar, sacar, mostrar.
La variable auxiliar (recorrer) vendría siendo un amigo el cual te ayuda a detener los globos. Ahora
ambos estan agarrando los globos pero como tu amigo es la variable recorrer y suelta los globos «el ya
los perdio» pero tú aun estas sujetando.
Espero este ejemplo te ayude a entender de manera facil, realmente practicando y analizando el código
es como se aprende.
Las pilas son muy utilizadas por compiladores, pues estas permiten evaluar las expresiones aritméticas y
generar código a nivel de maquina. Realmente la estructura de datos es importante para aquellos que
estan empezando a desarrollar aplicaciones, ahora ya sabes como divertirte.
Finalmente, cabe mencionar que deberas crear un menu para utilizar los metodos.
Colas, otra estructura de datos muy interesante la cual tiene una gran serie de aplicaciones en el ambito
computacional, aunque esta tambien se implemente en la vida real y podemos notarlo en la fila que
hacemos al comprar tortillas o dentro de un super mercado. Una cola funciona mediante FIFO (primero
en entrar, primero en salir).
La cola en estructura de datos funciona de manera similar a una cola dentro de un super mercado,
cajero, banco, entre otros. A diferencia de una lista enlazada la cola no puede introducir datos en
cualquier punto, una cola siempre inserta los datos nuevos al final y elimina al inicio.
Ejemplo: cuando hacemos fila para comprar tortillas (tal vez no todos lo hacen pero creo la mayoría), si
la cola esta vacía obviamente usted sera el primero en llegar (aqui es donde entra en juego la variable
inicio que sera utilizada en el codigo), supongamos que rapidamente llega un cliente, este no puede ser
atendido primero que usted por ende espera al final de la cola y asi sucesivamente los nuevos clientes
que van llegando se colocan al final de la cola (se crea una variable fin que estará cambiando siempre
haciendo referencia al ultimo cliente que a llegado).
Le han despachado las tortillas ¿que pasa?, sale de la fila dando lugar al cliente que esta detrás de usted
(la variable inicio hacia referencia a usted antes de salir, al momento de salir ahora la variable inicio
debe hacer referencia al cliente que esta detrás de usted).
Como podrás observar, este tipo de estructura de datos tiene una gran serie de aplicaciones. Espero no
confundirlos con este ejemplo, pero he tratado de poner un ejemplo de la vida cotidiana esperando
entiendan de manera facil.
La clase Colas, para facilitar la lectura del código siempre se recomienda crear clases que contengan
diferentes partes del código. Esta clase contiene los metodos necesarios con las funciones de una cola.
1 package [Link];
2
public class Colas {
3
4
int tamanio;
5 NodoCola inicio, fin;
6
7 public Colas() {
8 inicio = fin = null;
9 }
10
public boolean estaVacia() {
11 return inicio == null;
12 }
13
14 public void insertarCola(int elemento) {
15 NodoCola nuevo = new NodoCola(elemento);
16 if (estaVacia()) {
inicio = nuevo;
17 } else {
18 [Link] = nuevo;
19 }
20 fin = nuevo;
tamanio++;
21 }
22
23 public int sacarCola() {
24 int auxiliar = [Link];
25 inicio = [Link];
26 tamanio--;
return auxiliar;
27 }
28
29 public void mostrarCola() {
30 NodoCola aux = inicio;
31 [Link]();
32 while (aux != null) {
[Link]("[" + [Link] + "]--->");
33 aux = [Link];
34
35
36
37
38 }
39 }
40
41 public int inicioCola() {
return [Link];
42 }
43
44 public int tamanioCola() {
45 return tamanio;
46 }
47
48 }
49
50
51
Realmente usted sera capaz de entender la logica detrás de esto, contiene el metodo sacarCola():
este se encarga de eliminar al primer dato, tomando como base el ejemplo de la cola al comprar tortillas,
el primero que esta en la fila sera eliminado.
inicio = [Link]
esta linea muestra lo que mencionaba anteriormente, supongamos que eres el primero en la fila y te han
despachado las tortillas, antes de salir la variable inicio esta haciendo referencia a ti. Pero al momento de
salir la variable inicio hace referencia al cliente que estaba detrás de ti (tomando tu lugar y siendo el
primero en la fila).
Para facilitarte aun mas las cosas, ahora te mostrare el código para usar los metodos mencionados
anteriormente:
1 package [Link];
2
import [Link];
3
4
public class MainColas {
5
6 public static void main(String[] atrgs) {
7
8 int opcion = 0, elemento;
9
10 Colas cola = new Colas();
11
12 try {
13
14 do {
15
opcion = [Link]([Link](null,
16 "1=Insertar un elemento a la cola"
17 + "\n2=Sacar un elemento de la cola"
18 + "\n3=¿La cola esta vacia?"
19 + "\n4=¿Que elemento esta en el inicio de la cola?"
20 + "\n5=Tamaño de la cola"
+ "\n6=Limpiar la cola"
21 + "\n7=Mostrando la colas"
22 + "\n8=Salir", "Menu de Opciones", 3));
23
24 switch (opcion) {
25
26 case 1:
27 elemento = [Link]([Link](nu
"Insertando al final", JOptionPane.INFORMATION_MES
28
29 [Link](elemento);
30 break;
31
32 case 2:
33 if (![Link]()) {
elemento = [Link]();
34
35
[Link](null, "El elemento sacad
36 "Sacando elemento de la cola", [Link]
37 } else {
38 [Link](null, "La cola esta vaci
39 "Cola vacia", JOptionPane.INFORMATION_MESSAGE)
}
40 break;
41
42 case 3:
43 if ([Link]()) {
44 [Link](null, "La cola esta vaci
45 "Cola vacia", JOptionPane.INFORMATION_MESSAGE)
} else {
46 [Link](null, "La Cola no esta v
47 "Cola contiene datos", [Link]
48 }
49 break;
50
case 4:
51 if (![Link]()) {
52 elemento = [Link]();
53 [Link](null, "El elemento que e
54 elemento,
55 "Mostrando elemento del inicio de la cola", JO
} else {
56 [Link](null, "La cola esta vaci
57 "Cola Vacia", JOptionPane.INFORMATION_MESSAGE)
58 }
59 break;
60
61 case 5:
elemento = [Link]();
62 [Link](null, "El tamaño de la cola
63 "Mostrando tamaño de la cola", [Link]
64 break;
65
66 case 6:
67 /*if(![Link]()) {
[Link]();
68 [Link](null, "La pila se ha vac
69 "vaciando pila", JOptionPane.INFORMATION_MESSA
70 }else {
71 [Link](null, "La pila esta vaci
72 "Pila Vacia", JOptionPane.INFORMATION_MESSAGE)
}*/
73 break;
74
75 case 7:
76 if (![Link]()) {
77 [Link]();
} else {
78 [Link](null, "La pila esta vaci
79 "Pila Vacia", JOptionPane.INFORMATION_MESSAGE)
80 }
81 break;
82
83 case 8:
[Link](null, "Aplicacion Finalizada
84 "Finalizando", JOptionPane.INFORMATION_MESSAGE);
85 break;
86
87 default:
88 [Link](null, "La opcion no esta en
89 "Incorrecta", JOptionPane.INFORMATION_MESSAGE);
}
90
91 } while (opcion != 8);
92
93 } catch (NumberFormatException e) {
94 [Link](null, "Error: " + [Link]());
95 }
96
}
97
98
}
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
La herencia, es una de las características mas importantes en la programación orientada a objetos debido
a que esta permite ahorrar código de manera considerable. Ademas, permite realizar el desarrollo de
software de una manera mas organizada.
Herencia, esta palabra dice de lo que trata y es que extends es una palabra reservada en java y me
permite heredar de otras clases. Sin embargo, no se puede heredar de cualquier clase ya que debe
aplicarse una regla (realmente solo es una frase). Antes de heredar usted debe preguntarse lo siguiente
«es un» y «tiene un«.
Ejemplo: Supongamos que se tiene la clase coche, aqui entran en juego las dos frase mencionadas
anteriormente.
¿El coche es un?
Asi es, espero hayas pensado lo mismo que yo. El coche es un vehículo y es aqui donde te das cuenta de
la utilidad de estas frases. Ahora que ya sabemos que el coche es un vehículo podemos aplicar la
siguiente frase.
En este caso la clase vehículo es nuestra superclase y la clase coche que hereda de vehículo es
nuestra subclase. Ahora pondre un ejemplo para aclarar el tema:
Primero creamos una clase nombrada Padre:
1
2
package herencia;
3
4
public class Padre {
5
6 public Padre(String apellido) {
7 [Link] = apellido;
8 setCasa("Casa");
9 }
10
public String getApellido() {
11 return apellido;
12 }
13
14 public void setCasa(String casa) {
15 [Link] = casa;
16 }
17
public String getCasa() {
18 return casa;
19 }
20
21 public String mensaje() {
22 return "Apellido: " + apellido;
23 }
24
private String casa;
25 private String apellido;
26
27 }
28
29
El padre es nuestra superclase y este tiene como atributo (propiedad) una casa la cual va a heredar su
hijo (en este caso la clase hereda de padre). A continuación se crea la clase hijoDePadre este hijo hereda
la casa de su padre, ademas ahora el hijo puede tener sus propios atributos (propiedades o cosas
materiales, como lo quieras ver).
El hijo se ha comprado un coche, por ende esta propiedad se agrega a la clase.
1
2
package herencia;
3
4
public class hijoDePadre extends Padre {
5
6 public hijoDePadre(String apellido, int edad) {
7 super(apellido);
8 [Link] = edad;
9 setCoche("Coche");
}
10
11 public void setCoche(String coche) {
12 [Link] = coche;
13 }
14
15 public String getCoche() {
return coche;
16 }
17
18 @Override
19 public String mensaje() {
20 return [Link]() + " Edad: " + edad;
21 }
22
private String coche;
23 private int edad;
24
25 }
26
27
Sin embargo, como la clase padre recibe por parametro un apellido (se puede decir que el hijo esta
heredando el apellido) por lo cual debemos especificar en nuestra clase hijoDePadre un constructor que
pase por parametro el apellido (el cual heredo del padre) mas otros valores que deseemos agregar (en
este caso la edad).
La palabra reservada super me permite llamar al constructor o metodos de clase que estoy heredando, en
este caso nosotros vamos a llamar el metodo mensaje y al constructor de la clase Padre.
Podemos observar que cuando ponemos un punto delante de super (ejemplo: [Link]()) le
indicamos que estamos llamando al metodo de la clase que estamos heredando y si solamente ponemos
la palabra super acompañada de parentesis indicamos la llamada al constructor de la clase Padre
(ejemplo: super(apellido)).
Por un lado la llamada al constructor padre me permite iniciar los valores de las variables (en este caso la
variable apellido, permitiendo llamar al metodo mensaje de la clase padre (esto hace que nuestra variable
apellido no devuelva un valor nulo). Sino llamas al constructor padre el propio compilador te indicara un
error).
Ahora creamos la clase HijoDeHijoDePadre, podría sonar raro. Pero traduciendo un poco al español, la
clase padre se convierte en abuelo, la clase hijoDePadre se convierte en padre, espero no confundirte
(pero podrías pensarlo como en la vida real y entenderas).
1
2 package herencia;
3
4 public class hijoDeHijoDePadre extends hijoDePadre {
5
6 public hijoDeHijoDePadre(String nombre, int edad) {
super(nombre, edad);
7 setXbox("Xbox");
8 }
9
10 public void setXbox(String xbox) {
11 [Link] = xbox;
}
12
13
public String getXbox() {
14 return xbox;
15 }
16
17 private String xbox;
18
19 }
20
Esto podrás entenderlo con las explicaciones que he realizado hasta el momento, finalmente solo
creamos la clase para usar los metodos creados:
1
2 package herencia;
3
public class HerenciaMain {
4
5 public static void main(String[] args) {
6
7 hijoDeHijoDePadre heredo = new hijoDeHijoDePadre("Ramirez", 20);
8
9 [Link]("El hijo de apellido " + [Link]() +
10 "heredo del abuelo una: " + [Link]() + ", del padre un: "
+ [Link]() + " y la unica pertenencia propia es: " + heredo
11 [Link]("Mensaje=> " + [Link]());
12
13 }
14
15 }
16
Me olvidaba de decir que la palabra reservada extends hace posible la herencia, ya que permite
extender los atributos de una clase.
[Link]/
Sin embargo, la manera que explicare sobre como instalar java 3d funciona para cualquier sistema
operativo y ademas explicare como instalar la documentación.
Como primer paso, debemos descargar las librerías y documentación de java 3d mediante los siguientes
enlaces:
Ahora podemos observar que aparece una nueva librería llamada Java3D, seleccionamos esta librería y
presionamos la pestaña «Classpath«, presionaremos el botón «Add JAR/Folder…» y seleccionamos
los archivos .JAR.
El ultimo paso es muy similar a como agregar los .JAR, en este caso nos posicionamos en la pestaña
«Javadoc» y agregamos el archivo .zip que contiene la documentación.
Para poder visualizar la documentación al codificar, es importante tener el plugin nb-javac
Library instalado. Para instalarlo, debe abrir:
Tools (herramientas) – Plugins
Se abrira una nueva ventana, aquí debemos seleccionar la pestaña «Available Plugins (plugins
disponibles)» marcamos el plugin nb-javac Library y presionamos «install (instalar)«.
PD, como ya lo he instalado no me aparece en la pestaña plugins disponibles, pero si aparece en la
pestaña de instalados:
Para poder usar esta nueva librería en nuestros proyectos, nosotros debemos agregarla de forma manual.
Podemos abrir cualquier proyecto y sobre la carpeta «Libraries (librerías)» presionar clic derecho y
«Add Library (Agregar libreria)»
Se abrira una ventana donde se mostraran todas las librerías existentes, aquí solo debemos buscar la que
hemos creado «Java3D» y presionar el botón «Add Library (Agregar libreria)«.
Listo, ahora puedes comenzar a utilizar todas las clases disponibles en java 3d.
Sabemos que la pagina de netbeans nos ofrece un instalar .DMG en fase experimental, por esta razón no
recomiendo realizar la instalación de esta forma. Otra de las opciones, es descargar el archivo bin el cual
simplemente debe ser extraído y podrá ejecutar netbeans sin problemas.
Sin embargo, esto puede resultar molesto si usted trabajo frecuentemente con netbeans. Ya que debe
ejecutar el archivo bin para iniciar el IDE.
Afortunadamente existe otra manera y una de las mejores para instalar netbeans actualmente tanto en
mac como en linux. Este proyecto es conocido como NetBeans MacOS Bundle y cuenta con una serie
de archivos con extensión .SH que permiten realizar la instalación de netbeans de manera realmente
sencilla. Cabe mencionar, que mediante los archivos usted descargara el instalador netbeans en su
versión final de la web oficial y automáticamente sera instalado. Ademas, podrá ver la [Link] en
su carpeta de aplicaciones.
Antes de instalar la ultima versión de netbeans, recomiendo desinstalar versiones antiguas e incluso
recomiendo eliminar la carpeta nombrada «netbeans» que se encuentra dentro de la carpeta aplicaciones
de MacOS.
El primer paso es descargar los archivos del proyecto NetBeans MacOS Bundle mediante el siguiente
enlace (estos archivos me permitirán descargar e instalar la ultima versión de netbeans):
Ver Link
Una vez descargado el archivo, debes descomprimirlo. Posteriormente dejara una carpeta, recomiendo
mover esta carpeta al escritorio para que sea fácil acceder mediante el terminal. Tras mover la carpeta a
una ruta de acceso fácil, ahora debemos ejecutar el terminal y cambiarnos al directorio del proyecto.
En mi caso yo moví la carpeta al escritorio, por lo que aplique los siguientes comandos para acceder a la
carpeta (el comando ls muestra los archivos que contiene la carpeta):
Ahora que nos hemos posicionado sobre el directorio, podemos observar que existe un archivo llamado:
Pensaras que ya todo esta listo, pero no. Aun queda un paso muy breve, debemos activar las
siguientes herramientas en netbeans para poder comenzar a crear y ejecutar proyectos. no hace falta
descargar las herramientas, debido a que netbeans las tiene por defecto. Como mencione anteriormente,
solo debe activarlas.
Se me olvidaba comentar, también puede modificar el archivo [Link]. Y cambiar el link de descarga
de netbeans (usar algún otro ofrecido por la pagina oficial).
Los beneficios de cambiar dicho enlace, es que podrás asegurarte de descargar la ultima versión.
Ademas, puede ocurrir que algún link deje de funcionar. Por lo que, viene bien saber modificar el enlace
para descargar.
Espero te sea de gran ayuda e instales apache netbeans sin problemas en tu sistema operativo macos.