tag:blogger.com,1999:blog-91161024495269223322024-03-13T03:43:21.484-07:00Dato JavaProgramación en java, buenas practicas. JBoss, JUnit, logs, herramientas de software. Tutoriales y Tips.Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.comBlogger56125tag:blogger.com,1999:blog-9116102449526922332.post-65678973466153470452016-08-30T13:54:00.000-07:002016-08-30T13:54:11.401-07:00<html>
<head>
JScrollBar y JTextArea SWING, scroll arriba.</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
JScrollBar y JTextArea SWING, scroll arriba, después de agregar un texto setear el Scroll al principio.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br />
<article>
Un pequeño <strong>Dato Java</strong>, hay un problemita que ocurre cuando estamos trabajando con <strong>Swing</strong>, específicamente con el <code class="codigo">JScrollBar</code> y <code class="codigo">JTextArea</code>. Supongamos que a este <code class="codigo">JTextArea</code> al presionar un botón le seteamos un texto grande el cual hace que por default el scroll baje y para visualizar el contenido desde el principio tenemos que subir el scroll, bueno ese comportamiento no es el adecuado ya que es fastidioso tener que mover el scroll hacia arriba para visualizar el contenido.
<br>
<br>
Para solucionar ese problema y que el scroll del <code class="codigo">JTextArea</code> siempre este arriba solo tenemos que setear esto:
<pre class="brush: java; toolbar: false;">
JTextArea.setCaretPosition(0);
</pre>
<center>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<br>
Pequeños datos que pueden ahorrarte un montón de tiempo. Suerte!!
</article>
<br/>
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html" target="_blank"><strong>Tutorial de Aplicación Java Swing, ejemplo simple y sencillo.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/11/vaciarQuitarDatosDefaultTableModel.html" target="_blank"><strong>Vaciar DefaultTableModel JTable Swing.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/11/jcalendarJavaSwingEjemploTutorial.html" target="_blank"><strong>JCalendar Java Swing Tutorial.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/11/jlabelGradientBackgroundEjemplo.html" target="_blank"><strong>JLabel gradient background.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>
Anonymoushttp://www.blogger.com/profile/08756167057085960841noreply@blogger.com1tag:blogger.com,1999:blog-9116102449526922332.post-80727867508965904152016-08-11T10:59:00.000-07:002016-08-11T10:59:30.865-07:00 Que es un HashSet y cómo funciona<html>
<head>
<title>
Que es un HashSet y cómo funciona. </title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Que es un HashSet y cómo funciona.
</h1>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi77C83MubOiF_jx0OmaMoGZm75b1dpVDcdDsZhyphenhyphenK0pLxlPq0a52WF7cuop_2E_8WlQ2_7emqQE31O_9-xOoxvJrG_YJS9rSpNa4E8ThsRMQNcxoYCX6KRoafleWoiYOYKa9j6cUJNaLB8/s400/HashSetDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="HashMap DatoJava" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi77C83MubOiF_jx0OmaMoGZm75b1dpVDcdDsZhyphenhyphenK0pLxlPq0a52WF7cuop_2E_8WlQ2_7emqQE31O_9-xOoxvJrG_YJS9rSpNa4E8ThsRMQNcxoYCX6KRoafleWoiYOYKa9j6cUJNaLB8/s400/HashSetDatoJava.png">
</a>
</figure>
</div>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br />
<article>
Siguiendo un poco con la temática de la <code class="codigo">Collection</code> framework, este es un topic muy interesante, como ya sabemos hay varias interfaces en este framework, el <code>HashSet</code> es una de las implementaciones de la <div class="tooltip"><strong>Set</strong><span class="tooltiptext">Forma parte de la <code class="codigo">Collection</code> framework y básicamente lo que quiere decir es que en un <strong>Set</strong> solo puede existir un objeto, no pueden haber objetos repetidos.</span></div> interface. Para crear un <code>HashSet</code> solo tenemos que hacerlo de esta manera:
<pre class="brush: java; toolbar: false;">
// Un HashSet simple de String
HashSet<String> hashSet = new HashSet<String>();
</pre>
Simple no, bueno detrás de ese código, si vamos un poco más allá podemos ver que el código de ese constructor es así:
<pre class="brush: java; toolbar: false;">
public HashSet() {
map = new HashMap<>();
}
//Donde "map" esta declarado asi
HashMap<E,Object> map;
</pre>
Aquí ya vemos que algo está un poco extraño, sorpresa, como es que un <code>HashSet</code> que implementa la interface <code class="codigo">Set</code> en su implementación tiene un <code>HashMap</code> que implementa la interface <code class="codigo">Map</code>?? Bueno algo muy sencillo, como les venía diciendo al principio del articulo un <code>HashSet</code> no permite objetos repetidos y los ingenieros de Java para asegurarse de que no pudiéramos ingresar objetos repetidos decidió utilizar un <code>HashMap</code> internamente el cual tampoco permite objetos repetidos, por que lo hicieron así?? Porque pueden, es algo confuso, pero funciona muy bien y reutilizan el código.
<br>
<br>
Deberías leer: <a href="http://datojava.blogspot.com/2016/07/queEsHashMapYComoFunciona.html" target="_blank"><strong>Que es un HashMap y como funciona.</strong></a>
<br>
<br>
Una vez creado el <code>HashSet</code>, vamos a comentar un poco sus métodos mas importantes, supongamos que queremos agregar un conjuntos de personas al <code>HashSet</code>, lo hacemos así:
<pre class="brush: java; toolbar: false;">
hashSet.add("Pedro");
hashSet.add("Pepe");
hashSet.add("Luis");
System.out.println("HashSet= " + hashSet);
</pre>
Si corremos el ejemplo veremos la salida en la consola:
<pre class="brush: plain; toolbar: false;">
HashSet= [Pedro, Pepe, Luis]
</pre>
Si analizamos el método <code class="codigo">add()</code>, vemos que este es su código:
<pre class="brush: java; toolbar: false;">
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
// Donde "PRESENT" es
Object PRESENT = new Object();
</pre>
Este método devuelve un <code class="codigo">boolean</code>, si el objeto se agrega al <code>HashSet</code> devuelve <code class="codigo">true</code> si no <code class="codigo">false</code>, como ya sabemos, internamente esto funciona como un <code>HashMap</code>, cuando agregamos un objeto en un <code>HashMap</code> si ese objeto ya está agregado devuelve el valor anterior de esa key pero si el objeto no está y se agrega al <code>HashMap</code> devuelve null, entonces lo que hace el método <code class="codigo">add()</code> es evaluar que devuelve y así se sabe si agrega o no el objeto. Podemos utilizar el <code class="codigo">boolean</code> que devuelve el método para ejecutar algún código, por ejemplo:
<pre class="brush: java; toolbar: false;">
boolean b = hashSet.add("Luis");
if(b){
// Se agrego correctamente
// code
}else{
// Ya esta en el HashSet
// code
}
</pre>
Como ya "Luis" está en el <code>HashSet</code> el metodo <code class="codigo">add()</code> devuelve <code class="codigo">false</code> y podríamos hacer algo en ese caso.
<br>
Si necesitamos eliminar un objeto del <code>HashSet</code> lo hacemos así:
<pre class="brush: java; toolbar: false;">
hashSet.remove("Luis");
// Codigo del metodo remove()
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
</pre>
La misma teoría del método <code class="codigo">add()</code>.
<br>
Como obtener un objeto del <code>HashSet</code>? Si estás acostumbrado a utilizar <code>ArrayList</code>, <code>HashMap</code>, <code>Arrays</code> puedes asumir que también se puede obtener un determinado objeto de un <code>HashSet</code> y no es así, el <code>HashSet</code> no posee un método para obtener un determinado objeto. Según mi punto de vista esto no es que este mal porque puedes resolverlo de varias maneras, en realidad no es necesario un metodo <code class="codigo">get()</code>, de la manera más sencilla desde mi punto de vista sería así:
<pre class="brush: java; toolbar: false;">
if(hashSet.contains("Pepe")){
// Se supone que si esta el objeto y podriamos sustituir el metodo get()
// code
}
</pre>
Preguntando si un determinado objeto está en el <code>HashSet</code> podríamos sustituir el método <code class="codigo">get()</code> ya que asumiríamos que el objeto si esta. También podemos iterar el <code>HashSet</code> de esta manera:
<pre class="brush: java; toolbar: false;">
for (Iterator<String> iterator = hashSet.iterator(); iterator.hasNext();) {
String nombre = iterator.next();
if (nombre.equals("Pedro")){
// code
}
}
</pre>
Esta manera también es válida pero gasta más recursos en comparación con el método <code class="codigo">contains()</code>. Otra manera puede ser pasando el HashSet a un ArrayList:
<pre class="brush: java; toolbar: false;">
ArrayList<String> arrayList = new ArrayList<String>(hashSet);
String nombre = arrayList.get(2);
</pre>
También es válida pero sigo quedándome con la primera opción.
<center>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
Caracteristicas del <code>HashSet</code>:
<ul>
<li type="circle">Solo almacena objetos.</li>
<li type="circle">No permite objetos duplicados.</li>
<li type="circle">Solo permite un objeto <code>null</code></li>
<li type="circle">Implementa la <code class="codigo">Set</code> interface.</li>
<li type="circle">No garantiza ningún tipo de orden al insertar los objetos.</li>
<li type="circle">Es un wrapper de <code>HashMap</code>.</li>
</ul>
Ese es básicamente el funcionamiento del <code>HashSet</code>, tienes que ver dependiendo de la necesidad que componente utilizar, ya eso queda de tu parte pero te recomiendo que utilices <code>HashSet</code> si no quieres almacenar objetos repetidos, si eso no importa deberías utilizar <code>HashMap</code> ya que el <code>HashSet</code> es solo un <div class="tooltip"><strong>wrapper</strong><span class="tooltiptext">Una clase <strong>wrapper</strong> es una clase que encapsula tipos de datos, de modo que esos tipos de datos pueden utilizarte para crear instancias en otra clase que necesita los mismos, en este caso HashSet utiliza internamente <code>HashMap</code>.</span></div> de <code>HashMap</code>. Recuerda comentar si necesitas que agregue algo más a esta entrada o si tienes alguna duda.
<br>
<br>
Suerte!!
</article>
<br/>
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/05/diferenciaEntreThrowyThrowsEnJava.html" target="_blank"><strong>Diferencias entre throw y throws en Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/08/polimorfismoJava.html" target="_blank"><strong>Polimorfismo en Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2016/08/diferenciaEntreHashmapyHashtable.html" target="_blank"><strong>Diferencia entre HashMap y Hashtable.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/08/diferenciaEntreOverrideVSOverload.html" target="_blank"><strong>Diferencia entre Override y Overload.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>
Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-63214898218615408772016-08-04T11:18:00.000-07:002016-08-04T11:18:36.011-07:00Diferencia entre HashMap y Hashtable Java. <html>
<head>
<title>
Diferencia entre HashMap y Hashtable en Java. </title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Diferencia entre HashMap y Hashtable en Java
</h1>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7FV7WJ3q1B5RBDS1K0tE4W2nkjHz6WavWJHNRWoYAbDQ5PKpAhR9A9OjDbUxMLEfDmz6BLo6JPJxO37y0xLHx2cvbxUgohbvKfTGtcLFYJM6RkEM21vzoc_V-pPCFeEO8QpZZFoLGJYA/s1600/HashMapVSHashtable.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="HashMap DatoJava" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7FV7WJ3q1B5RBDS1K0tE4W2nkjHz6WavWJHNRWoYAbDQ5PKpAhR9A9OjDbUxMLEfDmz6BLo6JPJxO37y0xLHx2cvbxUgohbvKfTGtcLFYJM6RkEM21vzoc_V-pPCFeEO8QpZZFoLGJYA/s1600/HashMapVSHashtable.gif" />
</a>
</figure>
</div>
<hr />
</div>
</header>
<br />
<div align="justify">
<br />
<article>
Seguimos con preguntas de entrevistas, hay que recordar que la oportunidad que estás buscando puede que sea la entrevista que tienes mañana, lo que quiere decir que probablemente estas preparándote y quieres que todo salga bien, pero una pregunta tan sencilla como esta puede dejarte de lado si no sabes responderla con la seguridad de que sabes que lo que dices es cierto.
<br />
Estas dos estructuras de datos son muy similares, pero también tienen algunas diferencias muy notables, haciendo una breve introducción, los dos son estructuras de datos muy usados en el <strong>Collection</strong> framework.
<br />
<br />
Te puede interesar: <a href="http://datojava.blogspot.com/2016/07/queEsHashMapYComoFunciona.html" target="_blank"><strong>Que es un HashMap y como funciona.</strong></a>
<br /><br />
Diferencias:
<ul>
<li type="circle">El <code class="codigo">HashMap</code> solo permite un null key y cualquier cantidad de null values, en cambio un <code class="codigo">Hashtable</code> no permite ningún null ya sea en key o en value.</li><a name='more'></a>
<li type="circle">Thread Safe, <code class="codigo">Hashtable</code> es ideal para usarlo en aplicaciones multi threaded (multi hilos), internamente todos sus métodos son synchronized a diferencia del <code class="codigo">HashMap</code> que no es recomendable en aplicaciones multi threaded.</li>
<li type="circle">La diferencia anterior nos lleva al performance, ¿cual tiene mejor rendimiento? Todos los componentes, estructuras de datos, variables... que no sean syncronized tienen un mejor performance que las que lo son, lo que quiere decir que en cuestiones de rendimiento es mejor utilizar un <code class="codigo">HashMap</code>.</li>
<li type="circle">Que es lo que más se utiliza, últimamente se ha usado más <code class="codigo">HashMap</code> sobre <code class="codigo">Hashtable</code>, eso tiene una razón, <code class="codigo">Hashtable</code> es <div class="tooltip">
legacy class<span class="tooltiptext">legacy class en Java: se dice que una clase es legacy class porque ya no es compatible con las nuevas tecnologías, el hecho de que una clase allá sido creada por un ingeniero de Java no quiere decir que esta bien diseñada y que va ser escalable, de hecho, el HashMap puede hacer todo lo que hace un Hashtable, siempre es recomendable en estos momentos de Java 8, que utilicemos HashMap sobre Hashtable por esa razón.</span></div>
, y por esa razón es preferible utilizar HashMap.</li>
</ul>
Aparte de las diferencias entre los dos, también poseen similitudes entre si:
<ul>
<li type="circle">Las dos implementan la Interface <code class="codigo">Map</code>.</li>
<li type="circle">No garatizan ningún orden al momento de insertar información.</li>
<li type="circle">Trabajan bajo el <div class="tooltip">
<strong>principio del hashing</strong><span class="tooltiptext">El principio se basa en asignar una ubicación para cierta key, dependiendo de una key determinada se le asigna un id único, en este caso se utiliza la función <strong>hashCode()</strong> la cual heredan todos los objetos en Java, algo importante de resaltar es que un objeto solo retornara un id, lo que quiere decir que si invocamos el hashcode con otro objeto idéntico devolverá el mismo id.</span></div>
</li>
</ul>
<center>
<script async="" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle" data-ad-client="ca-pub-9352598088641935" data-ad-slot="6053448801" style="display: inline-block; height: 60px; width: 468px;"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<br />
Ya es decisión de los ingenieros como crear los proyectos, siempre es bueno saber las diferencias entre uno y otro porque puede que trabajes en un proyecto que ya utilicé <code class="codigo">Hashtable</code> y de verdad no tienes idea cual es la diferencia y por qué utilizan uno o el otro. No olvides comentar si te gusto la entrada, suerte!!
</article>
<br />
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2016/07/queEsHashMapYComoFunciona.html" target="_blank"><strong>Que es un HashMap y como funciona.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/05/diferenciaEntreThrowyThrowsEnJava.html" target="_blank"><strong>Diferencias entre throw y throws en Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/08/diferenciaEntreOverrideVSOverload.html" target="_blank"><strong>Diferencia entre Override y Overload.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/08/polimorfismoJava.html" target="_blank"><strong>Polimorfismo en Java.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>
Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-79402284309247268142016-07-20T16:00:00.000-07:002016-08-04T16:00:19.018-07:00Que es un HashMap y cómo funciona<html>
<head>
<title>
Que es un HashMap y cómo funciona. </title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Que es un HashMap y cómo funciona.
</h1>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5G-mTz_8sfpPO87_9Cn-tS4Bsvvun2HXdNmXJTIMV-Wfrlz_Yt3NFShwOCqywFmGDj63DUiHAyBy6ktQco3zN2nxiqsomtE-iNHbvdfYna0oeoJDEO___bPZBz3Bg8LsY8wHpWSm1QpY/s1600/HashMapDJ.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="HashMap DatoJava" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5G-mTz_8sfpPO87_9Cn-tS4Bsvvun2HXdNmXJTIMV-Wfrlz_Yt3NFShwOCqywFmGDj63DUiHAyBy6ktQco3zN2nxiqsomtE-iNHbvdfYna0oeoJDEO___bPZBz3Bg8LsY8wHpWSm1QpY/s1600/HashMapDJ.png">
</a>
</figure>
</div>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br />
<article>
Pregunta fija para una entrevista, a veces trabajamos con HashMap pero no sabemos en realidad el concepto del mismo y menos como funciona internamente. Un <strong>HashMap</strong> es la implementación de la interface <strong>Map</strong>, esta interface es un tipo de <div class="tooltip"><strong>Collection</strong><span class="tooltiptext">Una <strong>Collection</strong> es una interface que agrupa un conjunto de elementos.</span></div> que almacena datos asociando una <div class="tooltip">llave a un valor<span class="tooltiptext">Map<key, value>. key= la llave. value= String, Integer, Boolean...</span></div>, esta interface sirve para muchas cosas y tiene ciertas caracteristicas que la definen, por ejemplo, no permite key duplicados, cada key tiene que estar asociado a un valor como máximo, si agregas un key que ya existe sobrescribe el valor del key anterior, solo permite Object types lo que quiere decir que no puedes poner un valor primitivo...
<br>
Volviendo al tema casi siempre se utiliza el HashMap como implementación del Map pero tiene sus cosas, por ejemplo, no garantiza que los elementos que vamos agregando estén ordenados, no deberíamos usarla en aplicaciones multithread porque no es synchronized, pero como todo en el mundo de Java, esto se puede lograr con unas líneas de código.
<br>
<br>
El HashMap funciona con el <div class="tooltip"><strong>principio del hashing</strong><span class="tooltiptext">El principio se basa en asignar una ubicación para cierta key, dependiendo de una key determinada se le asigna un id único, en este caso se utiliza el método <strong>hashCode()</strong> el cual heredan todos los objetos en Java, algo importante de resaltar es que un objeto solo retornara un id, lo que quiere decir que si invocamos el hashcode con otro objeto idéntico devolverá el mismo id.</span></div>, como ya explique trabaja asignando una ubicación a una key con el método <code class="codigo">hashCode()</code> de Java.
<br>
<br>
Comenzando desde el principio, así podemos crear un HashMap:<br>
<pre class="brush: java; toolbar: false;">
// Un HashMap simple de llave String y valor Integer.
HashMap<String, Integer> hashMapEdad = new HashMap<String, Integer>();
</pre>
El constructor del HashMap que invocamos automáticamente le asigna <a name='more'></a> la <div class="tooltip">capacidad<span class="tooltiptext">La capacidad o tamaño inicial del HashMap va ser 16.</span></div> y el <div class="tooltip">load factor<span class="tooltiptext">El load factor por defecto es 0.75, este valor indica que ese es el máximo de items que puede tener un HashMap dependiendo de su capacidad, por ejemplo, si la capacidad es 100 solo puede tener 75 items, en el caso de aumentar a 76 ítems la capacidad automáticamente aumenta al doble.</span></div>.
<pre class="brush: java; toolbar: false;">
/**
* Constructs an empty <tt>HashMap</tt> with the default initial capacity
* (16) and the default load factor (0.75).
*/
public HashMap() {
this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
}
</pre>
En el ejemplo vamos a utilizar un HashMap para guardar la edad de ciertas personas, tenemos a Pedro, Pepe y Jose, vamos agregarlos para ver cómo funciona el HashMap internamente:
<pre class="brush: java; toolbar: false;">
// Con el metodo put() agregamos un item al HashMap.
hashMapEdad.put("Pedro", 21);
</pre>
Este es el código del método put():
<pre class="brush: java; toolbar: false; highlight: [2, 7,8,9]">
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
</pre>
Explicando el método <code class="codigo">put()</code> al agregar a Pedro:<br>
<ul>
<li type="circle">Línea 2: como el HashMap está vacío se inicia la <div class="tooltip">lista<span class="tooltiptext">Un HashMap internamente es una lista.</span></div>, se le asigna el tamaño y el límite de ítems que pueden haber.</li>
<li type="circle">Línea 7: se calcula el hash de esta key con el método <code class="codigo">HashCode()</code>.</li>
<li type="circle">Línea 8: con el hash se calcula un índice en el hashMap para esta key.</li>
<li type="circle">Línea 9: esta es la parte más complicada, como mencione anteriormente en el tooltip del "principio del hashing", dos objetos idénticos tendrán el mismo id retornado por el método <code class="codigo">hashCode()</code>, como en la linea 8 se calcula el índice en donde va a ir el item puede ocurrir una colision si calculamos índices con el mismo id, la solución que implementa el metodo <code class="codigo">put()</code> para esto es la clase anidada <code class="codigo">Entry</code> que posee HashMap, esta clase contiene un atributo de tipo <code class="codigo">LinkedList</code> el cual se utiliza para agregar los ítems como si de una LinkedList se tratará, lo que funcionará para obtener el valor si hay una colision en el HashMap.</li>
<li type="circle">Después de toda esa lógica se procede agregar el ítem al HashMap.</li>
</ul>
Suponiendo que ya agregamos a "Pepe" y a "Jose":
<pre class="brush: java; toolbar: false;">
hashMapEdad.put("Pepe", 35);
hashMapEdad.put("Jose", 15);
</pre>
Y ahora queremos obtener la edad de "Pepe", es prácticamente el mismo concepto del método <code class="codigo">put()</code>, solo que invocamos el método <code class="codigo">get(key)</code> pasándole como parámetro la key, en este caso el nombre de la persona de la cual queremos obtener la edad y este internamente busca el hash de la key y retorna el valor.
<pre class="brush: java; toolbar: false;">
// Obtener la edad de Pepe
int edad = hashMapEdad.get("Pepe");
</pre>
Esto retorna la edad de "Pepe". Muchas veces necesitamos recorrer un HashMap y podemos hacerlo de varias maneras, pero la que yo recomiendo por sencillez y facilidad es con el bucle <code class="codigo">foreach</code>:
<pre class="brush: java; toolbar: false;">
for(String key: hashMapEdad.keySet()){
System.out.println(key + " tiene " + hashMapEdad.get(key) + " años de edad.");
}
</pre>
Esto imprime:<br>
<pre class="brush: plain; toolbar: false;">
Pedro tiene 21 años de edad.
Jose tiene 15 años de edad.
Pepe tiene 35 años de edad.
</pre>
Como se puede observar en la salida de la consola los resultados no están ordenados, para ordenar un HashMap podemos utilizar <code class="codigo">TreeMap</code> de esta manera.
<pre class="brush: java; toolbar: false;">
TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>(hashMapEdad);
for (String key : treeMap.keySet()) {
System.out.println(key + " tiene " + treeMap.get(key) + " años de edad.");
}
</pre>
Esto imprime:
<pre class="brush: plain; toolbar: false;">
Jose tiene 15 años de edad.
Pedro tiene 21 años de edad.
Pepe tiene 35 años de edad.
</pre>
Para pasar los keys o valores de un HashMap a un ArrayList:
<pre class="brush: java; toolbar: false;">
ArrayList<String> keyList = new ArrayList<String>(hashMapEdad.keySet());
ArrayList<Integer> valueList = new ArrayList<Integer>(hashMapEdad.values());
</pre>
Si en algún momento queremos hacer que un HashMap sea synchronized:
<pre class="brush: java; toolbar: false;">
Map map= Collections.synchronizedMap(hashMapEdad);
</pre>
Esto hace que todos los métodos del HashMap sean synchronized y por ende se pueda usar en aplicaciones multithread. Este pequeño repaso siempre cae bien, tanto para el trabajo, estudio como para una entrevista, si tienes alguna duda, quieres que agregue algo interesante o importante al artículo no dudes en dejar tu comentario, suerte.
<center>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
</article>
<br/>
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2014/08/concurrentmodificationexception.html" target="_blank"><strong>java.util.ConcurrentModificationException. Solucionado.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/07/depurarAplicacionJava.html"><strong>Como depurar (debug) una aplicación en Java</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/02/junitMatchersHamcrestTutorial.html" target="_blank"><strong>JUnit Matchers Tutorial. Hamcrest lib.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>
Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com4tag:blogger.com,1999:blog-9116102449526922332.post-68190854727283587292015-11-23T14:57:00.000-08:002016-06-03T14:55:25.312-07:00JLabel gradient background.<html>
<head>
<title>
JLabel gradient background.
</title>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Realizar JLabel con color de fondo gradiente.
</h1>
</div>
<hr/>
</header>
<br/>
<div align="justify">
<br/>
<article>
Algo que se ve muy bien en las aplicaciones de escritorio en Java, son los titulos con un color de fondo gradiente (<strong>JLabel Gradient Background</strong>), para hacerlo solo hay que sobreescribir el metodo <code class="codigo">void paintComponent(Graphics g)</code> de la clase <code class="codigo">JComponent</code>, recuerda que esta es la clase base para los componentes <strong>SWING</strong>.<br/>
Para lograr un color de fondo gradiente horizontal:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtLYdGGSoOSHoSCNSIjHGr0K1CYiWkkaHJYomGRq3VCxP6aW1Pr0WHCyQ62xXDl5T-WuxL3QBQuC2nGAfiF_nKwEDRoJqPZ3HMUylrzqtvPzDTrBIyRZZIneImIQCsjPFC6fw0gf0vGyU/s1600/JLabelGradientDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JLabel gradient background horizontal" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtLYdGGSoOSHoSCNSIjHGr0K1CYiWkkaHJYomGRq3VCxP6aW1Pr0WHCyQ62xXDl5T-WuxL3QBQuC2nGAfiF_nKwEDRoJqPZ3HMUylrzqtvPzDTrBIyRZZIneImIQCsjPFC6fw0gf0vGyU/s1600/JLabelGradientDatoJava.png">
</a>
<figcaption>
JLabel Gradiente
</figcaption>
</figure>
</div>
Hay que implementar este codigo:
<pre class="brush: java; toolbar: false;">
JLabel label = new JLabel("...... DatoJava ......") {
@Override
protected void paintComponent(Graphics g) {
Color colorFinal = new Color(255, 1, 1);
Graphics2D graphics2d = (Graphics2D) g.create();
graphics2d.setPaint(new GradientPaint(0, 0, getBackground(),
getWidth(), 0, colorFinal));
graphics2d.fillRect(0, 0, getWidth(), getHeight());
graphics2d.dispose();
super.paintComponent(g);
}
};
</pre>
Para lograr un color de fondo gradiente vertical:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyBcD0EUfUYZF0AfkS_mXRNxd2_NBFyvxadPH23hhEto81bLEmbcnMKJ4_YPIgCJSZ-VlThSspOIjyCKByI8LMBCapyVQuC8755Ytpnn89YpHDxhKRqT5S4S8rPKRgyENNbJ8EzG5EPz4/s1600/JLabelGradientDatoJava2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JLabel gradient background Vertical" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyBcD0EUfUYZF0AfkS_mXRNxd2_NBFyvxadPH23hhEto81bLEmbcnMKJ4_YPIgCJSZ-VlThSspOIjyCKByI8LMBCapyVQuC8755Ytpnn89YpHDxhKRqT5S4S8rPKRgyENNbJ8EzG5EPz4/s1600/JLabelGradientDatoJava2.png">
</a>
<figcaption>
JLabel Gradiente
</figcaption>
</figure>
</div>
Hay que implementar este codigo:
<pre class="brush: java;">
JLabel label = new JLabel("...... DatoJava ......") {
@Override
public void setForeground(Color fg) {
super.setForeground(fg.RED);
}
@Override
protected void paintComponent(Graphics g) {
LinearGradientPaint linearGradientPaint = new LinearGradientPaint(
new Point(0, 10), new Point(0, getHeight()),
new float[] { 0.240f, 0.250f }, new Color[] {
Color.LIGHT_GRAY, Color.GRAY });
Graphics2D graphics2d = (Graphics2D) g.create();
graphics2d.setPaint(linearGradientPaint);
graphics2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
graphics2d.dispose();
super.paintComponent(g);
}
};
</pre>
Con esto podemos jugar y hacer varias cosas interesantes, por ejemplo:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFqeaOHoSQlDC3AfrI3j-OO1tvSm3DyTRz5-VYr25bLqhk2EPUvFo0Aq91w6BdO9GLxg5Dk_koBd8p8VMUPCsukhLzJnxIrQ4SwRxjP9vjzpeH4y6UlqjUKpn7XYFB1XtwBh0T7_iS4E8/s1600/JLabelGradientDatoJava3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JLabel gradient background Esquina" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFqeaOHoSQlDC3AfrI3j-OO1tvSm3DyTRz5-VYr25bLqhk2EPUvFo0Aq91w6BdO9GLxg5Dk_koBd8p8VMUPCsukhLzJnxIrQ4SwRxjP9vjzpeH4y6UlqjUKpn7XYFB1XtwBh0T7_iS4E8/s1600/JLabelGradientDatoJava3.png">
</a>
<figcaption>
JLabel Esquina Gradiente
</figcaption>
</figure>
</div>
<pre class="brush: java;">
JLabel label = new JLabel("...... DatoJava ......") {
@Override
protected void paintComponent(Graphics g) {
LinearGradientPaint linearGradientPaint = new LinearGradientPaint(
new Point(0, 10), new Point(10, getHeight()),
new float[] { 0.240f, 0.250f }, new Color[] {
Color.BLACK, getBackground() });
Graphics2D graphics2d = (Graphics2D) g.create();
graphics2d.setPaint(linearGradientPaint);
graphics2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
graphics2d.dispose();
super.paintComponent(g);
}
};
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDwGOD_-IWtraJsmKHa8LGB7ruNMvvasIDkaZnzz40kezL8zL7P_lPSTuIJqFe6cL-2MihpK0pPOVL7fue2pYCIVuuTioywQAY2Bs4YWamU_vNrPDy3ttcEmV9-OtZGqwHHJDhZYdN4gk/s1600/JLabelGradientDatoJava4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JLabel gradient background Linea abajo" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDwGOD_-IWtraJsmKHa8LGB7ruNMvvasIDkaZnzz40kezL8zL7P_lPSTuIJqFe6cL-2MihpK0pPOVL7fue2pYCIVuuTioywQAY2Bs4YWamU_vNrPDy3ttcEmV9-OtZGqwHHJDhZYdN4gk/s1600/JLabelGradientDatoJava4.png">
</a>
<figcaption>
JLabel Linea Abajo
</figcaption>
</figure>
</div>
<pre class="brush: java;">
JLabel label = new JLabel("...... DatoJava ......") {
@Override
protected void paintComponent(Graphics g) {
LinearGradientPaint linearGradientPaint = new LinearGradientPaint(
new Point(0, 25), new Point(0, getHeight()),
new float[] { 0.240f, 0.250f }, new Color[] {
getBackground(), Color.RED });
Graphics2D graphics2d = (Graphics2D) g.create();
graphics2d.setPaint(linearGradientPaint);
graphics2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
graphics2d.dispose();
super.paintComponent(g);
}
};
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlknigbl7Y51UJwu9k8CS8WB-6VAivgZMB_HHHARxqlmDjbDM3IKE9gEqFy7RRSvu2fVRFtrUrLWKphtYsHNX7zdlQfC9HrRSM4nUsEMGtHBekDo81NQoMN1IWFPb7g2B09vp3Nzb5DII/s1600/JLabelGradientDatoJava5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JLabel gradient background linea abajo gradiente" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlknigbl7Y51UJwu9k8CS8WB-6VAivgZMB_HHHARxqlmDjbDM3IKE9gEqFy7RRSvu2fVRFtrUrLWKphtYsHNX7zdlQfC9HrRSM4nUsEMGtHBekDo81NQoMN1IWFPb7g2B09vp3Nzb5DII/s1600/JLabelGradientDatoJava5.png">
</a>
<figcaption>
JLabel Linea Abajo
</figcaption>
</figure>
</div>
<pre class="brush: java;">
JLabel label = new JLabel("...... DatoJava ......") {
@Override
protected void paintComponent(Graphics g) {
Color colorFinal = new Color(0, 0, 0);
Graphics2D graphics2d = (Graphics2D) g.create();
graphics2d.setPaint(new GradientPaint(0, 0, getBackground(),
getWidth(), 0, colorFinal));
graphics2d.fillRect(0, 25, getWidth(), getHeight());
graphics2d.dispose();
super.paintComponent(g);
}
};
</pre>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
</article>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html" target="_blank"><strong>JCalendar Java Swing Tutorial.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html" target="_blank"><strong>Tutorial de Aplicación Java Swing, ejemplo simple y sencillo.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.pe/2015/11/vaciarQuitarDatosDefaultTableModel.html" target="_blank"><strong>Vaciar DefaultTableModel JTable Swing.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/08756167057085960841noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-1439481443395870042015-11-20T09:19:00.000-08:002016-06-03T15:21:58.704-07:00JCalendar Java Swing Tutorial.<html>
<head>
<title>
JCalendar Java Swing Tutorial
</title>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Tutorial del JCalendar con ejemplos, Java Swing.
</h1>
</div>
<hr/>
</header>
<br/>
<div align="justify">
<br/>
<article>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8b7nMnHo4j9uNRKJuiCdy-erFWDAA13KLFmcOEfpv3lk2C3uTZb3gAa9zc9_S0RnELF00QNQXgkTCCjJyRkbguUW6xXOjMMdX19hgIyR0RiV7wADbaAhwIF-lIAeo9EzEfGBNwfo96xw/s1600/DatoJavaJCalendarTutorial.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="JUnit Assume Tutorial." border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8b7nMnHo4j9uNRKJuiCdy-erFWDAA13KLFmcOEfpv3lk2C3uTZb3gAa9zc9_S0RnELF00QNQXgkTCCjJyRkbguUW6xXOjMMdX19hgIyR0RiV7wADbaAhwIF-lIAeo9EzEfGBNwfo96xw/s1600/DatoJavaJCalendarTutorial.gif"></a> Que mejor manera de controlar la fecha que un usuario ingresa que con un calendario en donde con un simple clic ya obtengamos Año, Mes y Día, en <strong>Java Swing</strong> no trae por defecto un componente que facilite este comportamiento, así que por eso hay que descargar una librería externa llamada <strong>JCalendar</strong>, dicha librería tiene varias funcionalidades, podemos elegir desde un calendario la fecha completa, la fecha de hoy, elegir una fecha maxima o minima para seleccionar, elegir solo un día, año o mes... En fin en este <strong>Tutorial de JCalendar</strong> vamos hacer varios ejemplos con las funcionalidades que ofrece utilizando el IDE JBoss Developer Studio o eclipse.</div>
<br/><br/>
<div class="contenidos">
<h1>Tabla De Contenidos</h1>
<br/>
<a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html#descargarJCalendar"><strong> 1. Descargar JCalendar.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html#javaProject"><strong> 2. Crear proyecto Java.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html#ejemploJCalendar"><strong> 3. Ejemplo de JCalendar.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html#ejemploJDateChooser"><strong> 4. Ejemplo de JDateChooser.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html#ejemploJTextFieldDateEditor"><strong> 5. Ejemplo de JTextFieldDateEditor.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html#ejemploJDayChooser"><strong> 6. Ejemplo de JDayChooser.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html#ejemploJMonthChooser"><strong> 7. Ejemplo de JMonthChooser.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html#ejemploJYearChooser"><strong> 8. Ejemplo de JYearChooser.</strong></a><br/>
</div><a name='more'></a>
<br/>
<a name="descargarJCalendar"></a><h4>1. Descargar JCalendar.</h4><br/>
Para realizar los ejemplos tenemos que descargar <b>jcalendar-1.4.jar</b>, y luego importarlo a nuestro classpath, puedes descargarlo desde <a href="https://mega.nz/#!zYUCnSiD!ANQb1ABgIGoMBn9xGNioVZIcvFTYIYJBzwXfqWPyZE8" target="_blank">aquí</a>.
<br/><br/>
<a name="javaProject"></a><h4>2. Crear proyecto Java.</h4><br/>
Vamos a crear desde nuestro IDE un simple "<b>Java Project</b>" con el nombre de <code class="codigo">JCalendarDatoJava</code>. Para eso recordamos que vamos a la opción de <i>File> New> Java Project.</i>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZcYMxEQmFo-M666XFOG7El9yEd8e_vEZ99_M3Bg-JU9bA9HLgMYES7_eGQ-DNOnWsiuwpfeFQMRCNqGA5HIKVBg8njTFjt1dlH-D43Y849kAgZNHxCYJIJG2KALeZkGOYAAiNLD3NeHA/s1600/NewJavaProject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="imagen New Project" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZcYMxEQmFo-M666XFOG7El9yEd8e_vEZ99_M3Bg-JU9bA9HLgMYES7_eGQ-DNOnWsiuwpfeFQMRCNqGA5HIKVBg8njTFjt1dlH-D43Y849kAgZNHxCYJIJG2KALeZkGOYAAiNLD3NeHA/s1600/NewJavaProject.png">
</a>
<figcaption>
Nuevo Java Project.
</figcaption>
</figure>
</div>
Una vez creado, en la carpeta <code class="codigo">src</code>, creamos un paquete llamado <code class="codigo">datojava.jcalendar</code>, y dentro del mismo vamos a crear la clase <code class="codigo">DJJCalendar</code> en la cual vamos a desarrollar los ejemplos, aparte de eso vamos a crear otra clase llamada <code class="codigo">DJFechasEspInv</code> que extiende de la interface <code class="codigo">IDateEvaluator</code> en la cual vamos a desarrollar un <a href="http://datojava.blogspot.pe/2015/11/jcalendarJavaSwingEjemploTutorial.html#IDateEvaluator">ejemplo agregando fechas especiales/invalidas</a> a nuestro <code class="codigo">JCalendar</code>. Por ultimo importamos la librería <b>jcalendar-1.4.jar</b> al classpath de nuestro proyecto y esta es la estructura que debería tener hasta ahora nuestro proyecto:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEMqWSGmbEc57DWE_ANl_X0AcYvtebOdu6y1s479O8cAcL_QDW2RjGE6fSpeVEOQUERArdMKNZVzghG70UvMB9duJL5b8CstTqv7pCcpk3DNzxgBtkeRqYNbvZE5emAA4g0XKuY4QJ9H4/s1600/EstructuraJCalendar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Estructura JCalendar" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEMqWSGmbEc57DWE_ANl_X0AcYvtebOdu6y1s479O8cAcL_QDW2RjGE6fSpeVEOQUERArdMKNZVzghG70UvMB9duJL5b8CstTqv7pCcpk3DNzxgBtkeRqYNbvZE5emAA4g0XKuY4QJ9H4/s1600/EstructuraJCalendar.png">
</a>
<figcaption>
Estructura JCalendar.
</figcaption>
</figure>
</div>
<a name="ejemploJCalendar"></a><h4>3. Ejemplo de JCalendar.</h4><br/>
Hay varios componentes que ofrece esta librería, entre ellos esta el mas común <code class="codigo">JCalendar</code>, que no es mas que un calendario en el cual podremos elegir una fecha:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglHPOEzoZpSrR3gfr9pjNEunhfp96mWVsoiNRd_iuIm7LGUcsBttntwtzPGs3WpD7SWnLHDgtO-RacdcilkVP3SDQXERE9u_EMdCuinsB1mPaWXAKhXnZFQYNJJKieBT88nrEhMMnLLx8/s1600/DatoJavaJCalendar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JCalendar" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglHPOEzoZpSrR3gfr9pjNEunhfp96mWVsoiNRd_iuIm7LGUcsBttntwtzPGs3WpD7SWnLHDgtO-RacdcilkVP3SDQXERE9u_EMdCuinsB1mPaWXAKhXnZFQYNJJKieBT88nrEhMMnLLx8/s1600/DatoJavaJCalendar.png">
</a>
<figcaption>
JCalendar.
</figcaption>
</figure>
</div>
Este es el codigo para utilizar el componente <code class="codigo">JCalendar</code>:
<pre class="brush: java;">
private JCalendar calendar;
// Instanciar Componente
calendar = new JCalendar();
// Ubicar y agregar al panel
calendar.setBounds...
panel.add(calendar);
</pre>
A este <code class="codigo">JCalendar</code> podemos agregarle/quitarle varias cosas, por ejemplo para agregar un boton que nos permita elegir la fecha de hoy:
<pre class="brush: java; gutter: false;">
calendar.setTodayButtonVisible(true);
</pre>
A ese boton podemos cambiarle el label (por defecto es "<i>Hoy</i>") de esta manera:
<pre class="brush: java; gutter: false;">
calendar.setTodayButtonText("Hoy Día");
</pre>
También podemos agregarle un boton para no seleccionar ninguna fecha:
<pre class="brush: java; gutter: false;">
calendar.setNullDateButtonVisible(true);
</pre>
Y de igual manera podemos cambiar el label por defecto ("<i>Sin fecha</i>"), así se ve el <code class="codigo">JCalendar</code> con los botones:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3T3hf1MU0nx__bvq7JTjsufd7G4wmGsSiU1ds72LKbowWnNLWuLRFlC3JsGBqtahF7Yisq9bFOCd37wN4t7VCCJdDioMjVlOlBdspfnmv9PL811Fg-P6jAOFf0PXyRxQjMUPQJjjZVPc/s1600/DatoJavaJCalendar1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JCalendar Botones" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3T3hf1MU0nx__bvq7JTjsufd7G4wmGsSiU1ds72LKbowWnNLWuLRFlC3JsGBqtahF7Yisq9bFOCd37wN4t7VCCJdDioMjVlOlBdspfnmv9PL811Fg-P6jAOFf0PXyRxQjMUPQJjjZVPc/s1600/DatoJavaJCalendar1.png">
</a>
<figcaption>
JCalendar Botones.
</figcaption>
</figure>
</div>
Si detallamos la imagen del calendario, podemos observar que muestra varios datos que a veces son innecesarios dependiendo de la aplicación, podemos hacer una que otra modificación quitandole o agregandole varias cosas.
<br/>
Para quitar el numero de semanas:
<pre class="brush: java; gutter: false;">
calendar.setWeekOfYearVisible(false);
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEganebtnOCmzsnYUH66_MtoCphdNVdl5uANtlU73SBg5yXwQGIyidIoIzg0eDSL4e_izu-SedHcLFAjXJ9egx8qpm4EAWDw8gOUS0h_3QBsWRlLiqI1Zl43352T_ShHhlUMiwMafjZ4e-A/s1600/DatoJavaJCalendar2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JCalendar Sin Numero de semanas" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEganebtnOCmzsnYUH66_MtoCphdNVdl5uANtlU73SBg5yXwQGIyidIoIzg0eDSL4e_izu-SedHcLFAjXJ9egx8qpm4EAWDw8gOUS0h_3QBsWRlLiqI1Zl43352T_ShHhlUMiwMafjZ4e-A/s1600/DatoJavaJCalendar2.png">
</a>
<figcaption>
JCalendar Sin Numero de semanas.
</figcaption>
</figure>
</div>
Para incrementar/decrementar la cantidad de caracteres que tiene el label de los días:
<pre class="brush: java; gutter: false;">
calendar.setMaxDayCharacters(1);
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8PkoU4-N9x0wGDD9da-FChKaa7i4LQ9RR2ARJ3CuHsd76xPCRndfcRDL6LruYafPFEeBOnA7l1A_o99zdpqspFgU2q-5PEdNa6E7ctyQQpBKGtj8GPXk_dYQyUO0x_zQHfJVBBiLNXAU/s1600/DatoJavaJCalendar3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JCalendar Sin Numero de semanas" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8PkoU4-N9x0wGDD9da-FChKaa7i4LQ9RR2ARJ3CuHsd76xPCRndfcRDL6LruYafPFEeBOnA7l1A_o99zdpqspFgU2q-5PEdNa6E7ctyQQpBKGtj8GPXk_dYQyUO0x_zQHfJVBBiLNXAU/s1600/DatoJavaJCalendar3.png">
</a>
<figcaption>
JCalendar Primera Letra Del Día.
</figcaption>
</figure>
</div>
Cambiar color de letra de los días de semana, fin de semana o numero de día:
<pre class="brush: java;">
// Cambiar color de letra del numero de día
calendar.setForeground(Color.GREEN);
// Cambiar color de letra del dia domingo
calendar.setSundayForeground(Color.BLUE);
// Cambiar color de letra de semana
calendar.setWeekdayForeground(Color.RED);
</pre>
Establecer una fecha en el <code class="codigo">JCalendar</code>:
<pre class="brush: java;">
Calendar calendario = new GregorianCalendar(2014,5,10);
calendar.setDate(calendario.getTime());
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMa56jEeTmPknTcrDIPNk4il4klL2xD6juat9o3vA9IGvLuMOcSJRoZX7DvAECJ4eNR2XCBCVBlzdX-ZJntWRCOnPKfNaqA8bXPeYV4r6AjCF7WBYajW0GQ5S9uUm2Sw2AkXsU_L-F9oU/s1600/DatoJavaJCalendar4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JCalendar establecer fecha" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMa56jEeTmPknTcrDIPNk4il4klL2xD6juat9o3vA9IGvLuMOcSJRoZX7DvAECJ4eNR2XCBCVBlzdX-ZJntWRCOnPKfNaqA8bXPeYV4r6AjCF7WBYajW0GQ5S9uUm2Sw2AkXsU_L-F9oU/s1600/DatoJavaJCalendar4.png">
</a>
<figcaption>
JCalendar establecer fecha.
</figcaption>
</figure>
</div>
Establecer la fecha maxima/minima que puede elegir un usuario:
<pre class="brush: java;">
// Fecha minima seleccionable
calendar.setMinSelectableDate(new Date());
// Fecha maxima seleccionable
calendar.setMaxSelectableDate(new Date());
</pre>
<a name="IDateEvaluator"></a>Para establecer algunas fechas especiales o invalidas en el <code class="codigo">JCalendar</code>, implementamos la clase <code class="codigo">DJFechasEspInv</code> que creamos anteriormente, si por ejemplo queremos establecer como fecha especial el día 24 de diciembre y como fecha invalida el dia 01 de Enero:
<pre class="brush: java; highlight: [18,25,30,35,40,47,52,57]">
package datojava.jcalendar;
import java.awt.Color;
import java.util.Calendar;
import java.util.Date;
import com.toedter.calendar.IDateEvaluator;
public class DJFechasEspInv implements IDateEvaluator {
Calendar calendar = Calendar.getInstance();
public DJFechasEspInv() {
}
@Override
public boolean isSpecial(Date date) {
calendar.setTime(date);
return calendar.get(Calendar.MONTH) == Calendar.DECEMBER
&& calendar.get(Calendar.DAY_OF_MONTH) == 24;
}
@Override
public Color getSpecialForegroundColor() {
return Color.GREEN;
}
@Override
public Color getSpecialBackroundColor() {
return Color.WHITE;
}
@Override
public String getSpecialTooltip() {
return "Es Navidad";
}
@Override
public boolean isInvalid(Date date) {
calendar.setTime(date);
return calendar.get(Calendar.MONTH) == Calendar.JANUARY
&& calendar.get(Calendar.DAY_OF_MONTH) == 01;
}
@Override
public Color getInvalidForegroundColor() {
return Color.WHITE;
}
@Override
public Color getInvalidBackroundColor() {
return Color.BLACK;
}
@Override
public String getInvalidTooltip() {
return "No es día Laborable";
}
}
</pre>
Explicando un poco el codigo, en la implementación del metodo <code class="codigo">boolean isSpecial(Date date)</code> (<b>18</b>), obtenemos la fecha y verificamos si coincide con el día "24 de Diciembre", en caso de ser cierto, ese día tendrá la letra de color verde (<code class="codigo">Color getSpecialForegroundColor()</code> (<b>25</b>)) y el fondo de color blanco (<code class="codigo">Color getSpecialBackroundColor()</code> (<b>30</b>)), adicionalmente vamos agregarle el <code class="codigo">ToolTip</code> con la descripción del día especial (<code class="codigo">String getSpecialTooltip()</code> (<b>35</b>)), lo propio hacemos con el día invalido que en este caso es el día "01 de Enero" (<code class="codigo">boolean isInvalid(Date date)</code> (<b>40</b>)), con la letra de color blanco (<code class="codigo">Color getInvalidForegroundColor()</code> (<b>47</b>)), el fondo de color negro (<code class="codigo">Color getInvalidBackroundColor()</code> (<b>52</b>)) y la descripción correspondiente (<code class="codigo">String getInvalidTooltip()</code> (<b>57</b>)). Ahora tenemos que agregarle esta clase el calendar:
<pre class="brush: java; gutter: false;">
calendar.getDayChooser().addDateEvaluator(new DJFechasEspInv());
</pre>
Ya con eso funciona, pero en el caso de que necesitemos hacer algo como esto no creo que sea solo con una fecha, así que para agregar varias fechas se complica un poco, pero para todo hay solución. En la clase <code class="codigo">DJJCalendar</code> tenemos que hacer dos metodos, uno en el cual crearemos una lista con todas las fechas especiales y otro con una lista de <code class="codigo">ToolTip</code> por cada fecha especial, en el caso de que queramos agregar fechas invalidas creamos otro metodo adicional.<br/>
Metodo que retorna la lista de fechas especiales:
<pre class="brush: java;">
public static List<Calendar> fechasEspeciales() {
List<Calendar> fechas = new ArrayList<Calendar>();
Calendar calendar = new GregorianCalendar(2015, Calendar.SEPTEMBER, 10);
fechas.add(calendar);
calendar = new GregorianCalendar(2015, Calendar.NOVEMBER, 10);
fechas.add(calendar);
calendar = new GregorianCalendar(2015, Calendar.NOVEMBER, 18);
fechas.add(calendar);
return fechas;
}
</pre>
Metodo que retorna la lista de <code class="codigo">ToolTip</code> por cada fecha:
<pre class="brush: java;">
public static List<String> tipFechas() {
List<String> tips = new ArrayList<String>();
tips.add("Septiembre 10");
tips.add("Noviembre 10");
tips.add("Noviembre 18");
return tips;
}
</pre>
Ahora en la implementación del metodo <code class="codigo">boolean isSpecial(Date date)</code> recorremos la lista de fechas especiales y vamos pintando en el calendario las mismas:
<pre class="brush: java;">
private int i = 0;
@Override
public boolean isSpecial(Date date) {
calendar.setTime(date);
for (i = 0; i < DJJCalendar.fechasEspeciales().size(); i++) {
if (calendar.get(Calendar.MONTH) == DJJCalendar.fechasEspeciales()
.get(i).get(Calendar.MONTH)
&& calendar.get(Calendar.DAY_OF_MONTH) == DJJCalendar
.fechasEspeciales().get(i)
.get(Calendar.DAY_OF_MONTH)) {
return true;
}
}
return false;
}
</pre>
Hacemos lo propio en el metodo <code class="codigo">String getSpecialTooltip()</code>, obtenemos la descripción en la posición correspondiente y la pintamos en el calendario
<pre class="brush: java;">
@Override
public String getSpecialTooltip() {
return DJJCalendar.tipFechas().get(i);
}
</pre>
Hay mas propiedades con las que podemos jugar, todo depende de lo que necesitemos para nuestra aplicación.
<br/><br/>
<a name="ejemploJDateChooser"></a><h4>4. Ejemplo de JDateChooser.</h4><br/>
El <code class="codigo">JDateChooser</code> es mucho mas util, ya que este componente nos presenta un campo de texto con un boton al lado, que al presionarlo nos muestra el <code class="codigo">JCalendar</code> descrito anteriormente, y al momento de seleccionar la fecha, la misma se muestra en el campo de texto:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvJAhYoyJp2hhCKo7vAB4FWaiVDSocdL3HVitBdx2ddBfqQHEhLc8LzmyrfiD5cD-bS0eQuPWjatziHdiODSXuNqwPZmvCqxyT1jAKHnii7K4p5NlCXmR8FTIn4XEpfWa3o3AtdXSb-vg/s1600/DatoJavaJCalendar5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JDateChooser" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvJAhYoyJp2hhCKo7vAB4FWaiVDSocdL3HVitBdx2ddBfqQHEhLc8LzmyrfiD5cD-bS0eQuPWjatziHdiODSXuNqwPZmvCqxyT1jAKHnii7K4p5NlCXmR8FTIn4XEpfWa3o3AtdXSb-vg/s1600/DatoJavaJCalendar5.png">
</a>
<figcaption>
JDateChooser.
</figcaption>
</figure>
</div>
Este es el codigo para utilizar el componente <code class="codigo">JDateChooser</code>:
<pre class="brush: java;">
private JDateChooser dateChooser;
// Instanciar Componente
dateChooser = new JDateChooser();
// Ubicar y agregar al panel
dateChooser.setBounds...
panel.add(calendar);
</pre>
Obviamente a este componente también podemos modificarle sus propiedades, y como en si es otro <code class="codigo">JCalendar</code> pero con un campo de texto, son practicamente las mismas propiedades, por ejemplo para obtener el <code class="codigo">JCalendar</code> y aplicar las modificaciones anteriores necesitamos este codigo:
<pre class="brush: java; gutter: false;">
dateChooser.getJCalendar();
</pre>
En el campo de texto que ofrece <code class="codigo">JDateChooser</code> el usuario puede ingresar la fecha manualmente, en el caso de que ingrese cualquier tontería se mostrará en rojo y al obtener la fecha la misma sera null, para controlar este comportamiento podemos agregar un patron, una mascara, que le indique al usuario como debe ingresar la fecha si lo quiere hacer de forma manual. Con este codigo:
<pre class="brush: java; gutter: false;">
JDateChooser dateChooser = new JDateChooser("yyyy/MM/dd", "####/##/##", '_');
</pre>
Indicamos que solo puede ingresar numeros, año/mes/día y en el campo de texto se mostrará este patron "<b>____/__/__</b>" mientras no ingrese o seleccione una fecha.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNhlsY2Mo84yPw1C7nynU1RneZaY_6saj9lany5_aSmY0a-FSvV_WgtG_PDZx_48OIMwS6LlUgy1pw8422vaL4bxBdozjBaiakOSpDwTqEKKzDOlI0gU8e8aXwXEmYK7fvXw2ywmKUj9Q/s1600/DatoJavaJCalendar7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JDateChooser Máscara" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNhlsY2Mo84yPw1C7nynU1RneZaY_6saj9lany5_aSmY0a-FSvV_WgtG_PDZx_48OIMwS6LlUgy1pw8422vaL4bxBdozjBaiakOSpDwTqEKKzDOlI0gU8e8aXwXEmYK7fvXw2ywmKUj9Q/s1600/DatoJavaJCalendar7.png">
</a>
<figcaption>
JDateChooser Máscara.
</figcaption>
</figure>
</div>
Podemos agregar un <code class="codigo">JSpinnerDateEditor</code>, para que cuando el usuario ingrese una fecha pueda desplazarse sobre la misma.
<pre class="brush: java; gutter: false;">
JDateChooser dateChooser = new JDateChooser(null, null, null,
new JSpinnerDateEditor());
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiTLhj5qQILEKzeQdTP5oUKRF8Gu4L_uO_egFRequp9fWnsdkqGTNhZkij3NMGdH9_y5ahF-gyEs22Tu4uIOvDu6xWbU2JN9S0XZsB7gXEqfWvkaRQ-FiquIIbJak9zBsuMQSZDqDXoq0/s1600/DatoJavaJCalendar8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JDateChooser JSpinnerDateEditor" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiTLhj5qQILEKzeQdTP5oUKRF8Gu4L_uO_egFRequp9fWnsdkqGTNhZkij3NMGdH9_y5ahF-gyEs22Tu4uIOvDu6xWbU2JN9S0XZsB7gXEqfWvkaRQ-FiquIIbJak9zBsuMQSZDqDXoq0/s1600/DatoJavaJCalendar8.png">
</a>
<figcaption>
JDateChooser JSpinnerDateEditor.
</figcaption>
</figure>
</div>
Para obtener la fecha de un <code class="codigo">JDateChooser</code>.
<pre class="brush: java; gutter: false;">
dateChooser.getDate();
</pre>
Como hemos visto el <code class="codigo">JDateChooser</code> no es mas que un campo de texto con un <code class="codigo">JCalendar</code> que hace de popup al momento de presionar un boton.<br/><br/>
<a name="ejemploJTextFieldDateEditor"></a><h4>5. Ejemplo de JTextFieldDateEditor.</h4><br/>
También podemos utilizar solamente el campo de texto <code class="codigo">JTextFieldDateEditor</code> de esta manera.
<pre class="brush: java;">
private JTextFieldDateEditor textFieldDateEditor;
// Instanciar Componente
textFieldDateEditor = new JTextFieldDateEditor("yyyy/MM/dd",
"####/##/##", '_');
// Ubicar y agregar al panel
textFieldDateEditor.setBounds...
panel.add(textFieldDateEditor);
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkco1yIHrnRfc3rcHupb4U2Q0WAfMML7IxZHS9aWwCziKGfRlEOkuXqkWOG__6TPdhlDZJhQXIEv1jp73r3wfjdrHqFhHy0JyjS4Dw_LalumGk_Zs4DXF6SXlw3QAs0Yx3v_cGyIKgQ9o/s1600/DatoJavaJCalendar9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JTextFieldDateEditor" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkco1yIHrnRfc3rcHupb4U2Q0WAfMML7IxZHS9aWwCziKGfRlEOkuXqkWOG__6TPdhlDZJhQXIEv1jp73r3wfjdrHqFhHy0JyjS4Dw_LalumGk_Zs4DXF6SXlw3QAs0Yx3v_cGyIKgQ9o/s1600/DatoJavaJCalendar9.png">
</a>
<figcaption>
JTextFieldDateEditor.
</figcaption>
</figure>
</div>
Esto puede ser util dependiendo del tipo de aplicación.<br/><br/>
Pasando a otros componentes utiles, podemos ver el <code class="codigo">JDayChooser</code>, <code class="codigo">JMonthChooser</code> y el <code class="codigo">JYearChooser</code>.<br/><br/>
<a name="ejemploJDayChooser"></a><h4>6. Ejemplo de JDayChooser.</h4><br/>
<code class="codigo">JDayChooser</code>:
<pre class="brush: java;">
private JDayChooser dayChooser;
// Instanciar Componente
dayChooser = new JDayChooser();
// Ubicar y agregar al panel
dayChooser.setBounds...
panel.add(dayChooser);
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0C6AERLA3EBRcEHTPZ7ICKMebOoU05zSA9FXtZLLrNFoARYgE66e-1lsuadvc_06qrQJAa4nyBZ1KrmhA45pKz6N-BJscgv7-_ArZuhNEON695-jRTESp3hyphenhyphen6SyONX904_V0XsV0RgYE/s320/DatoJavaJCalendar10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JDayChooser" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0C6AERLA3EBRcEHTPZ7ICKMebOoU05zSA9FXtZLLrNFoARYgE66e-1lsuadvc_06qrQJAa4nyBZ1KrmhA45pKz6N-BJscgv7-_ArZuhNEON695-jRTESp3hyphenhyphen6SyONX904_V0XsV0RgYE/s320/DatoJavaJCalendar10.png">
</a>
<figcaption>
JDayChooser.
</figcaption>
</figure>
</div>
<a name="ejemploJMonthChooser"></a><h4>7. Ejemplo de JMonthChooser.</h4><br/>
<code class="codigo">JMonthChooser</code>
<pre class="brush: java;">
private JMonthChooser monthChooser;
// Instanciar Componente
monthChooser = new JMonthChooser();
// Ubicar y agregar al panel
monthChooser.setBounds...
panel.add(monthChooser);
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb-6FwfHBWaWTVJApDEASrWvsh3cNv2_0rpKBGW0HqC8fN8sq5QcBBzJGDlkLYsdzA9Pnvd9-Do_uQ7-yMLw-Ku-hWt1HdIEVvZluY7McUqBL18jqx-R3IxgVSUEXxuL_tT9BTr2sA8I0/s1600/DatoJavaJCalendar11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JMonthChooser" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb-6FwfHBWaWTVJApDEASrWvsh3cNv2_0rpKBGW0HqC8fN8sq5QcBBzJGDlkLYsdzA9Pnvd9-Do_uQ7-yMLw-Ku-hWt1HdIEVvZluY7McUqBL18jqx-R3IxgVSUEXxuL_tT9BTr2sA8I0/s1600/DatoJavaJCalendar11.png">
</a>
<figcaption>
JMonthChooser.
</figcaption>
</figure>
</div>
<a name="ejemploJYearChooser"></a><h4>8. Ejemplo de JYearChooser.</h4><br/>
<code class="codigo">JYearChooser</code>
<pre class="brush: java;">
private JYearChooser yearChooser;
// Instanciar Componente
yearChooser = new JYearChooser();
// Ubicar y agregar al panel
yearChooser.setBounds...
panel.add(yearChooser);
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdAFtcoQWOCl4_gwNjNyVWgMdokLv5zKnPNAsykb0N-iNfoy0V84B73AjBNhzpX6ZWrzw5jIeN6mK437Yop7ZTT70iUkJ31es-3UItfWIaTBSm_g8_hC36JoxKhYNJgnSbTlyViqodXWI/s1600/DatoJavaJCalendar12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JYearChooser" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdAFtcoQWOCl4_gwNjNyVWgMdokLv5zKnPNAsykb0N-iNfoy0V84B73AjBNhzpX6ZWrzw5jIeN6mK437Yop7ZTT70iUkJ31es-3UItfWIaTBSm_g8_hC36JoxKhYNJgnSbTlyViqodXWI/s1600/DatoJavaJCalendar12.png">
</a>
<figcaption>
JYearChooser.
</figcaption>
</figure>
</div>
Llegando al final de este <u>Tutorial de JCalendar Swing</u>, se puede decir que es una buena librería, muy util en aplicaciones Java Swing. Recuerda que esto fue un repaso, se puede lograr algo mucho mas potente, <a href="https://mega.nz/#!mRUBXbDC!DjVsGFB97w9VtPRrYx85AB9id24OvgcIxZMgGEyUOuc" target="_blank">aquí</a> te dejo el proyecto con los ejemplos para que lo descargues. Suerte.
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
</article>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html" target="_blank"><strong>Tutorial de Aplicación Java Swing, ejemplo simple y sencillo.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.pe/2015/11/vaciarQuitarDatosDefaultTableModel.html" target="_blank"><strong>Vaciar DefaultTableModel JTable Swing.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/09/enviarCorreoJavamailEjemplos.html" target="_blank"><strong>Enviar correos desde Java con Javamail.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/08756167057085960841noreply@blogger.com32tag:blogger.com,1999:blog-9116102449526922332.post-12624661275278912502015-11-17T13:30:00.000-08:002016-06-03T15:22:33.151-07:00Vaciar DefaultTableModel.<html>
<head>
<title>
Vaciar DefaultTableModel.
</title>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Vaciar DefaultTableModel de un JTable. Quitar datos de un DefaultTableModel.
</h1>
</div>
<hr/>
</header>
<br/>
<div align="justify">
<br/>
<article>
Cuando tenemos un <code class="codigo"><strong>JTable</strong></code> que utiliza <code class="codigo"><strong>DefaultTableModel</strong></code> muchas veces es necesario vaciar el <code class="codigo"><strong>JTable</strong></code>, en este caso hay que eliminar dato por dato del <code class="codigo"><strong>DefaultTableModel</strong></code> recorriéndolo de esta manera:
<pre class="brush: java;">
int numDatos = defaultTableModel.getRowCount();
for (int i = 0; i < numDatos; i++) {
defaultTableModel.removeRow(0);
}
</pre>
Primero obtenemos el numero de datos que contiene el <code class="codigo"><strong>DefaultTableModel</strong></code> y después recorremos los datos con un bucle <code class="codigo">for</code> para ir borrando el primer dato encontrado.
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
</article>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html" target="_blank"><strong>Tutorial de Aplicación Java Swing, ejemplo simple y sencillo.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/05/diferenciaEntreThrowyThrowsEnJava.html" target="_blank"><strong>Diferencias entre throw y throws en Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/07/depurarAplicacionJava.html" target="_blank"><strong>Depurar (debug) en JBoss Developer Studio</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/crearWorkspaceEclipse.html" target="_blank"><strong>Crear Workspace en Eclipse/JBoss Developer Studio.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/08756167057085960841noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-31032033427602581322015-11-06T14:14:00.000-08:002016-06-03T15:26:34.271-07:00HSQLDB Tutorial<html>
<head>
<title>
HSQLDB Tutorial.
</title>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Tutorial de HSQLDB con Java.
</h1>
</div>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEickMLK99rYybP8K5JNaUyQhQ-ArGTr6-_2MoOkWGEoJRHeG63IxAxdVykwstHcdwNIMlhWObGW9KPZgnHo4EhcYSHgKlLT9m1Wx8Orms9aAUG7MxZM9tit4Z_6jcQ8zzVqeP9vcCR70OY/s1600/HSQLDBDatoJavaIcon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="HSQLDB DatoJava" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEickMLK99rYybP8K5JNaUyQhQ-ArGTr6-_2MoOkWGEoJRHeG63IxAxdVykwstHcdwNIMlhWObGW9KPZgnHo4EhcYSHgKlLT9m1Wx8Orms9aAUG7MxZM9tit4Z_6jcQ8zzVqeP9vcCR70OY/s1600/HSQLDBDatoJavaIcon.png">
</a>
</figure>
</div>
<hr/>
</header>
<br />
<div align="justify">
<br/>
<article>
<strong>HyperSQL</strong> (HSQLDB) es una base de datos relacional, es hecha 100% en Java y corre en la maquina virtual de Java (JVM), hay muchas características que hacen de HSQLDB una base de datos atractiva para los desarrolladores, podemos usarla sin la necesidad de un servidor, para hacer pruebas en memoria utilizando la memoria RAM, es de código abierto, con solo importar el JAR a tu proyecto puedes comenzar a trabajar, bien sea para pruebas o para hacer funcionar tu aplicación en un ambiente de producción, claro que también trae su Database Manager en SWING para hacerle consultas a nuestras tablas por fuera de nuestra aplicación.
<br/>
<br/>
En este Tutorial vamos a centrarnos en el funcionamiento de HSQLDB desde Java. Lo que necesitamos es un IDE, en este caso yo utilizo JBoss Developer Studio o lo que es lo mismo eclipse y la última versión de HSQLDB que en este momento es la 2.3.3.
<br/><br/>
<div class="contenidos">
<h1>Tabla De Contenidos</h1>
<br/>
<a href="http://datojava.blogspot.pe/2015/11/TutorialJavaHSQLDB.html#descargarHSQLDB"><strong> 1. Descargar HSQLDB-2.3.3.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/TutorialJavaHSQLDB.html#tiposHSQLDB"><strong> 2. Bases de Datos en HSQLDB.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/TutorialJavaHSQLDB.html#accederCatalogos"><strong> 3. Acceder a los catálogos de Bases de Datos en HSQLDB.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/TutorialJavaHSQLDB.html#accederCatalogosIN-PROCESS"><strong> 3.1. En Proceso (IN-PROCESS).</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/TutorialJavaHSQLDB.html#accederCatalogosSERVER-MODE"><strong> 3.2. Modo Servidor.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/11/TutorialJavaHSQLDB.html#creacionProyecto"><strong> 4. Creación del proyecto Java.</strong></a><br/>
</div>
<br/>
<a name='more'></a>
<a name="descargarHSQLDB"></a><h4>1. Descargar HSQLDB-2.3.3.</h4><br/>
Vamos a ir a la página de <a href="http://sourceforge.net/projects/hsqldb/files/" target="_blank">sourceforge</a> y descargamos el archivo <code class="codigo">hsqldb-2.3.3.zip</code>. Lo descomprimimos (De preferencia en la raíz de C:) y podemos ver que dentro trae una gran cantidad de archivos, directorios... Algo así deberíamos ver:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-v2vq9dzybs8mYz1PN-FM4H3VLqqpA9Iqu-k6Mfom5L13WjfhN8C_wK-yW3xat7nQfc5OTGdS1mCSo_OBW0FVmNAbIyqzXhPlKKXEPHc22-SIqbm8uHlggQO5RFN0PY6LwCnzeDptPOA/s1600/ArchivosHSQLDBDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="imagen archivosHSQLDB" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-v2vq9dzybs8mYz1PN-FM4H3VLqqpA9Iqu-k6Mfom5L13WjfhN8C_wK-yW3xat7nQfc5OTGdS1mCSo_OBW0FVmNAbIyqzXhPlKKXEPHc22-SIqbm8uHlggQO5RFN0PY6LwCnzeDptPOA/s1600/ArchivosHSQLDBDatoJava.png">
</a>
<figcaption>
Directorio HSQLDB
</figcaption>
</figure>
</div>
En la carpeta <code class="codigo">lib</code>, se encuentra el archivo <code class="codigo">hsqldb.jar</code> que vamos a importar al classpath de nuestro proyecto.
<a name="tiposHSQLDB"></a><h4>2. Bases de Datos en HSQLDB.</h4><br/>
Hay varios tipos, en HSQLDB las bases de datos son llamadas <u>"Catalogos"</u>, hay tres tipos de catálogos:
<ul>
<li type="circle"><strong>mem: </strong>este tipo de catalogo se guarda directamente en la memoria RAM, no hay ningún tipo de persistencia, se cierra el proyecto de Java y se borran todos los datos ingresados anteriormente.</li>
<li type="circle"><strong>file:</strong> se guarda en archivos en la raíz del proyecto Java.</li>
<li type="circle"><strong>res:</strong> se guarda en el mismo proyecto Java, como un archivo JAR o ZIP.</li>
</ul>
<a name="mem"></a><strong>mem: </strong> <i>todo en la memoria</i>, este tipo de catalogos se pueden usar para hacer pruebas de datos, hay que recordar que este tipo de bases de datos no crea nigún archivo.
<br/><br/>
<a name="file"></a><strong>file: </strong> este tipo de catálogos consiste en crear varios archivos, todos con el mismo nombre pero con diferentes extensiones, localizados en el mismo directorio. Por ejemplo si la base de datos la llamamos "prueba", estos son los archivos que se van a crear:
<ul>
<li type="circle"><code class="codigo">prueba.properties:</code> contiene la configuración de la base de datos.</li>
<li type="circle"><code class="codigo">prueba.script:</code> cotiene las definiciones de las tablas y obejtos.</li>
<li type="circle"><code class="codigo">prueba.log:</code> contiene los cambios recientes que se la hayan hecho a la base de datos.</li>
<li type="circle"><code class="codigo">prueba.data:</code> contiene los datos de las tablas. (A veces no se crea)</li>
<li type="circle"><code class="codigo">prueba.backup:</code> contiene un backup del ultimo estado consistenete de la base de datos. (A veces no se crea)</li>
</ul>
<a name="res"></a><strong>res: </strong> este sirve para abrir un catalogo ya existente en una ruta especifica dentro de nuestra aplicación, cuando abrimos la conexión se descomprime el catalogo, y al cerrar la aplicación se comprime de nuevo. Este tipo de catálogos no se usa con gran cantidad de datos, en ese caso es recomendable usar el catalogo <strong>file</strong>.<br/><br/>
<a name="accederCatalogos"></a><h4>3. Acceder a los catálogos de Bases de Datos en HSQLDB.</h4><br/>
Hay 2 maneras de acceder:
<ul>
<li><a name="accederCatalogosIN-PROCESS"></a><h4>3.1 <strong>En proceso (IN-PROCESS): </strong></h4>
Utilizando <strong>JDBC</strong> podemos conectarnos a la Base de Datos, después solo tenemos que indicar el directorio donde se encuentra el catalogo y ya podemos hacer nuestras consultas.<br/>
Para ingresar a un catalogo de tipo <code class="codigo">file</code> tenemos que obtener la conexión de esta manera:
<pre class="brush: java; gutter: false;">
Connection connection = DriverManager.getConnection("jdbc:hsqldb:file:prueba", "sa", "");
</pre>
Ahí obtenemos la conexión, si estaba creado obtiene la conexión a ese catalogo y si no simplemente lo crea. <br/>
Si es un catalogo de tipo <code class="codigo">mem</code>, la ruta es simplemente un "nombre", recuerda que este tipo de catalogos no crea archivos ni nada de eso, podemos poner lo que sea y comenzar hacer pruebas. Para conectarnos lo hacemos de esta manera:
<pre class="brush: java; gutter: false;">
Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:pruebamem", "sa", "");
</pre>
Para conectarnos a un catalogo de tipo <code class="codigo">res</code>, como es un recurso Java (JAR, ZIP...), tenemos que indicar la ruta del recurso como si se tratará de una clase, por ejemplo supongamos que nuestro catalogo se encuentra en esta ruta: "<i>datojava/hsqldb/prueba</i>", tenemos que conectarnos al catalogo de esta manera:
<pre class="brush: java; gutter: false;">
Connection connection = DriverManager.getConnection("jdbc:hsqldb:res:datojava.hsqldb.prueba", "sa", "");
</pre>
Acceder de esta manera (IN_PROCESS) a los catálogos es bastante rápido ya que no hay que estar pasando datos entre redes o algo por el estilo, pero tienes que tomar en cuenta que solo un proceso Java (una aplicación, un Database Manager...) puede acceder a un catalogo de tipo <code class="codigo">file</code>, si quieres que varias aplicaciones accedan al mismo tiempo a este tipo de catálogos (IN-PROCESS), tenemos que hacer el catalogo <code class="codigo">file</code> de solo lectura (read-only), o cambiar a un catalogo de tipo <code class="codigo">res</code> que son de tipo read-only.
</li>
<li><a name="accederCatalogosSERVER-MODE"></a><h4>3.2 <strong>Modo Servidor: </strong></h4>
Es el que recomiendo, primero porque podemos conectarnos desde distintas aplicaciones Java al mismo catalogo, podemos ver y actualizar los datos que tengamos en el catalogo desde el Database Manager (viene incluido en el archivo que descomprimimos en el paso 1), mientras las demás aplicaciones están utilizando la base de datos, hay varias maneras de acceder en modo servidor, yo solo me voy a centrar en una manera de correr el servidor, se llama <strong>HyperSQL HSQL Server</strong> y es la más usada y la más rápida, para correr el servidor lo podemos hacer desde la línea de comandos o desde la misma aplicación.<br/>
Para <u>correr el servidor desde la línea de comandos</u> tenemos que ubicarnos en el directorio donde descomprimimos hsqldb-2.3.3, y ejecutar el siguiente comando:<br/><br/>
<div align="left" style="font-size:10.0pt;color:rgb(0,0,255);">
java -cp hsqldb/lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:DatoJava/HSQLDB/miBaseDeDatos --dbname.0 mdb
</div>
<br/>
En ese comando estamos diciendo que vamos acceder o crear (en el caso de que no exista) ese catalogo llamado <code class="codigo">miBaseDeDatos</code> en el directorio <i>"DatoJava/HSQLDB/"</i> con el alias <code class="codigo">mdb</code>.<br/>
Al ejecutar ese comando deberíamos ver en la consola un mensaje como este:
</li>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz5vxabjZIuBQx_kDtBFpVIFCivtfhGthXDZsyloxNrK0y_3W7WJ3WjhSKd9ZmpDQEfG9HB8Q6JKg5IfOD9tUwj4WeOQMQzSvf47E-J0mMBtKWsuSqvDII1tJr2oLUl-GTvkNZdduIr3k/s1600/DatoJavaServerMode.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Server Mode HSQLDB" width="700" height="150" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz5vxabjZIuBQx_kDtBFpVIFCivtfhGthXDZsyloxNrK0y_3W7WJ3WjhSKd9ZmpDQEfG9HB8Q6JKg5IfOD9tUwj4WeOQMQzSvf47E-J0mMBtKWsuSqvDII1tJr2oLUl-GTvkNZdduIr3k/s1600/DatoJavaServerMode.png">
</a>
<figcaption>
Server Mode HSQLDB
</figcaption>
</figure>
</div>
<br/>
Eso nos indica que ya podemos acceder al catalogo desde el <strong>Database Manager</strong> o bien desde cualquier aplicación Java mediante <strong>JDBC</strong>.<br/>
Para verificar que ese comando creo ese directorio con ese catalogo vamos a la ruta <i>"C:\hsqldb-2.3.3\hsqldb-2.3.3"</i> y deberíamos ver algo como esto:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAjdMdSNm9mLLNTZuVQ-f_O2pxD6t-npKExWZdUbp5HMq6srpTmd2F16vuLBRgMA0jp7WW1Zn2ShbDYonhIBd_GXYY6Zfo2WQGsBGYlZjGMwC-SMgvME-OxVrFiNJoTOCFF_1FlHPGEt4/s1600/DirCreadoDatoJavaHSQLDB.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Directorio Creado HSQLDB" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAjdMdSNm9mLLNTZuVQ-f_O2pxD6t-npKExWZdUbp5HMq6srpTmd2F16vuLBRgMA0jp7WW1Zn2ShbDYonhIBd_GXYY6Zfo2WQGsBGYlZjGMwC-SMgvME-OxVrFiNJoTOCFF_1FlHPGEt4/s1600/DirCreadoDatoJavaHSQLDB.png">
</a>
<figcaption>
Directorio Creado HSQLDB
</figcaption>
</figure>
</div>
Ahora podemos ingresar con el <strong>Database Manager</strong> al mismo catalogo de esta manera, si queremos iniciar el Database Manager desde la consola, tenemos que ubicarnos en el directorio <i>"C:\hsqldb-2.3.3\hsqldb-2.3.3"</i> y ejecutar este comando en la consola:<br/><br/>
<div align="left" style="font-size:10.0pt;color:rgb(0,0,255);">
java -cp hsqldb/lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing
</div>
<br/><br/>
O podemos ir directamente a la ubicación del archivo batch del Database Manager (<strong>runManagerSwing.bat</strong>), que está en el directorio <i>C:\hsqldb-2.3.3\hsqldb-2.3.3\hsqldb\bin</i> y ejecutarlo. Las dos opciones inician el Manager.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGxkW1B-xpMXqgpLMtHFy58RpLrRtgZEIMBpzDbLlMENVTMTZcOtPEpFIm5WzO_QYQKor-h-fskH2jxQdBe1rFG42Tw50R5MdkDwdxRFONJV9ZIFKB5hNjcN8oQyk7WTrWAivGDuR0R6I/s1600/DatabaseManagerDatoJavaHSQLDB.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Database Manager HSQLDB" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGxkW1B-xpMXqgpLMtHFy58RpLrRtgZEIMBpzDbLlMENVTMTZcOtPEpFIm5WzO_QYQKor-h-fskH2jxQdBe1rFG42Tw50R5MdkDwdxRFONJV9ZIFKB5hNjcN8oQyk7WTrWAivGDuR0R6I/s1600/DatabaseManagerDatoJavaHSQLDB.png">
</a>
<figcaption>
Database Manager HSQLDB
</figcaption>
</figure>
</div>
Para conectarnos al mismo catalogo que hemos creado anteriormente tenemos que configurar la conexión de esta manera:
<ul>
<li><strong>Setting Name: </strong>ingresamos el nombre "<strong>DatoJava</strong>"</li>
<li><strong>Type: </strong>HSQL Database Engine Server</li>
<li><strong>Driver: </strong>org.hsqldb.jdbcDriver</li>
<li><strong>URL: </strong>jdbc:hsqldb:hsql://localhost/mdb</li>
<li><strong>User: </strong>SA</li>
<li><strong>Password: </strong></li>
</ul>
Ya con esa configuración podemos hacer consultas/actualizaciones en nuestro Catalogo:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN-ja98eLBZJo3TA-UIRpSRvrLdBYLcyPPrlKtbBWmar-LgDwRc-CgF8K72dammPF7NKfvD7y6HPGrzfYSgMtxlpf-Yd_AOHv_gqQqTJQYT1NJP7yOMBgcpD0gJ45otjImk0oGdKgqca4/s1600/DatabaseManagerDatoJavaHSQLDB1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Database Manager HSQLDB" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN-ja98eLBZJo3TA-UIRpSRvrLdBYLcyPPrlKtbBWmar-LgDwRc-CgF8K72dammPF7NKfvD7y6HPGrzfYSgMtxlpf-Yd_AOHv_gqQqTJQYT1NJP7yOMBgcpD0gJ45otjImk0oGdKgqca4/s1600/DatabaseManagerDatoJavaHSQLDB1.png">
</a>
<figcaption>
Database Manager HSQLDB
</figcaption>
</figure>
</div>
Por ejemplo si queremos crear una tabla nueva en nuestro catalogo "<b>miBaseDeDatos</b>", ejecutamos este script en el Database Manager:
<pre class="brush: sql;">
CREATE TABLE usuario (
ID varchar(6) PRIMARY KEY,
nombre varchar(20) NOT NULL,
apellido varchar(20) NOT NULL,
login varchar(20) NOT NULL,
clave varchar(20) NOT NULL,
);
</pre>
Podemos ver en la imagen que ya fue creada la tabla.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6eoT8-mCI5FVAQp44TzX0Eyv8NY-nP2p2-2sztLH5KgfA4H6Rf-vmAFGFQhe7lu-uWZp1nsf5ObMeneJOFahIM9oJwjjAZB2vOvdfRifWNscFqDJzK3sRlTnPbso0SM7x0b-qQEv59UU/s1600/DatabaseManagerDatoJavaHSQLDB2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Create Table HSQLDB" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6eoT8-mCI5FVAQp44TzX0Eyv8NY-nP2p2-2sztLH5KgfA4H6Rf-vmAFGFQhe7lu-uWZp1nsf5ObMeneJOFahIM9oJwjjAZB2vOvdfRifWNscFqDJzK3sRlTnPbso0SM7x0b-qQEv59UU/s1600/DatabaseManagerDatoJavaHSQLDB2.png">
</a>
<figcaption>
Create Table HSQLDB
</figcaption>
</figure>
</div>
Para cerrar la Base De Datos tenemos que ejecutar <strong>SHUTDOWN</strong>, al ejecutar ese script todos los archivos se guardan de tal forma que la próxima vez que volvamos a conectarnos al catalogo, este abrirá rápidamente. La mejor opción de cerrar la Base De Datos es con <strong>SHUTDOWN COMPACT</strong>, este script sobrescribe el archivo <i>.data</i> que contiene información en CACHE acerca de las tablas y lo comprime al tamaño mínimo, se usa casi siempre y más aún cuando hacemos muchos inserts, updates, deletes, ya que ese archivo guarda esa información y el tamaño del archivo suele crecer rápidamente. Al ejecutarlo se cierra la conexión al catalogo:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNraXo2PvwSnypAJMQu8wohXdoYMoUjVT-CgSiD3U8bpzut5yrf7yqSQh96sQYT3LwLUc_5N14kZkwyQe__dbjfdTiZBO676hfTazRywyQd_3kCw7mdTibGIOLcBHDEH_g2j90W1ZSNs/s1600/ShutdownCompactDatoJavaHSQLDB.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="SHUTDOWN COMPACT HSQLDB" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRNraXo2PvwSnypAJMQu8wohXdoYMoUjVT-CgSiD3U8bpzut5yrf7yqSQh96sQYT3LwLUc_5N14kZkwyQe__dbjfdTiZBO676hfTazRywyQd_3kCw7mdTibGIOLcBHDEH_g2j90W1ZSNs/s1600/ShutdownCompactDatoJavaHSQLDB.png">
</a>
<figcaption>
SHUTDOWN COMPACT HSQLDB
</figcaption>
</figure>
</div>
Ya no podremos hacer nada a la base de datos porque el servidor no está corriendo.
<br/><br/>
Para <u>correr el servidor desde una aplicación Java</u> hay que crear una instancia del Servidor y asignarle las propiedades correspondientes. Con este código podemos iniciar el servidor desde nuestra aplicación:
<pre class="brush: java;">
//....
HsqlProperties hsqlProperties = new HsqlProperties();
hsqlProperties.setProperty("server.database.0",
"file:C:/hsqldb-2.3.3/hsqldb-2.3.3/DatoJava/HSQLDB/miBaseDeDatos");
hsqlProperties.setProperty("server.dbname.0", "mdb");
Server server = new Server();
server.setProperties(hsqlProperties);
server.setTrace(false); // No queremos loguear todo
server.start();
//...
</pre>
Como vemos nos estamos conectando al mismo catalogo que creamos anteriormente (<i>C:/hsqldb-2.3.3/hsqldb-2.3.3/DatoJava/HSQLDB/miBaseDeDatos</i>). Mientras no ejecutemos el script "<strong>SHUTDOWN COMPACT</strong>" la conexión queda abierta y cualquier aplicación se puede conectar, incluyendo el Database Manager.
</ul>
<a name="creacionProyecto"></a><h4>4. Creación del proyecto Java.</h4><br/>
Como la idea del Tutorial es desde una aplicación Java, vamos a crear desde nuestro IDE un simple "<b>Java Project</b>". Para eso recordamos que vamos a la opción de <i>File> New> Java Project.</i>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZcYMxEQmFo-M666XFOG7El9yEd8e_vEZ99_M3Bg-JU9bA9HLgMYES7_eGQ-DNOnWsiuwpfeFQMRCNqGA5HIKVBg8njTFjt1dlH-D43Y849kAgZNHxCYJIJG2KALeZkGOYAAiNLD3NeHA/s1600/NewJavaProject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="imagen New Project" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZcYMxEQmFo-M666XFOG7El9yEd8e_vEZ99_M3Bg-JU9bA9HLgMYES7_eGQ-DNOnWsiuwpfeFQMRCNqGA5HIKVBg8njTFjt1dlH-D43Y849kAgZNHxCYJIJG2KALeZkGOYAAiNLD3NeHA/s1600/NewJavaProject.png">
</a>
<figcaption>
Nuevo Java Project.
</figcaption>
</figure>
</div>
Le vamos a dar el nombre de <code class="codigo">HSQLDBDatoJava</code>, importamos el archivo <code class="codigo">hsqldb.jar</code> que está en el directorio <i>C:\hsqldb-2.3.3\hsqldb-2.3.3\hsqldb\lib</i> al classpath de nuestro proyecto. Ahora vamos a crear un paquete llamado <code class="codigo">datojava.hsqldb.main</code> y en el mismo vamos a crear una clase llamada <code class="codigo">DJHSQLDBMain</code>. Hasta ahora la estructura de nuestro proyecto debería verse así:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRB4NotdFC9MI4gZEssACinGIaIMaYyjFq24UEeCP5ljC_M3mobh_2_aQJovbFZ2Le_BRjdMBaQKps_aL_ggPBZEbehQRh0HVZ0Qc1bm1fguF4dx3q-H8L-UKQK9WNDanBlfLC7E4Bcfo/s1600/EstructuraHSQLDBDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="imagen estructura proyecto" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRB4NotdFC9MI4gZEssACinGIaIMaYyjFq24UEeCP5ljC_M3mobh_2_aQJovbFZ2Le_BRjdMBaQKps_aL_ggPBZEbehQRh0HVZ0Qc1bm1fguF4dx3q-H8L-UKQK9WNDanBlfLC7E4Bcfo/s1600/EstructuraHSQLDBDatoJava.png">
</a>
<figcaption>
Estructura proyecto
</figcaption>
</figure>
</div>
En la clase <code class="codigo">DJHSQLDBMain</code> vamos hacer lo siguiente:
<ul>
<li>Iniciar el servidor desde la aplicación.</li>
<li>Conectarnos al mismo catalogo (miBaseDeDatos).</li>
<li>Insertar algunos registros en la tabla <code class="codigo">usuario</code>.</li>
<li>Obtener los registros de la tabla.</li>
</ul>
Vamos a ir detallando por bloques de código el funcionamiento de la clase, para implementar lo anterior necesitamos algunas variables en nuestra clase:
<pre class="brush: java;">
package datojava.hsqldb.main;
import java.beans.Statement;
import java.sql.Connection;
import java.sql.ResultSet;
/**
* @author http://datojava.blogspot.com
*/
public class DJHSQLDBMain {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
</pre>
Creamos las variables normales para conectarnos, insertar/actualizar registros y obtenerlos, ahora procedemos a correr el servidor desde la aplicación dentro del <code class="codigo">try-catch</code>:
<pre class="brush: java;">
try {
HsqlProperties hsqlProperties = new HsqlProperties();
hsqlProperties
.setProperty("server.database.0",
"file:C:/hsqldb-2.3.3/hsqldb-2.3.3/DatoJava/HSQLDB/miBaseDeDatos");
hsqlProperties.setProperty("server.dbname.0", "mdb");
Server server = new Server();
server.setProperties(hsqlProperties);
server.setTrace(false); // No queremos loguear todo
server.start();
} catch (Exception ex) {
ex.printStackTrace();
}
</pre>
Una vez que ya iniciamos el servidor vamos a obtener la conexión:
<pre class="brush: java;">
try {
//Iniciamos el servidor
//...
connection = DriverManager.getConnection(
"jdbc:hsqldb:hsql://localhost/mdb", "SA", "");
} catch (Exception ex) {
ex.printStackTrace();
}
</pre>
Insertamos algunos registros:
<pre class="brush: java;">
try{
// Iniciamos el servidor
// obtenemos la conexion
// ...
statement = connection.createStatement();
statement
.executeUpdate("INSERT INTO usuario VALUES ('1', 'pedro', 'suarez', 'p.suarez', '12345');");
statement
.executeUpdate("INSERT INTO usuario VALUES ('2', 'pablo', 'martinez', 'p.martinez', '12345');");
statement
.executeUpdate("INSERT INTO usuario VALUES ('3', 'pepe', 'peres', 'p.perez', '12345');");
} catch (Exception ex) {
ex.printStackTrace();
}
</pre>
Obtenemos los registros de la tabla <code class="codigo">usuario</code>
<pre class="brush: java;">
try{
// Iniciamos el servidor
// obtenemos la conexion
// Insertamos registros
// ...
resultSet = statement.executeQuery("SELECT * FROM usuario");
while (resultSet.next()) {
System.out.println("---Usuario---");
System.out.println("ID: " + resultSet.getString(1));
System.out.println("Nombre: " + resultSet.getString(2));
System.out.println("Apellido: " + resultSet.getString(3));
}
} catch (Exception ex) {
ex.printStackTrace();
}
</pre>
Ya con eso terminamos de implementar la clase, como estamos haciendo uso de la clase para aprender a utilizar HSQLDB con Java, sería bueno ejecutar un <strong>SHUTDOWN COMPACT</strong>, siempre y cuando no vallamos a utilizar el Database Manager en el mismo catalogo, este es el codigo completo de la clase:<br/><br/>
<div align="left" style="font-size:9.0pt;color:rgb(126,180,255);">
<strong>DJHSQLDBMain.java</strong>
</div>
<pre class="brush: java;">
package datojava.hsqldb.main;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import org.hsqldb.Server;
import org.hsqldb.persist.HsqlProperties;
/**
* @author http://datojava.blogspot.com
*/
public class DJHSQLDBMain {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
HsqlProperties hsqlProperties = new HsqlProperties();
hsqlProperties
.setProperty("server.database.0",
"file:C:/hsqldb-2.3.3/hsqldb-2.3.3/DatoJava/HSQLDB/miBaseDeDatos");
hsqlProperties.setProperty("server.dbname.0", "mdb");
Server server = new Server();
server.setProperties(hsqlProperties);
server.setTrace(false);
System.out.println(server.getState() + " "
+ server.getStateDescriptor());
server.start();
connection = DriverManager.getConnection(
"jdbc:hsqldb:hsql://localhost/mdb", "SA", "");
statement = connection.createStatement();
statement
.executeUpdate("INSERT INTO usuario VALUES ('1', 'pedro', 'suarez', 'p.suarez', '12345');");
statement
.executeUpdate("INSERT INTO usuario VALUES ('2', 'pablo', 'martinez', 'p.martinez', '12345');");
statement
.executeUpdate("INSERT INTO usuario VALUES ('3', 'pepe', 'peres', 'p.perez', '12345');");
resultSet = statement.executeQuery("SELECT * FROM usuario");
while (resultSet.next()) {
System.out.println("---Usuario---");
System.out.println("ID: " + resultSet.getString(1));
System.out.println("Nombre: " + resultSet.getString(2));
System.out.println("Apellido: " + resultSet.getString(3));
}
// Opcional para detener el Servidor
statement.executeQuery("SHUTDOWN COMPACT");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
</pre>
Si compilamos nuestra aplicación podemos observar que esto es lo que imprime en la consola:
<pre>
[Server@e09713]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@e09713]: [Thread[main,5,main]]: checkRunning(false) exited
16 SHUTDOWN
[Server@e09713]: Initiating startup sequence...
[Server@e09713]: Server socket opened successfully in 5 ms.
[Server@e09713]: Database [index=0, id=0, db=file:C:/hsqldb-2.3.3/hsqldb-2.3.3/DatoJava/HSQLDB/
miBaseDeDatos, alias=mdb] opened sucessfully in 198 ms.
[Server@e09713]: Startup sequence completed in 204 ms.
[Server@e09713]: 2015-11-06 15:23:27.794 HSQLDB server 2.3.3 is online on port 9001
[Server@e09713]: To close normally, connect and execute SHUTDOWN SQL
[Server@e09713]: From command line, use [Ctrl]+[C] to abort abruptly
---Usuario---
ID: 1
Nombre: pedro
Apellido: suarez
---Usuario---
ID: 2
Nombre: pablo
Apellido: martinez
---Usuario---
ID: 3
Nombre: pepe
Apellido: perez
[Server@e09713]: Initiating shutdown sequence...
[Server@e09713]: Shutdown sequence completed in 100 ms.
[Server@e09713]: 2015-11-06 15:23:28.444 SHUTDOWN : System.exit() was not called
</pre>
Lo que quiere decir que inserto los datos correctamente en la tabla <code class="codigo">usuario</code> y que todo está funcionando bien, este ejemplo fue utilizando un catalogo creado fuera de nuestra aplicación, pero en el caso de que queramos que nuestro catalogo este dentro de la aplicación, tenemos que cambiar la dirección del catalogo al momento de iniciar el servidor.
<pre class="brush: java;">
HsqlProperties hsqlProperties = new HsqlProperties();
hsqlProperties
.setProperty("server.database.0",
"file:DatoJava/HSQLDB/miBaseDeDatos");
hsqlProperties.setProperty("server.dbname.0", "mdb");
</pre>
Solo con eso crearemos el catalogo dentro de nuestra aplicación, y así toda la información estará dentro de nuestra aplicación, <a href="https://mega.nz/#!rIUXjY6J!3Ltr3Xt03yIYQsqwkEsvzw9a5IS_1QNvBtOqX7Hgijw" target="_blank">aquí</a> puedes descargar el proyecto Java de este Tutorial, recuerda que este <strong>DatoJava</strong> de HSQLDB es básico, queda de tu parte desarrollar más conocimientos acerca del tema, Suerte no olvides comentar y compartir la entrada.
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
</article>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html"><strong>Tutorial de aplicación Java Swing.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.pe/2014/10/primeraAplicacionPrimefaces.html"><strong>Tutorial de Primefaces.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.pe/2015/02/junitMatchersHamcrestTutorial.html"><strong>Tutorial de JUnit Matchers y Hamcrest.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.pe/2014/11/queryDinamicoFiltrosPlsql.html"><strong>Query dinamico PL/SQL y MySql .</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/08756167057085960841noreply@blogger.com5tag:blogger.com,1999:blog-9116102449526922332.post-32376327812152755332015-09-24T10:50:00.000-07:002016-06-06T14:38:41.037-07:00 Enviar correo Java. JavaMail.<html>
<head>
<title>
Enviar correo Java. JavaMail.
</title>
<style>
h1, h4 {
color:#0b5394;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
.contenidos{
background-color:white;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
.numIndice{
color:#0b5394;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Tutorial para enviar correo desde Java. JavaMail.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
Enviar correos desde Java es necesario en la mayoría de los sistemas, ya sea para utilizar la funcionalidad para notificar algún suceso, enviar alguna información, enviar correos masivos con promociones a tus clientes, enviar reportes adjuntos a quien sea necesario, puedes utilizar esto para hacer grandes cosas, en este Tutorial para enviar correos con JavaMail vamos hacer varios ejemplos básicos y así tu podrás utilizar la funcionalidad para el propósito que necesites. Para llevar a cabo este tutorial necesitas tener una cuenta de <strong>Gmail</strong>, desde la cual vamos a enviar los correos.
<br/><br/>
<div class="contenidos">
<h1>Tabla De Contenidos</h1>
<br/>
<a href="http://datojava.blogspot.pe/2015/09/enviarCorreoJavamailEjemplos.html#javamail"><strong> 1. Descargar la API JavaMail.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/09/enviarCorreoJavamailEjemplos.html#creacionProyecto"><strong> 2. Creación del proyecto Java para enviar correos.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/09/enviarCorreoJavamailEjemplos.html#enviarCorreoBasicoJava"><strong> 3. Enviar correo con mensaje básico (Varios Destinatarios).</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/09/enviarCorreoJavamailEjemplos.html#enviarCorreoBasicoAdjJava"><strong> 4. Enviar correo con mensaje básico y un archivo adjunto.</strong></a><br/>
<a href="http://datojava.blogspot.pe/2015/09/enviarCorreoJavamailEjemplos.html#enviarCorreoJavaHTML"><strong> 5. Enviar correo con formato HTML (Tipo Notificación).</strong></a><br/>
</div>
<br/>
<a name='more'></a>
<a name="javamail"></a><h4>1. Descargar la API JavaMail.</h4><br/>
Para enviar correo desde java tenemos que descargar la API <strong>JavaMail</strong> desde su <a href="https://java.net/projects/javamail/pages/Home#Download_JavaMail_Release" target="_blank">pagina oficial</a>, para añadirla a nuestro proyecto, vamos hacer este tutorial con la versión <u>javax.mail-1.5.4.jar</u> de JavaMail.<br/><br/>
<a name="creacionProyecto"></a><h4>2. Creación del proyecto Java para enviar correos.</h4><br/>
Para comenzar vamos a crear un proyecto nuevo en nuestro IDE (En este caso utilizo JBoss Developer Studio, eclipse) y le pondremos el nombre de <code class="codigo">CorreosDatoJava</code>, creamos un paquete nuevo llamado <code class="codigo">correosDJ</code>, y vamos a importar a el build path del proyecto la librería que descargamos <u>javax.mail-1.5.4.jar</u>. Hasta ahora la estructura del proyecto debería verse así:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYv2Sll4bq8d7QjUfHluqXX82bZKe5d46PPhvQkd2W9SZ4dHLsL0ICAMBufv7PVMJC7Q3smimWUoUv2wP7hO-Twfen-3i4M6B3Gth9cqXXS0znyUneGpTWF1J9aP5llGGr57TKVRkQbQA/s1600/EstructuraJavaMail.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Estructura Del Proyecto JavaMail" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYv2Sll4bq8d7QjUfHluqXX82bZKe5d46PPhvQkd2W9SZ4dHLsL0ICAMBufv7PVMJC7Q3smimWUoUv2wP7hO-Twfen-3i4M6B3Gth9cqXXS0znyUneGpTWF1J9aP5llGGr57TKVRkQbQA/s1600/EstructuraJavaMail.png">
</a>
<figcaption>
Estructura del Proyecto.
</figcaption>
</figure>
</div>
<a name="enviarCorreoBasicoJava"></a><h4>3. Enviar correo con mensaje básico (Varios Destinatarios).</h4><br/>
En este primer ejemplo vamos a crear una clase en el paquete <code class="codigo">correosDJ</code> en la cual vamos a implementar la funcionalidad para enviar un correo basico, al decir basico, me refiero a que tendrá como contenido un texto simple y será enviado a varios destinatarios. La clase lleva por nombre <code class="codigo">DJCorreoTexto</code> y tiene su metodo <code class="codigo">static void main(String[] args)</code>. Este es el código:
<br/>
<div align="left" style="font-size:9.0pt;color:rgb(126,180,255);">
<strong>DJCorreoTexto.java</strong>
</div>
<pre class="brush: java; highlight: [21,22,25,26,27,28,29,30,31,34,38,41,44,45,46,47,50,51,54,57,58,68,69,70,71]">
package correosDJ;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
* @author datojava.blogspot.com
*/
public class DJCorreoTexto {
public void mandarCorreo() {
// El correo gmail de envío
String correoEnvia = "tuCorreo@gmail.com";
String claveCorreo = "tu clave";
// La configuración para enviar correo
Properties properties = new Properties();
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.port", "587");
properties.put("mail.smtp.auth", "true");
properties.put("mail.user", correoEnvia);
properties.put("mail.password", claveCorreo);
// Obtener la sesion
Session session = Session.getInstance(properties, null);
try {
// Crear el cuerpo del mensaje
MimeMessage mimeMessage = new MimeMessage(session);
// Agregar quien envía el correo
mimeMessage.setFrom(new InternetAddress(correoEnvia, "Dato Java"));
// Los destinatarios
InternetAddress[] internetAddresses = {
new InternetAddress("correo1@gmail.com"),
new InternetAddress("correo2@gmail.com"),
new InternetAddress("correo3@gmail.com") };
// Agregar los destinatarios al mensaje
mimeMessage.setRecipients(Message.RecipientType.TO,
internetAddresses);
// Agregar el asunto al correo
mimeMessage.setSubject("Dato Java Enviando Correo.");
// Creo la parte del mensaje
MimeBodyPart mimeBodyPart = new MimeBodyPart();
mimeBodyPart.setText("Siguiendo el Tutorial de datojava.blogspot.com envío el correo.");
// Crear el multipart para agregar la parte del mensaje anterior
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(mimeBodyPart);
// Agregar el multipart al cuerpo del mensaje
mimeMessage.setContent(multipart);
// Enviar el mensaje
Transport transport = session.getTransport("smtp");
transport.connect(correoEnvia, claveCorreo);
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
transport.close();
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("Correo enviado");
}
public static void main(String[] args) {
DJCorreoTexto correoTexto = new DJCorreoTexto();
correoTexto.mandarCorreo();
}
}
</pre>
Viendo el código apreciamos que no es nada de otro mundo enviar correos utilizando la API de JavaMail, primero establecemos en variables desde donde vamos a enviar los correos (<b>21,22</b>), después configuramos los parámetros para el envió de correos, la misma configuración la hacemos utilizando <u>java.util.Properties</u> (<b>25..31</b>), obtenemos la sesión de JavaMail pasando como parámetro la configuración anterior (<b>34</b>), creamos el objeto <strong>MimeMessage</strong>, que básicamente es toda la información que comprende el mensaje enviado, quien envía el correo, el(los) destinatarios, el asunto... (<b>38..54</b>), después creamos el objeto <strong>MimeBodyPart</strong>, la parte que tiene el mensaje a enviar (<b>57,58</b>), creamos el objeto <strong>Multipart</strong> en el cual vamos agregar las partes (MimeBodyPart) del mensaje para posteriormente agregar dicho objeto al MimeMessage (<b>61..65</b>), enviamos el correo con el objeto <strong>Transport</strong> (<b>68..71</b>).
<br/>
<br/>
Para entender un poco más acerca del funcionamiento de JavaMail, puedes ver este grafico.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp3AWy4FJvXJfYT8RlCwlrE5akwcMWOX-90Fm4Y9OqU-6GXEZgma-tJXTzulKO_nT66lvYyUx5aeomKK4ssXP_1iIy-UhLBDlFRpYpFK1-lHWl5ozVbbKgHyWOxxHf2m-ubpomgASulF4/s320/EstructuraJavaMailCorreo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Capas del correo JavaMail" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp3AWy4FJvXJfYT8RlCwlrE5akwcMWOX-90Fm4Y9OqU-6GXEZgma-tJXTzulKO_nT66lvYyUx5aeomKK4ssXP_1iIy-UhLBDlFRpYpFK1-lHWl5ozVbbKgHyWOxxHf2m-ubpomgASulF4/s320/EstructuraJavaMailCorreo.png">
</a>
<figcaption>
Capas del correo JavaMail.
</figcaption>
</figure>
</div>
Al momento de ejecutar este ejemplo puede que te de un error por la seguridad que al día de hoy a implementado <strong>Gmail</strong> en sus correos, el error que salta en la consola es este, <u>javax.mail.AuthenticationFailedException: 534-5.7.14</u>, y si seguimos leyendo el log del error vemos que mas abajo nos dice:
<br/>
<div align="left" style="font-size:9.0pt;color:rgb( 255,000,000);">
<u>534-5.7.14 Learn more at</u>
<br/>
<u>34 5.7.14 https://support.google.com/mail/answer/78754</u></div>... En fin lo que quiere decir este error es que no está permitido que las aplicaciones menos seguras (nuestra aplicación) accedan a tu cuenta, para arreglar eso tenemos que habilitar esa opción en este <a href="https://www.google.com/settings/security/lesssecureapps" target="_blank">link</a> y listo.<br/>
Si todo va bien en la consola debería mostrarte "Correo enviado" y los destinatarios recibirán el correo en la bandeja de entrada de esta forma.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkPeN5TTxTPKJgkvqTRYJUDJvKCSl8Hxfn9wO93qeF-V7-z7eJ7iEcCysvZTb_fAsKy9fmYgz9oBISSaiARTfzQS0CbTC50sU9Mv9K5RRwSpVSBgassKKQhKC40CapRrv2dTrnlqJqjOg/s200/CorreoJavaMailDJ.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Correo Recibido JavaMail" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkPeN5TTxTPKJgkvqTRYJUDJvKCSl8Hxfn9wO93qeF-V7-z7eJ7iEcCysvZTb_fAsKy9fmYgz9oBISSaiARTfzQS0CbTC50sU9Mv9K5RRwSpVSBgassKKQhKC40CapRrv2dTrnlqJqjOg/s200/CorreoJavaMailDJ.png">
</a>
<figcaption>
Correo Recibido.
</figcaption>
</figure>
</div>
El contenido del mismo se vera así:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Bwl89hd-2fTzkgiZzNMuyHHv1GFCYooT0KVzAGcBD3uCEBdCGZuFFS8uKfpW0MKjOcoH9lEB6Y4bbMVr2Qm8S4K0nJ1UGZhaExSBTiJtrgszwAwJB36426L1ob1N8I36vLLuWSrCpW8/s1600/CorreoJavaMailDJ1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Contenido Del Correo JavaMail" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Bwl89hd-2fTzkgiZzNMuyHHv1GFCYooT0KVzAGcBD3uCEBdCGZuFFS8uKfpW0MKjOcoH9lEB6Y4bbMVr2Qm8S4K0nJ1UGZhaExSBTiJtrgszwAwJB36426L1ob1N8I36vLLuWSrCpW8/s1600/CorreoJavaMailDJ1.png">
</a>
<figcaption>
Mensaje Del Correo.
</figcaption>
</figure>
</div>
<a name="enviarCorreoBasicoAdjJava"></a><h4>4. Enviar correo con mensaje básico y un archivo adjunto.</h4><br/>
Básicamente es el mismo código anterior, solo que para agregar el archivo adjunto tenemos que crear otro objeto <strong>MimeBodyPart</strong>, al mismo le adjuntamos el archivo con el metodo <code class="codigo">attachFile(String File)</code>, no importa si es un archivo .pdf, .xlsx, .txt, .jpg, .docx... Es indiferente solo hay que pasarle como parámetro a ese método la url del archivo. Esta porción de código hay que añadirla al ejemplo anterior:
<pre class="brush: java;">
MimeBodyPart mimeBodyPartAdjunto = new MimeBodyPart();
mimeBodyPartAdjunto.attachFile("C:/Users/datojava/DatoJava.docx");
// Resto del codigo...
//
//
// Agregarlo al MultiPart
multipart.addBodyPart(mimeBodyPartAdjunto);
</pre>
Si no hay errores así se vería en la bandeja de entrada:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1SWmHZD71CRnknd7o5ViABne6xI4hY6LZFtBZmkwctwO55xFtDx3hvjmWVY_QAYmAjW6JdouW4psUelTDWoP_q6tX0nrbC8hNBOQvSdCgkh65UQmAmzMIZgdypspd0GsDAz6vC8DOwpw/s1600/CorreoJavaMailDJ2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Correo Archivo adjunto recibido" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1SWmHZD71CRnknd7o5ViABne6xI4hY6LZFtBZmkwctwO55xFtDx3hvjmWVY_QAYmAjW6JdouW4psUelTDWoP_q6tX0nrbC8hNBOQvSdCgkh65UQmAmzMIZgdypspd0GsDAz6vC8DOwpw/s1600/CorreoJavaMailDJ2.png">
</a>
<figcaption>
Correo con archivo adjunto recibido.
</figcaption>
</figure>
</div>
Y al abrir el correo se visualiza de esta manera:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrBgrXw12MaA7a8oJhjhz1K6OgyDeXWyf3TWzbe9nRLiL0s7bjT8_6P3l4CbDrZT64_uvoArClLX8psRmubbm0ssRsxEOXGfV0FDhypL0dqjLh3q0rFH69iLBSIHkzGaudoYBw6PjsO48/s1600/CorreoJavaMailDJ3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Contenido del correo adjunto JavaMail" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrBgrXw12MaA7a8oJhjhz1K6OgyDeXWyf3TWzbe9nRLiL0s7bjT8_6P3l4CbDrZT64_uvoArClLX8psRmubbm0ssRsxEOXGfV0FDhypL0dqjLh3q0rFH69iLBSIHkzGaudoYBw6PjsO48/s1600/CorreoJavaMailDJ3.png">
</a>
<figcaption>
Mensaje del correo con archivo adjunto
</figcaption>
</figure>
</div>
<a name="enviarCorreoJavaHTML"></a><h4>5. Enviar correo con formato HTML (Tipo Notificación).</h4><br/>
Aquí si hay un poco de diferencia al código anterior, en realidad la configuración del correo siempre será la misma (por lo menos en este ejemplo), lo que cambia ahora es que queremos mandar dentro del correo, un mensaje hecho en <strong>html</strong>, no vamos a crear un simple "Hola Mundo", vamos hacer algo chévere y sencillo con imágenes para que no quede duda de cómo se implementa. Vamos a mostrar el código por partes para ir explicando poco a poco.
<br/>
Primero vamos a crear un archivo en nuestro IDE, <u><i>new> other> File</i></u>, que llevará por nombre <code class="codigo">PlantillaDJ</code>, en esta plantilla hacemos el código html para posteriormente pintarlo en el mensaje. Vamos hacer un mensaje de notificación para un cliente que acaba de comprar un producto en nuestra tienda, así se verá el <strong>mensaje HTML</strong> en el cuerpo del correo:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8uyGcls9TI1kkgah70zat_7Fi1Au4emHosAua5ipGiHNIPfiLRPVRzb-p3__gc3aakZneK1to8jNfBYyBEaHODGSE7qUqqPaPhPSjjFfHeTGZKn9nVEwqqd4o3O5oPFYFgbKYGPwPokY/s1600/CorreoHTMLDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Correo HTML" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8uyGcls9TI1kkgah70zat_7Fi1Au4emHosAua5ipGiHNIPfiLRPVRzb-p3__gc3aakZneK1to8jNfBYyBEaHODGSE7qUqqPaPhPSjjFfHeTGZKn9nVEwqqd4o3O5oPFYFgbKYGPwPokY/s1600/CorreoHTMLDatoJava.png">
</a>
<figcaption>
Correo HTML
</figcaption>
</figure>
</div>
Y para obtener el mensaje anterior este es el código <strong>html</strong>:
<br/>
<br/>
<div align="left" style="font-size:9.0pt;color:rgb(126,180,255);">
<strong>PlantillaDJ</strong>
</div>
<div class="contenidos">
<pre class="brush: xml;">
<html>
<body>
<div align="center">
<img src="cid:datojava.png"/>
</div>
<div align="center">
<font face="Candara" size="6">
Estimado Cliente, le informamos que su compra
<br/>
se realizo con éxito.
<br/>
<br/>
Puede retirar su compra de lunes a viernes
<br/>
en horario corrido de 9:00am a 7:00pm.
</font>
</div>
<div align="center">
<font face="Candara" size="6">
<a pref="url">www.datojava.blogspot.com</a>
<br/>
<br/>
<img src="cid:gplus.png"/> +DatoJavaBlog
<br/>
<br/>
<img src="cid:icono.png"/>
<br/>
....Tutorial JavaMail. DatoJava....
</font>
</div>
</body>
</html>
</pre>
</div>
En el código de la plantilla podemos comentar que es un código relativamente "sencillo" de HTML, en el cual agregamos algunas imágenes de esta manera: <div align="left" style="font-size:9.0pt;color:rgb( 255,000,000);"><img src="cid:datojava.png"</div> para agregar la imagen al código la obtenemos del <code class="codigo">Content-ID</code> (cid) que vamos a crear en la clase <code class="codigo">DJCorreoHTML</code> que implementa esta plantilla.<br/><br/>
Ahora vamos a implementar la clase que se encarga de <u>enviar el correo con un mensaje HTML</u>, la vamos a llamar <code class="codigo">DJCorreoHTML</code> y seguimos con la misma configuración de Gmail, lo que tenemos que hacer ahora es leer la plantilla que hemos creado previamente e ir almacenándola en un <code class="codigo">StringBuffer</code> para luego enviar el correo, este es el código completo de la clase:
<br/><br/>
<div align="left" style="font-size:9.0pt;color:rgb(126,180,255);">
<strong>DJCorreoHTML</strong>
</div>
<pre class="brush: java; highlight: [62,63,64,65,68,69,70,71,72,75,76,79,82,83,86,87,89,90,91,92,93,94,95,96,97,98,99]">
package correosDJ;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
* @author datojava.blogspot.com
*/
public class DJCorreoHTML {
public void mandarCorreo() {
// El correo gmail de envío
String correoEnvia = "tuCorreo@gmail.com";
String claveCorreo = "tuClave";
// La configuración para enviar correo
Properties properties = new Properties();
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.port", "587");
properties.put("mail.smtp.auth", "true");
properties.put("mail.user", correoEnvia);
properties.put("mail.password", claveCorreo);
// Obtener la sesion
Session session = Session.getInstance(properties, null);
try {
// Crear el cuerpo del mensaje
MimeMessage mimeMessage = new MimeMessage(session);
// Agregar quien envía el correo
mimeMessage.setFrom(new InternetAddress(correoEnvia, "Dato Java"));
// Los destinatarios
InternetAddress[] internetAddresses = { new InternetAddress(
"correo1@gmail.com") };
// Agregar los destinatarios al mensaje
mimeMessage.setRecipients(Message.RecipientType.TO,
internetAddresses);
// Agregar el asunto al correo
mimeMessage.setSubject("Dato Java Enviando Correo HTML.");
// Crear el multipart para agregar la parte del mensaje anterior
Multipart multipart = new MimeMultipart();
// Leer la plantilla
InputStream inputStream = getClass().getResourceAsStream(
"PlantillaDJ");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(inputStream));
// Almacenar el contenido de la plantilla en un StringBuffer
String strLine;
StringBuffer msjHTML = new StringBuffer();
while ((strLine = bufferedReader.readLine()) != null) {
msjHTML.append(strLine);
}
// Url del directorio donde estan las imagenes
String urlImagenes = "url del directorio donde estan las imagenes";
File directorio = new File(urlImagenes);
// Obtener los nombres de las imagenes en el directorio
String[] imagenesDirectorio = directorio.list();
// Creo la parte del mensaje HTML
MimeBodyPart mimeBodyPart = new MimeBodyPart();
mimeBodyPart.setContent(msjHTML.toString(), "text/html");
// Validar que el directorio si tenga las imagenes
if (imagenesDirectorio != null) {
for (int count = 0; count < imagenesDirectorio.length; count++) {
MimeBodyPart imagePart = new MimeBodyPart();
imagePart.setHeader("Content-ID", "<"
+ imagenesDirectorio[count] + ">");
imagePart.setDisposition(MimeBodyPart.INLINE);
imagePart.attachFile(urlImagenes
+ imagenesDirectorio[count]);
multipart.addBodyPart(imagePart);
}
} else {
System.out.println("No hay imagenes en el directorio");
}
// Agregar la parte del mensaje HTML al multiPart
multipart.addBodyPart(mimeBodyPart);
// Agregar el multipart al cuerpo del mensaje
mimeMessage.setContent(multipart);
// Enviar el mensaje
Transport transport = session.getTransport("smtp");
transport.connect(correoEnvia, claveCorreo);
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
transport.close();
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("Correo enviado");
}
public static void main(String[] args) {
DJCorreoHTML correoHTML = new DJCorreoHTML();
correoHTML.mandarCorreo();
}
}
</pre>
El código comienza a cambiar desde la línea <b>61</b>, en la cual comenzamos a leer y almacenar el contenido de la plantilla en un <code class="codigo">StringBuffer</code> (<b>62..72</b>), como el mensaje del correo posee algunas imágenes, la mejor manera es colocar las imágenes que vamos a utilizar en un mismo directorio, y así en <strong>Java</strong> indicamos el directorio donde están las imágenes y obtenemos sus nombres (<b>74..79</b>), después creamos el <strong>MimeBodyPart</strong> en el cual establecemos que es de tipo HTML y también agregamos el contenido de la plantilla almacenada en el <code class="codigo">StringBuffer</code> (<b>82,83</b>), validamos que el directorio no este vacío, si todo va bien vamos a crear un <strong>MimeBodyPart</strong> por cada imagen encontrada, en el header establecemos el <code class="codigo">Content-ID</code> con el nombre de cada imagen encontrada y así podemos añadirla al codigo HTML, sucesivamente cada imagen la agregamos al <strong>Multipart</strong> (<b>86..99</b>), el resto se mantiene igual a los ejemplos anteriores.
<br/>
<br/>
Si todo está bien el correo deberíamos recibirlo de esta manera
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgntIdbITX71hPmMIUsDgq8TrTjwLHDKq9CEN0YhZgscEs3T3xCkdvQMfsCB3LrdNLKUeF6QVpH7Dw2RL2whdPy68q_kaKcyYNj2tm8WQKoBx9V0aC4XjmHkCR5ZVueQir6qP3B-i_G_K4/s1600/CorreoRecHTMLDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Correo HTML Recibido" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgntIdbITX71hPmMIUsDgq8TrTjwLHDKq9CEN0YhZgscEs3T3xCkdvQMfsCB3LrdNLKUeF6QVpH7Dw2RL2whdPy68q_kaKcyYNj2tm8WQKoBx9V0aC4XjmHkCR5ZVueQir6qP3B-i_G_K4/s1600/CorreoRecHTMLDatoJava.png">
</a>
<figcaption>
Correo HTML Recibido
</figcaption>
</figure>
</div>
Ya con este <u>Tutorial para enviar correos desde Java utilizando JavaMail</u> podemos implementar nuestras clases como mejor nos parezca, estos son ejemplos básicos para que ustedes se extiendan si así lo necesitan, ya queda de parte de ustedes, aquí les dejo el proyecto creado para que lo <a href="https://mega.nz/#!CFkhiLxT!KyP53eFjvn13L-Dl3KkaUTbnelkb-lue-3fXkiQAF6o" target="_blank">descarguen</a>, Suerte.
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
</article>
<br/>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/dosJbossMismaMaquina.html"><strong>Como instalar dos JBoss en la misma maquina. JBoss de pruebas</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html"><strong>Tutorial de aplicación Java Swing.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/junitEclipseJbossTutorial.html"><strong>Pruebas unitarias con JUnit, Tutorial de JUnit.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.pe/2015/11/TutorialJavaHSQLDB.html"><strong>Tutorial de Java con HSQLDB.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/08756167057085960841noreply@blogger.com36tag:blogger.com,1999:blog-9116102449526922332.post-73554821983385277122015-08-14T15:36:00.000-07:002016-07-21T07:29:32.101-07:00Diferencia entre override vs overload<html>
<head>
<title>
Diferencia entre override vs overload
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Diferencia entre override vs overload, como implementarlos.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
Cuando estamos comenzando a programar en <strong>Java</strong> tendemos a confundirnos con muchos conceptos ya que algunos son muy parecidos, en este caso vamos hacer una breve explicación para ver cuáles son las <u><strong>diferencias entre override y overload</strong></u>, estos conceptos son súper importantes en la programación orientada a objetos, se utilizan mucho y son una buena práctica de programación.<br/>
Para comenzar vamos hablar acerca de sus conceptos, cuando nos referimos a <u><strong>override en Java</strong></u>, estamos hablando de la sobrescritura de un método, para sobrescribir un método en Java tenemos que tener una ClaseHija que herede mínimo un método de una ClasePadre, la necesidad de sobrescribir un método se presenta ya que el hecho de que una ClaseHija herede de una ClasePadre no quiere decir que tienen que hacer lo mismo, para entender mejor, el hecho de que un padre tenga la responsabilidad de trabajar en una empresa no quiere decir que el hijo tenga que trabajar en la misma empresa.<br/>
Para aplicar esto en Java necesitamos hacerlo así:
<div align="left" style="color: #7eb4ff; font-size: 9.0pt;">
<b>ClasePadre</b>
</div>
<pre class="brush: java">
public class ClasePadre {
public String quienSoy() {
return "Soy la clase padre";
}
}
</pre>
<div align="left" style="color: #7eb4ff; font-size: 9.0pt;">
<b>ClaseHija</b>
</div>
<pre class="brush: java">
public class ClaseHija extends ClasePadre {
@Override
public String quienSoy() {
return "Soy la clase hija";
}
</pre>
Como vemos la ClaseHija tiene el mismo método que la ClasePadre con la anotación <code class="codigo">@Override</code>, lo que nos indica que es un método que no puede cambiar al de la ClasePadre, ni más ni menos parámetros, ya que solo lo estamos sobrescribiendo.
<br/>
<br/>
Ahora bien, cuando hablamos de <u><strong>overload en Java</strong></u>, nos referimos a sobrecargar un método, esto lo aplicamos en los constructores de las clases ya que hay veces que necesitamos más de un constructor, y al momento de implementarlo lo que hacemos es ponerle el mismo nombre que los demás pero con distintos parámetros, también es una buena práctica de programación utilizarlo para métodos que en realidad hacen lo mismo, por ejemplo:<br/>
Tenemos un método que busca clientes en nuestra base de datos, ese método solo busca clientes por sexo pero necesitamos otro método que aparte de buscar clientes por sexo también sea por edad, y en si los métodos lo que hacen es buscar clientes, así que le ponemos el mismo nombre pero con distintos parámetros, para implementarlo solo necesitamos este bloque de código:
<div align="left" style="color: #7eb4ff; font-size: 9.0pt;">
<b>Constructores:</b>
</div>
<pre class="brush: java">
public class Persona {
public String quienSoy() {
return "Soy una persona";
}
public String quienSoy(String nombre) {
return "Soy " + nombre;
}
public String quienSoy(String nombre, String apellido) {
return "Soy " + nombre + " " + apellido;
}
}
</pre>
<div align="left" style="color: #7eb4ff; font-size: 9.0pt;">
<b>Metodos:</b>
</div>
<pre class="brush: java">
public void buscarCliente(String Sexo) {
// Implementacion
}
public void buscarCliente(String Sexo, int edad) {
// Implementacion
}
public void buscarCliente(String Sexo, int edad, String empresa) {
// Implementacion
}
</pre>
Como vemos estamos sobrecargando el constructor de la clase <code class="codigo">Persona</code>, todo esto es muy fácil, poco a poco ve integrándolo en tus aplicaciones, no hay lugar para confusiones ya que los dos conceptos <u><strong>overload y override</strong></u> se aplican de distintas formas y no olvides la mayor diferencia entre los dos conceptos es que no hacen lo mismo, uno sobrescribe un metodo y el otro sobrecarga un metodo, este tema está muy ligado al <a href="http://datojava.blogspot.com/2015/08/polimorfismoJava.html" target="_blank">Polimorfismo en Java</a>, otro de los grandes pilares de la programación orientada a objetos. <br/>Si te ayudo la entrada no olvides compartir el conocimiento aprendido y si tienes alguna sugerencia puedes comentar, suerte!!
<br/>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
</article>
<br/>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2016/07/queEsHashMapYComoFunciona.html" target="_blank"><strong>Que es un HashMap y como funciiona.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/05/diferenciaEntreThrowyThrowsEnJava.html"><strong>Diferencia entre throw y throws Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/dosJbossMismaMaquina.html"><strong>Como instalar dos JBoss en la misma maquina. JBoss de pruebas</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html"><strong>Tutorial de aplicación Java Swing.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/junitEclipseJbossTutorial.html"><strong>Pruebas unitarias con JUnit, Tutorial de JUnit.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/08756167057085960841noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-18143659505500880572015-08-11T15:52:00.000-07:002016-07-21T07:29:20.674-07:00Polimorfismo Java<html>
<head>
<title>
Polimorfismo Java.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Polimorfismo Java, que es el polimorfismo y sus tipos.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
<strong>El Polimorfismo</strong> es uno de los conceptos generales que van de la mano con la programación orientada a objetos <strong>OOP</strong>, en si el polimorfismo en Java se refiere a las distintas formas que puede tener una variable, objeto o método creado.<br/>
Hay dos tipos establecidos de polimorfismo:<br/>
<ul>
<li type="circle">
El polimorfismo en tiempo de ejecución (<code class="codigo">runtime</code>) o dinámico, que lo podemos implementar con la sobre escritura (<code class="codigo">overriding</code>) de métodos.
</li>
<li type="circle">
El polimorfismo en tiempo de compilación (<code class="codigo">compile time</code>) o estático, que lo podemos implementar en la sobrecarga (<code class="codigo">overloading</code>) de métodos
</li>
</ul>
Te puede interesar: <a href="http://datojava.blogspot.com/2015/08/diferenciaEntreOverrideVSOverload.html" target="_blank">Diferencias entre override y overload</a>.<br/><br/>
Hay una confusión entre algunas programadores a la hora de aceptar que la sobrecarga de métodos también es un Polimorfismo, básicamente si nos fijamos en el concepto se podría afirmar que si, ya que el mismo método puede tomar distintas formas dependiendo de los parámetros recibidos, como ya aclaramos un poco lo que es la teoría vamos aplicar los dos tipos de Polimorfismo en la práctica.<br/><br/>
Polimorfismo en tiempo de ejecución (<code class="codigo">runtime</code>), es el más usado y se podría implementar con dos clases hijas que hereden de una clase padre. Este es el diagrama de clases del ejemplo:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLhIg6JNigPrtME9mNeuaP_AL7qnwWnNd9ji7Wt4GmCqe7P1B0JCaBpgZBesR7RbrsWoC_P1A_D25epTqoUC5F7TKVMvx3YiP8diCA2YRbeBP2rTMkX8v7ZrB1I2T3ZeXC3ZY3T4uZWAI/s1600/Diagrama+DatoJava+Polimorfismo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Polimorfismo Java" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLhIg6JNigPrtME9mNeuaP_AL7qnwWnNd9ji7Wt4GmCqe7P1B0JCaBpgZBesR7RbrsWoC_P1A_D25epTqoUC5F7TKVMvx3YiP8diCA2YRbeBP2rTMkX8v7ZrB1I2T3ZeXC3ZY3T4uZWAI/s1600/Diagrama+DatoJava+Polimorfismo.jpg">
</a>
<figcaption>
Polimorfismo Java
</figcaption>
</figure>
</div>
<a name='more'></a>
Como vemos en la imagen, hay una clase <code class="codigo">Persona</code> con un método que devuelve un <code class="codigo">String</code> y dos clases <code class="codigo">Hombre</code> y <code class="codigo">Mujer</code> que heredan de <code class="codigo">Persona</code>, ambas clases implementan el método de distinta manera y así logramos implementar el polimorfismo.
<br/><br/>
Clase <code class="codigo">Persona</code>:
<pre class="brush: java">
public class Persona {
public String quienSoy() {
return "Soy una persona";
}
}
</pre>
Clase <code class="codigo">Hombre</code>:
<pre class="brush: java">
public class Hombre extends Persona {
public String quienSoy() {
return "Soy un hombre";
}
}
</pre>
Clase <code class="codigo">Mujer</code>:
<pre class="brush: java">
public class Mujer extends Persona {
public String quienSoy() {
return "Soy una mujer";
}
}
</pre>
Compilar codigo:
<pre class="brush: java">
public static void main(String[] args) {
Persona persona = new Persona();
Persona persona2 = new Hombre();
Persona persona3 = new Mujer();
System.out.println(persona.quienSoy());
System.out.println(persona2.quienSoy());
System.out.println(persona3.quienSoy());
}
</pre>
Esta es la salida del ejemplo:<br/>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqaqF4iyF1smdVS3Iik2a3xD7KXvIZr01i2Y7Vf-6P99P7a6tDfomwOLdFas1OjZUYtfgUPlHB4eREgZyPAW-Igte2rUA2EOO9EkWVn97cCZ4PmBft2H7hi9kePj885oxQw5XjW0SeIgA/s200/salidaPolimorfismoDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Polimorfismo DatoJava" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqaqF4iyF1smdVS3Iik2a3xD7KXvIZr01i2Y7Vf-6P99P7a6tDfomwOLdFas1OjZUYtfgUPlHB4eREgZyPAW-Igte2rUA2EOO9EkWVn97cCZ4PmBft2H7hi9kePj885oxQw5XjW0SeIgA/s200/salidaPolimorfismoDatoJava.png">
</a>
<figcaption>
Polimorfismo DatoJava
</figcaption>
</figure>
</div>
En el código anterior a la hora de compilar instanciamos la clase <code class="codigo">Persona</code> de distintas formas y como en las clases <code class="codigo">Hombre</code> y <code class="codigo">Mujer</code> el método <code class="codigo">quienSoy</code> esta implementado de formas distintas podemos crear el Polimorfismo, se denomina polimorfismo en tiempo de ejecución (<code class="codigo">runtime</code>) o dinámico porque desde que comenzamos a sobrescribir los métodos en las clases hijas el compilador no tiene idea de cuál método vamos a llamar en tiempo de compilación <code class="codigo">compile time</code> y dada la situación la maquina virtual de java <b>JVM</b> entra en acción y en tiempo de ejecución <code class="codigo">runtime</code> decide a cual método invocar. <br/><br/>Cuando no entendemos muy bien el concepto del polimorfismo o subestimamos su potencial (a nivel de código) nos preguntaremos en que parte del código debería aplicar el polimorfismo, o que esto no sirve de mucho y solo es un concepto más de Java, la verdad es que el polimorfismo en Java es una herramienta que cualquier desarrollador debería aprender y comenzar aplicar en sus códigos, todas las súper librerías ponen en práctica el polimorfismo, las interfaces van de la mano con el polimorfismo.
<br/>
<br/>
Siguiendo con la entrada ahora vamos a ver el polimorfismo en tiempo de compilación (<code class="codigo">compile time</code>) en el que lo que hacemos es <u>sobrecarga de métodos</u>. No hay mucho que explicar aquí, este es el código:
<pre class="brush: java">
public String quienSoy() {
return "Soy una persona";
}
public String quienSoy(String nombre) {
return "Soy " + nombre;
}
public String quienSoy(String nombre, String apellido) {
return "Soy " + nombre + " " + apellido;
}
</pre>
El polimorfismo es en tiempo de ejecución (<code class="codigo">compile time</code>) porque tiene tres formas diferentes de invocarlo, y dada esta situación el compilador si puede resolver a que método invocar sin necesidad de que <b>JVM</b> intervenga, esto es todo en este <strong>Dato Java</strong>, es un concepto que a veces puede enredarnos, es algo sencillo, comienza de menos a más, en la práctica esta el profesional. Suerte, si tienes una duda o una acotación no olvides comentar, y si te gusto la entrada no olvides compartir el conocimiento.
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
</article>
<br/>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2016/07/queEsHashMapYComoFunciona.html" target="_blank"><strong>Que es un HashMap y como funciiona.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/05/diferenciaEntreThrowyThrowsEnJava.html"><strong>Diferencia entre throw y throws Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/junitEclipseJbossTutorial.html"><strong>JUnit Tutorial. Ejemplos de JUnit.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html"><strong>Tutorial de iReport con Oracle, Primefaces y Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html"><strong>Tutorial de aplicación Java Swing.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com2tag:blogger.com,1999:blog-9116102449526922332.post-23593534479975268092015-08-07T15:17:00.000-07:002016-06-06T14:47:07.740-07:00Ejemplo de un reporte pdf con iText desde Java.<html>
<head>
<title>
Ejemplo de un reporte pdf con iText desde Java.
</title>
<script language="javascript" type="text/javascript">
function mostrarOcultar(shID) {
if (document.getElementById(shID)) {
if (document.getElementById(shID+'-mas').style.display != 'none') {
document.getElementById(shID+'-mas').style.display = 'none';
document.getElementById(shID).style.display = 'block';
}
else {
document.getElementById(shID+'-mas').style.display = 'inline';
document.getElementById(shID).style.display = 'none';
}
}
}
</script>
<script type="text/javascript" src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushJava.js"></script>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
#wrap {
padding: 1em;
}
.more {
display: none;
}
a.mostrarLink, a.ocultarLink {
text-decoration: none;
color: #36f;
}
a.ocultarLink {
background: transparent; }
a.mostrarLink:hover, a.ocultarLink:hover {
border-bottom: 1px dotted #36f; }
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Como hacer un reporte pdf desde Java con iText 5.5.6. Ejemplo iText.
</h1>
<hr />
</div>
</header>
<br />
<div align="justify">
<br />
<article>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBVXfFj4GM028LMqJA0i5Kg7uZnZzkOV3fXZ5lCzcaw-aWzcCD1yFK5kjecM7CL9pqcU4XR9YlicHGTlnz4rhj3ylEGTnT71dvzzG-kN2_FDKVIHO5GnsR9EpWPdintECi9VT1sHRlSss/s1600/iTextDatoJava.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 0.5em; margin-right: 0.5em;"><img alt="iText Dato Java icon" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBVXfFj4GM028LMqJA0i5Kg7uZnZzkOV3fXZ5lCzcaw-aWzcCD1yFK5kjecM7CL9pqcU4XR9YlicHGTlnz4rhj3ylEGTnT71dvzzG-kN2_FDKVIHO5GnsR9EpWPdintECi9VT1sHRlSss/s1600/iTextDatoJava.png"></a>
<strong>iText pdf</strong> es una librería muy potente y fácil de usar para generar reportes desde <strong>Java</strong> , si lo que necesitas es hacer un reporte rápido, sencillo y sin muchas complicaciones esta es la librería para ti, solo la descargamos y la agregamos al proyecto, hay que recordar que la construcción del reporte pdf va ser enteramente en el código fuente Java a diferencia de <a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html" target="_blank"><strong>Jasper Reports</strong></a> que utiliza archivos externos y después los invocamos desde el código. En este tutorial de iText vamos a generar un reporte pdf que tendrá algunas párrafos, listas, tablas y celdas para mostrar un poco las funcionalidades que podemos conseguir con la misma.
<br />
<br />
Vamos hacer una breve reseña de una cámara y sus características, este es el resultado que queremos conseguir:
</div>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMh1KbLEZiVtuKbVAHwLiDPzTbLU7ieOhoUTP1QRAfuZiT6DHae976SEHa-0JHUdaoG58qk2mQUjPzzUPehJM6n9GCzBK4LmHCIOzUZuUwH4wAcIwE4WNI8EVgRnUOTwCiEfr25ujVF5A/s1600/pdfiTextDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Reporte pdf con iText" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMh1KbLEZiVtuKbVAHwLiDPzTbLU7ieOhoUTP1QRAfuZiT6DHae976SEHa-0JHUdaoG58qk2mQUjPzzUPehJM6n9GCzBK4LmHCIOzUZuUwH4wAcIwE4WNI8EVgRnUOTwCiEfr25ujVF5A/s1600/pdfiTextDatoJava.png">
</a>
<figcaption>
Reporte pdf con iText
</figcaption>
</figure>
</div>
Se ve chévere el ejemplo así que manos al teclado<a name='more'></a>, primero nos vamos a la página de <a href="http://sourceforge.net/projects/itext/files/latest/download" target="_blank">souceforge</a> y nos descargamos la última versión de iText, en este momento la última versión de iText es la 5.5.6, después de descargarla vamos a crear un proyecto Java llamado <code class="codigo">iTextDatoJava</code>, creamos un paquete llamado <code class="codigo">itextDJ</code> y dentro de ese paquete creamos la clase que generará el reporte pdf llamada <code class="codigo">DJiTextEjemplo</code>, ahora descomprimimos el archivo <b><i>itext-***.zip</i></b> que descargamos anteriormente y vamos a importar la librería <b><i>itextpdf-***.jar</i></b></article></div>
</section></body></html>
a nuestro build path. Así debería verse nuestro proyecto hasta ahora:
<br />
<div style="clear: both; text-align: center;">
<br />
<br />
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOBQPv1fkvg9NpFFtgTfoT8HA3qwsh2O5q_xLUmzPf04N6zeMgI37c7I23jYORb5d5eS9BzR6tbh9dkR7UJ9aB2NVpPvm0A9GddDh7yw7B1AfLess5fzyFpJuNmSX-CvD1rh5SSBqk9o4/s1600/pdfiTextDatoJavaProject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Proyecto iText" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOBQPv1fkvg9NpFFtgTfoT8HA3qwsh2O5q_xLUmzPf04N6zeMgI37c7I23jYORb5d5eS9BzR6tbh9dkR7UJ9aB2NVpPvm0A9GddDh7yw7B1AfLess5fzyFpJuNmSX-CvD1rh5SSBqk9o4/s1600/pdfiTextDatoJavaProject.png">
</a>
<figcaption>
Proyecto iText
</figcaption>
</figure>
</div>
Para comenzar tenemos con el código que crear un atributo <code class="codigo">Document</code> de tipo <b><i>com.itextpdf.text.Document</i></b> con la cantidad de espacio entre sus márgenes y el tamaño del mismo, creamos el <code class="codigo">FileOutputStream</code> con su nombre, obtenemos la instancia <code class="codigo">PDFWriter</code> con el documento y el archivo antes creado y abrimos el documento para comenzar a construirlo.
<br />
<pre class="brush: java"> // Creacion del documento con los margenes
Document document = new Document(PageSize.A4, 35, 30, 50, 50);
// El archivo pdf que vamos a generar
FileOutputStream fileOutputStream = new FileOutputStream(
"reportePDFDatoJava.pdf");
// Obtener la instancia del PdfWriter
PdfWriter.getInstance(document, fileOutputStream);
// Abrir el documento
document.open();
</pre>
Esto es fundamental para la <u>creación del reporte pdf con iText</u>, el reporte que queremos generar posee varias imágenes y distintos tipos de fuentes, este es el código para lograr hacer eso:
<br />
<pre class="brush: java"> Image image = null;
// Obtenemos el logo de datojava
image = Image.getInstance("fotoDJ.png");
image.scaleAbsolute(80f, 60f);
// Crear las fuentes para el contenido y los titulos
Font fontContenido = FontFactory.getFont(
FontFactory.TIMES_ROMAN.toString(), 11, Font.NORMAL,
BaseColor.DARK_GRAY);
Font fontTitulos = FontFactory.getFont(
FontFactory.TIMES_BOLDITALIC, 11, Font.UNDERLINE,
BaseColor.RED);
</pre>
Ahí cargamos el logo de <strong>DatoJava</strong> que es una imagen que está en la carpeta del proyecto y creamos las fuentes, para añadir la imagen al documento vamos a crear una <code class="codigo">PdfPTable</code> y una <code class="codigo">PdfPCell</code> a la cual vamos añadirle la imagen, a esta celda hay que establecerle unas cuantas propiedades, alinearla a la derecha, sin borde, etc... Añadirla a la tabla y después añadir la tabla al documento.
<br />
<pre class="brush: java"> // Creacion de una tabla
PdfPTable table = new PdfPTable(1);
// Agregar la imagen anterior a una celda de la tabla
PdfPCell cell = new PdfPCell(image);
// Propiedades de la celda
cell.setColspan(5);
cell.setBorderColor(BaseColor.WHITE);
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
// Agregar la celda a la tabla
table.addCell(cell);
// Agregar la tabla al documento
document.add(table);
</pre>
Ese código es solo para añadir el logo, ahora vamos añadir la otra imagen y todo el contenido textual del reporte.
<br />
<pre class="brush: java; highlight: 45"> // Creacion del parrafo
Paragraph paragraph = new Paragraph();
// Agregar un titulo con su respectiva fuente
paragraph.add(new Phrase("Características:", fontTitulos));
// Agregar saltos de linea
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase(Chunk.NEWLINE));
// Agregar contenido con su respectiva fuente
paragraph
.add(new Phrase(
"El sensor de la X-E1 presenta el mismo excelente rendimiento que el X-Trans CMOS "
+ "de 16 megapíxeles del modelo superior de la serie X, la X-Pro1. Gracias la matriz "
+ "de filtro de color con disposición aleatoria de los píxeles, desarrollada originalmente"
+ " por Fujifilm, el sensor X-Trans CMOS elimina la necesidad del filtro óptico de paso bajo"
+ " que se utiliza en los sistemas convencionales para inhibir el muaré a expensas de la"
+ " resolución. Esta matriz innovadora permite al sensor X-Trans CMOS captar la luz sin filtrar"
+ " del objetivo y obtener una resolución sin precedentes. La exclusiva disposición aleatoria de"
+ " la matriz de filtro de color resulta asimismo muy eficaz para mejorar la separación de ruido"
+ " en la fotografía de alta sensibilidad. Otra ventaja del gran sensor APS-C es la capacidad"
+ " para crear un hermoso efecto “bokeh”, el estético efecto desenfocado que se crea al disparar"
+ " con poca profundidad de campo.",
fontContenido));
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase("Otras Caracaterísticas:", fontTitulos));
// Agregar el parrafo al documento
document.add(paragraph);
// La lista final
List listaFinal = new List(List.UNORDERED);
ListItem listItem = new ListItem();
List list = new List();
// Crear sangria en la lista
list.setListSymbol(new Chunk(" "));
ListItem itemNuevo = new ListItem(" ");
// ZapfDingbatsListm, lista con simbolos
List listSymbol = new ZapfDingbatsList(51);
// Agregar contenido a la lista
listSymbol
.add(new ListItem(
"Sensor CMOS X-Trans – Consigue una calidad de imagen superior",
fontContenido));
listSymbol
.add(new ListItem(
"Visor electrónico OLED de 2,36 pulgadas de alta resolución y luminosidad",
fontContenido));
listSymbol.add(new ListItem("Diseño y accesorios", fontContenido));
listSymbol.add(new ListItem("Rápida respuesta", fontContenido));
itemNuevo.add(listSymbol);
list.add(itemNuevo);
listItem.add(list);
// Agregar todo a la lista final
listaFinal.add(listItem);
// Agregar la lista
document.add(listaFinal);
paragraph = new Paragraph();
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase(Chunk.NEWLINE));
document.add(paragraph);
</pre>
Repasando el código anterior, en la línea <b>45</b> hay algo interesante, ahí estamos utilizando una lista de tipo <i><b>com.itextpdf.text.ZapfDingbatsList</b></i> la cual posee un constructor que recibe un <code class="codigo">int</code> y así podemos elegir entre distintos símbolos que la lista nos proporciona, esta es la lista de símbolos que posee actualmente <a href="http://datojava.blogspot.com/2015/06/zapfdingbatslistSymbolListaLowagieItext.html" target="_blank">ZapfDingbatsList</a>. Ahora solo falta agregar las ultimas imágenes al documento y terminamos el tutorial de iText.
<br />
<pre class="brush: java"> // Crear tabla nueva con dos posiciones
table = new PdfPTable(2);
float[] longitudes = { 5.0f, 5.0f };
// Establecer posiciones de celdas
table.setWidths(longitudes);
cell = new PdfPCell();
// Cargar imagenes del producto y agregarlas
image = Image.getInstance("fujifilmex1-2.png");
image.scaleAbsolute(40f, 20f);
table.getDefaultCell().setBorderColor(BaseColor.WHITE);
table.addCell(image);
image = Image.getInstance("fujifilmex1-3.png");
image.scaleAbsolute(40f, 20f);
table.addCell(image);
// Agregar la tabla al documento
document.add(table);
// Cerrar el documento
document.close();
// Abrir el archivo
File file = new File("reportePDFDatoJava.pdf");
Desktop.getDesktop().open(file);
</pre>
Para evitar excepciones con iText debemos cerrar el documento al finalizar la construcción del mismo, y si el archivo PDF que estamos intentando abrir ya se encuentra abierto también saltara una excepción. Como este ejemplo funciona para una aplicación de escritorio utilizamos la clase <code class="codigo">Desktop</code> para abrir el archivo que por defecto en este momento se está generando dentro de la carpeta del proyecto en la raíz, desde ese mismo path obtenemos las imágenes. Este es el código de la clase <code class="codigo">DJiTextEjemplo</code> completo:
<br />
<div id="wrap">
<a class="mostrarLink" href="https://www.blogger.com/blogger.g?blogID=9116102449526922332#" id="mostrar-mas" onclick="mostrarOcultar('mostrar');return false;">Mostrar el codigo.</a>
<br />
<div class="more" id="mostrar">
<a class="ocultarLink" href="https://www.blogger.com/blogger.g?blogID=9116102449526922332#" onclick="mostrarOcultar('mostrar');return false;">Ocultar el codigo.</a>
<pre class="brush: java"> package itextDJ;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.ZapfDingbatsList;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
/**
*
* @author http://datojava.blogspot.com/
*
*/
public class DJiTextEjemplo {
public static void main(String[] args) {
// Creacion del documento con los margenes
Document document = new Document(PageSize.A4, 35, 30, 50, 50);
try {
// El archivo pdf que vamos a generar
FileOutputStream fileOutputStream = new FileOutputStream(
"reportePDFDatoJava.pdf");
// Obtener la instancia del PdfWriter
PdfWriter.getInstance(document, fileOutputStream);
// Abrir el documento
document.open();
Image image = null;
// Obtenemos el logo de datojava
image = Image.getInstance("fotoDJ.png");
image.scaleAbsolute(80f, 60f);
// Crear las fuentes para el contenido y los titulos
Font fontContenido = FontFactory.getFont(
FontFactory.TIMES_ROMAN.toString(), 11, Font.NORMAL,
BaseColor.DARK_GRAY);
Font fontTitulos = FontFactory.getFont(
FontFactory.TIMES_BOLDITALIC, 11, Font.UNDERLINE,
BaseColor.RED);
// Creacion de una tabla
PdfPTable table = new PdfPTable(1);
// Agregar la imagen anterior a una celda de la tabla
PdfPCell cell = new PdfPCell(image);
// Propiedades de la celda
cell.setColspan(5);
cell.setBorderColor(BaseColor.WHITE);
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
// Agregar la celda a la tabla
table.addCell(cell);
// Agregar la tabla al documento
document.add(table);
// Cargar otra imagen
image = Image.getInstance("fujifilmex1-1.png");
image.scaleAbsolute(180f, 140f);
// Agregar la imagen
document.add(image);
// Creacion del parrafo
Paragraph paragraph = new Paragraph();
// Agregar un titulo con su respectiva fuente
paragraph.add(new Phrase("Características:", fontTitulos));
// Agregar saltos de linea
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase(Chunk.NEWLINE));
// Agregar contenido con su respectiva fuente
paragraph
.add(new Phrase(
"El sensor de la X-E1 presenta el mismo excelente rendimiento que el X-Trans CMOS "
+ "de 16 megapíxeles del modelo superior de la serie X, la X-Pro1. Gracias la matriz "
+ "de filtro de color con disposición aleatoria de los píxeles, desarrollada originalmente"
+ " por Fujifilm, el sensor X-Trans CMOS elimina la necesidad del filtro óptico de paso bajo"
+ " que se utiliza en los sistemas convencionales para inhibir el muaré a expensas de la"
+ " resolución. Esta matriz innovadora permite al sensor X-Trans CMOS captar la luz sin filtrar"
+ " del objetivo y obtener una resolución sin precedentes. La exclusiva disposición aleatoria de"
+ " la matriz de filtro de color resulta asimismo muy eficaz para mejorar la separación de ruido"
+ " en la fotografía de alta sensibilidad. Otra ventaja del gran sensor APS-C es la capacidad"
+ " para crear un hermoso efecto “bokeh”, el estético efecto desenfocado que se crea al disparar"
+ " con poca profundidad de campo.",
fontContenido));
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase("Otras Caracaterísticas:", fontTitulos));
// Agregar el parrafo al documento
document.add(paragraph);
// La lista final
List listaFinal = new List(List.UNORDERED);
ListItem listItem = new ListItem();
List list = new List();
// Crear sangria en la lista
list.setListSymbol(new Chunk(" "));
ListItem itemNuevo = new ListItem(" ");
// ZapfDingbatsListm, lista con simbolos
List listSymbol = new ZapfDingbatsList(51);
// Agregar contenido a la lista
listSymbol
.add(new ListItem(
"Sensor CMOS X-Trans – Consigue una calidad de imagen superior",
fontContenido));
listSymbol
.add(new ListItem(
"Visor electrónico OLED de 2,36 pulgadas de alta resolución y luminosidad",
fontContenido));
listSymbol.add(new ListItem("Diseño y accesorios", fontContenido));
listSymbol.add(new ListItem("Rápida respuesta", fontContenido));
itemNuevo.add(listSymbol);
list.add(itemNuevo);
listItem.add(list);
// Agregar todo a la lista final
listaFinal.add(listItem);
// Agregar la lista
document.add(listaFinal);
paragraph = new Paragraph();
paragraph.add(new Phrase(Chunk.NEWLINE));
paragraph.add(new Phrase(Chunk.NEWLINE));
document.add(paragraph);
// Crear tabla nueva con dos posiciones
table = new PdfPTable(2);
float[] longitudes = { 5.0f, 5.0f };
// Establecer posiciones de celdas
table.setWidths(longitudes);
cell = new PdfPCell();
// Cargar imagenes del producto y agregarlas
image = Image.getInstance("fujifilmex1-2.png");
image.scaleAbsolute(40f, 20f);
table.getDefaultCell().setBorderColor(BaseColor.WHITE);
table.addCell(image);
image = Image.getInstance("fujifilmex1-3.png");
image.scaleAbsolute(40f, 20f);
table.addCell(image);
// Agregar la tabla al documento
document.add(table);
// Cerrar el documento
document.close();
// Abrir el archivo
File file = new File("reportePDFDatoJava.pdf");
Desktop.getDesktop().open(file);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
</pre>
</div>
</div>
Es fácil de usar, espero que este ejemplo de iText te haya servido de algo, aquí te dejo el proyecto para que lo <a href="https://mega.co.nz/#!6IFQHAaY!s8lAtWjrriXdpDueowET7E7lggHIuWfi__JXnQpN9yk" target="_blank">descargues</a>, ahí mismo tienes las imágenes, si tratas de compilar la clase sin las imágenes tendrás una excepción así que te cuidado con eso, no olvides compartir la entrada y si tienes alguna duda o sugerencia puedes comentarlo. Suerte my friend.
<br />
<center>
<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle" data-ad-client="ca-pub-9352598088641935" data-ad-slot="6053448801" style="display: inline-block; height: 60px; width: 468px;"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<br />
<br />
<br />
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2014/09/reporte-excel-con-java.html"><strong>Crear un reporte excel desde Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/zapfdingbatslistSymbolListaLowagieItext.html"><strong>ZapfDingbatsList itext, lista de simbolos disponibles.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html"><strong>Tutorial de iReport con Oracle, Primefaces y Java.</strong></a></li>
</ul>
</article>
Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com4tag:blogger.com,1999:blog-9116102449526922332.post-20344709158864568332015-06-18T15:56:00.000-07:002016-06-06T14:48:16.842-07:00ZapfDingbatsList symbol list images.<html>
<head>
<title>
ZapfDingbatsList symbol list imágenes.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
ZapfDingbatsList symbol list, todos los símbolos que puedes crear con esta lista.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
Si estas utilizando <strong>lowagie iText</strong> para crear un PDF y necesitas crear una lista con un símbolo en especial pero no sabes cómo hacerlo, o no tienes idea de cuáles son los símbolos que puedes usar, en este <strong>Dato Java</strong> te traigo la lista de símbolos disponibles en <strong>ZapfDingbatsList</strong>, recuerda que para crear una lista en <strong>lowagie iText</strong> necesitas este bloque de codigo:
<pre class="brush: java;">
com.lowagie.text.List list = (com.lowagie.text.List) new ZapfDingbatsList(51);
list.add(new ListItem("Item 1"));
list.add(new ListItem("Item 2"));
list.add(new ListItem("Item 3"));
list.add(new ListItem("Item 4"));
document.add(list);
</pre>
En el constructor de la lista <strong>ZapfDingbatsList</strong> pasamos el numero del símbolo que queremos utilizar, ese código anterior muestra este resultado en un PDF:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7x7-VnZ6utbcZlEBFXaVqiUu6SOb-WQLZZd8zGeWotWnYMirTLozQwwqPFx0IbcR9Kflh6oPhESZPIwoetAljf5bmkT5X6-lZnf3rH5rHuoi5x2hN6X1PIgEtQpsSk7Zp2DmtQxaUQos/s1600/itextLowagieSymbols.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="ZapfDingbatsList ejemplo" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7x7-VnZ6utbcZlEBFXaVqiUu6SOb-WQLZZd8zGeWotWnYMirTLozQwwqPFx0IbcR9Kflh6oPhESZPIwoetAljf5bmkT5X6-lZnf3rH5rHuoi5x2hN6X1PIgEtQpsSk7Zp2DmtQxaUQos/s1600/itextLowagieSymbols.png">
</a>
<figcaption>
ZapfDingbatsList ejemplo
</figcaption>
</figure>
</div>
Y aquí te dejo los códigos de los símbolos que puedes utilizar en <strong>lowagie iText</strong> con una lista de tipo <strong>ZapfDingbatsList</strong>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpqep85UtonAse0_LKA-ZQFFezCXreHh_HqdOH9Q84jGEr-vUwVVPZEggZhU_DWif_N_HOtVnoYXmy0uFMYJs9ycLssUogq2r-X0O-WWLubKSKDEUZ8ceZy3mDsuQbME6ICY9uEar26Ws/s1600/zapfdingbatslistSymbolListImg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="ZapfDingbatsList lista de simbolos" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpqep85UtonAse0_LKA-ZQFFezCXreHh_HqdOH9Q84jGEr-vUwVVPZEggZhU_DWif_N_HOtVnoYXmy0uFMYJs9ycLssUogq2r-X0O-WWLubKSKDEUZ8ceZy3mDsuQbME6ICY9uEar26Ws/s1600/zapfdingbatslistSymbolListImg.png">
</a>
<figcaption>
ZapfDingbatsList lista de símbolos
</figcaption>
</figure>
</div>
Si te sirvió de algo recuerda compartir y si tienes una duda coméntala. Suerte!!
</article>
<br/>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html"><strong>iReport con Oracle PL-SQL y Aplicación Java Web Primefaces. Parte 1.
</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/09/reporte-excel-con-java.html"><strong>Generar un reporte en Excel con Java.
</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html"><strong>Tutorial de Aplicación Java Swing. Ejemplo simple y sencillo.
</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/08/itextPDFJavaEjemplo.html"><strong>Generar un reporte PDF con iText</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-66631809742375952352015-06-17T16:00:00.000-07:002016-06-06T14:49:31.918-07:00Múltiples partialTriggers en adf. Varios partialTriggers en inputText/outputText<html>
<head>
<title>
Múltiples partialTriggers en adf. Varios partialTriggers en inputText/outputText.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Múltiples o varios partialTriggers en un solo tag inputText/outputText de adf.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
A veces queremos que dependiendo de un evento en particular, ya sea presionar un botón, ingresar un valor en un input o seleccionar un radio button en la interfaz de usuario se refresque un determinado componente <af:inputText/> o <af:outputText/> con el atributo <strong>partialTriggers</strong>, en este <strong>Dato Java</strong> explico cómo hacer para que un componente se refresque con varios eventos, por ejemplo, 2 input refrescan el mismo componente sin actualizar toda la pagina.
<pre class="brush: xml;">
<h:panelGrid>
<af:inputText id="idMontoInteres" valueChangeListener="...."
autoSubmit="true">
</af:inputText>
<af:inputText id="idMontoComision" valueChangeListener="...."
autoSubmit="true">
</af:inputText>
<af:inputText value="...." readOnly="true"
partialTriggers="idMontoInteres idMontoComision">
</af:inputText>
</h:panelGrid>
</pre>
Como se ve en el código anterior es algo fácil, pero si no sabes, esta duda te puede quitar tiempo valioso, solo tenemos que poner en el atributo partialTriggers la cantidad de id's que refrescan ese componente y así podemos refrescar nuestro <u>componente adf con varios partialTriggers</u>.
</article>
<br/>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/javaCallablestatementParametrosINOUT.html"><strong>CallableStatement con parámetros IN/OUT desde java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/05/comoInstalarWindowbuilderEclipseJBossDev.html"><strong>Como instalar WindowsBuilder en eclipse o en JBoss Developer Studio.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/05/diferenciaEntreThrowyThrowsEnJava.html"><strong>Diferencia entre throw y throws en Java.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-28396833232618079702015-06-16T15:52:00.000-07:002016-06-06T14:51:07.343-07:00CallableStatement con parámetros IN/OUT desde java. <html>
<head>
<title>
CallableStatement con parámetros IN/OUT desde java.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Como ejecutar una consulta a Oracle PL/SQL con un parámetro IN/OUT desde CallableStatement Java.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
Cuando trabajamos en <strong>Java</strong> con una base de datos <strong>Oracle PL/SQL</strong> sabemos que siempre en el DAO hacemos la llamada a un Strored Procedure y dependiendo de sus parámetros pasamos el valor correcto. Suponiendo que el Stored Procedure sea declarado en Oracle de esta manera:
<pre class="brush: sql;">
PROCEDURE SP_BUSCAR_USUARIO(NUMERO_DOCUMENTO IN NUMBER,
CODIGO_MENSAJE OUT NUMBER,
MENSAJE OUT VARCHAR2);
</pre>
Ya sabemos que este SP tiene parámetros de entrada (IN) y de salida (OUT), para ejecutar este SP desde Java tenemos que hacer esto:
<pre class="brush: java;">
CallableStatement callableStatement = null;
Connection connection = null;
ResultSet resultSet = null;
String mensajeDevuelto = "";
int codigoMensaje = 0;
String sql = "{ CALL PAQUETE_DATO_JAVA.SP_BUSCAR_USUARIO(?,?,?) }";
try {
connection = Control.getConnection();
callableStatement = connection.prepareCall(sql.toString());
callableStatement.setInt(1, numeroDocumento);
callableStatement.registerOutParameter(2, OracleTypes.INTEGER);
callableStatement.registerOutParameter(3, OracleTypes.VARCHAR);
callableStatement.execute();
codigoMensaje = callableStatement.getInt(2);
mensaje = callableStatement.getString(3);
//......
</pre>
Como vemos anteriormente cuando un SP recibe parámetros de entrada (IN) en Java nosotros seteamos el parámetro en el CallableStatement, y si el SP recibe parámetros de salida (OUT) nosotros en Java registramos el tipo de parámetro de salida en el CallableStatement y después procedemos a insertarlo en una variable. Ahora lo que puede enredarnos es <strong>como hacer cuando un SP recibe un parámetro de entrada y salida (IN OUT)</strong>, es sencillo eso lo hacemos así, suponiendo que esta sea la declaración del SP:
<pre class="brush: sql;">
PROCEDURE SP_BUSCAR_USUARIO(NUMERO_DOCUMENTO IN NUMBER,
CODIGO_MENSAJE IN OUT NUMBER,
MENSAJE OUT VARCHAR2);
</pre>
Así lo ejecutamos desde Java:
<pre class="brush: java;">
CallableStatement callableStatement = null;
Connection connection = null;
ResultSet resultSet = null;
String mensajeDevuelto = "";
int codigoMensaje = 0;
String sql = "{ CALL PAQUETE_DATO_JAVA.SP_BUSCAR_USUARIO(?,?,?) }";
try {
connection = Control.getConnection();
callableStatement = connection.prepareCall(sql.toString());
callableStatement.setInt(1, numeroDocumento);
callableStatement.setInt(2, codigoMensaje);
callableStatement.registerOutParameter(2, OracleTypes.INTEGER);
callableStatement.registerOutParameter(3, OracleTypes.VARCHAR);
callableStatement.execute();
codigoMensaje = callableStatement.getInt(2);
mensaje = callableStatement.getString(3);
//......
</pre>
Para que eso funcione primero tenemos que setear en el parámetro de entrada en el CallableStatement y después registrar el tipo de parámetro de salida en el mismo índice. Suerte, espero te sirva este <strong>Dato Java</strong>.<br/>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
</article>
<br/>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/jndiDatasourceJavaJBoss.html"><strong>JNDI Datasource Java JBoss. JDBC Tip. .</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/11/queryDinamicoFiltrosPlsql.html"><strong>Query dinamico en Oracle PL/SQL.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/06/jdbcJavaOracle.html"><strong>JDBC Java y Oracle PL-SQL.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html"><strong>Tutorial de iReport con Oracle, Primefaces y Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.pe/2015/11/TutorialJavaHSQLDB.html"><strong>Tutorial de Java con HSQLDB.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-84895141350709308752015-06-12T15:43:00.000-07:002016-06-06T15:00:25.631-07:00Tutorial de Aplicación Java Swing. Ejemplo simple y sencillo.<html>
<head>
<title>
Aplicación Java Swing Simple y Sencilla.
</title>
<script language="javascript" type="text/javascript">
function mostrarOcultar(shID) {
if (document.getElementById(shID)) {
if (document.getElementById(shID+'-mas').style.display != 'none') {
document.getElementById(shID+'-mas').style.display = 'none';
document.getElementById(shID).style.display = 'block';
}
else {
document.getElementById(shID+'-mas').style.display = 'inline';
document.getElementById(shID).style.display = 'none';
}
}
}
function mostrarOcultarIni(shID) {
if (document.getElementById(shID)) {
if (document.getElementById(shID+'-mas-ini').style.display != 'none') {
document.getElementById(shID+'-mas-ini').style.display = 'none';
document.getElementById(shID).style.display = 'block';
}
else {
document.getElementById(shID+'-mas-ini').style.display = 'inline';
document.getElementById(shID).style.display = 'none';
}
}
}
</script>
<style>
h1, h2, h3, h4{
color:#0b5394;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
.contenidos{
background-color:white;
}
.numIndice{
color:#0b5394;
}
#wrap {
width: 30em;
padding: 1em;
}
.more {
display: none;
}
a.mostrarLink, a.ocultarLink {
text-decoration: none;
color: #36f;
}
a.ocultarLink {
background: transparent; }
a.mostrarLink:hover, a.ocultarLink:hover {
border-bottom: 1px dotted #36f; }
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Tutorial de Aplicación Java Swing, ejemplo de una aplicación Swing con varias ventanas.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
<div>
<div style='float:left; margin:5px 6px 0px 5px'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Cuadrado contenido entradas -->
<ins class="adsbygoogle"
style="display:inline-block;width:180px;height:150px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="7309856003"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
Cuando estaba comenzando a programar en <strong>Java Swing</strong> después de ver tantos artículos y "tutoriales" locos de la web muchas veces no encontraba lo que en realidad estaba buscando, quería saber <strong>como hacer una aplicación Swing con varias ventanas, actualizando la misma ventana</strong>, después con un poco más de experiencia comencé con los tutoriales de <a href="https://docs.oracle.com/javase/tutorial/" target="_blank">Java Sun</a> los cuales recomiendo con los ojos cerrados, todo lo que tenga que ver con Java podrás encontrarlo ahí. Casi siempre comenzamos a practicar con los componentes de Swing, o con el famoso y comercial "Hola Mundo", bueno en esta entrada vamos a hacer un mini tutorial en el cual vamos a crear una aplicación Java Swing simple y sencilla con más de una ventana, la idea es ver el funcionamiento de una aplicación con más de una ventana y distintos componentes. Como es algo sencillo y mi estilo en <strong>Swing</strong> es sin utilizar ningún GUI Builder (tipo <a href="http://datojava.blogspot.com/2015/05/comoInstalarWindowbuilderEclipseJBossDev.html" target="_blank">WindowBuilder</a>), ni ningún plugin parecido, vamos hacerlo todo manual. Bueno manos al teclado, haremos una ventana simple imitando una ventana de login y si el usuario y la clave son correctos nos lleva a otra ventana de inicio, esta fácil...</div><br/><br/>
<div class="contenidos">
<h1>Tabla De Contenidos</h1><br/>
<a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html#creacionProyecto"><strong> 1. Creación del proyecto java Swing.</strong></a><br/>
<a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html#creacionPaquetes"><strong> 2. Creación de los paquetes del proyecto.</strong></a><br/>
<a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html#creacionClases"><strong> 3. Creación de clases GUI.</strong></a><br/>
<a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html#creacionImpSingleton"><strong> 4. Creación e implementación de clase Singleton.</strong></a><br/>
<a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html#implementacionClases"><strong> 5. Implementación de clases GUI.</strong></a><br/>
<a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html#aplicacionFinal"><strong> 6. Aplicación Swing Final.</strong></a><br/>
</div><a name='more'></a>
<br/><br/>
<a name="creacionProyecto"></a><h4>1. Creación del proyecto java Swing.</h4><br/>
Creamos un proyecto nuevo <b>Java Project</b> que le pondremos el nombre de <code class="codigo">SwingDatoJava</code>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMTT7-CVTrRMtlA8xGhKb0OEhoSWI-5933PhLcFj6DM2TnDBqkihiye7BIXeghRSzuhiEjld6riLEdoLYTTbvUvk_hEFTCwW2lA0UJ4EmF8DMZc_TgKNIqBoXsNE1zzv2mLwOkQhmIlvc/s1600/SwingDatoJavaJavaProject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="New Java Project" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMTT7-CVTrRMtlA8xGhKb0OEhoSWI-5933PhLcFj6DM2TnDBqkihiye7BIXeghRSzuhiEjld6riLEdoLYTTbvUvk_hEFTCwW2lA0UJ4EmF8DMZc_TgKNIqBoXsNE1zzv2mLwOkQhmIlvc/s1600/SwingDatoJavaJavaProject.png">
</a>
<figcaption>
New Java Project
</figcaption>
</figure>
</div>
<a name="creacionPaquetes"></a><h4>2. Creación de los paquetes del proyecto.</h4><br/>
<b class="numIndice">2.1.</b> Creamos un paquete nuevo en la carpeta <b>src</b> de nuestro proyecto con este nombre <code class="codigo">datojava.gui</code>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHvDE2gOBM0bHGGrJEkLk-omNLHWsCdv8fB1ysK7kXFSCJhZ_nD4ZM5so97nw0n3-Kiq6CWFRZdNK_vPQtPV0qS_cuKtqpzgbqVAGIoe9gS1-4KNTm23ZzBOEfdWCl4oceRAI5J25qvEI/s1600/SwingDatoJavaPackage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Nuevo Paquete" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHvDE2gOBM0bHGGrJEkLk-omNLHWsCdv8fB1ysK7kXFSCJhZ_nD4ZM5so97nw0n3-Kiq6CWFRZdNK_vPQtPV0qS_cuKtqpzgbqVAGIoe9gS1-4KNTm23ZzBOEfdWCl4oceRAI5J25qvEI/s1600/SwingDatoJavaPackage.png">
</a>
<figcaption>
Nuevo Paquete
</figcaption>
</figure>
</div>
<b class="numIndice">2.2.</b> Creamos otro paquete llamado <code class="codigo">datojava.singleton</code><br/>
Hasta ahora la estructura de nuestro proyecto debería verse de esta manera.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Lg7UigeoXK0EqkaYq40BZFl5qlwsfdpQ7IENpXSLAVgIaOM4PDYxaBlWcyUvTnK-2Duqtsl2QqDjkEWK4cpLZX4PLMJ_Hlw-F-MHkVoGEdDlxLW2nOILg7fqZXGX6XUd2AJI-9c6WHk/s1600/SwingDatoJavaEstructura.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Crear clase login" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2Lg7UigeoXK0EqkaYq40BZFl5qlwsfdpQ7IENpXSLAVgIaOM4PDYxaBlWcyUvTnK-2Duqtsl2QqDjkEWK4cpLZX4PLMJ_Hlw-F-MHkVoGEdDlxLW2nOILg7fqZXGX6XUd2AJI-9c6WHk/s1600/SwingDatoJavaEstructura.png">
</a>
<figcaption>
Crear clase login
</figcaption>
</figure>
</div>
<a name="creacionClases"></a><h4>3. Creación de clases GUI.</h4><br/>
Vamos a crear las clases para implementar las interfaces en el paquete <code class="codigo">datojava.gui</code>, la clase encargada de la GUI del login tendrá el nombre de <code class="codigo">DJLoginGUI</code> y la clase encargada de la GUI de inicio tendrá el nombre de <code class="codigo">DJInicioGUI</code>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuRKH8pfrWvmOba7j8FRFBE-uY6uLtDlR8MtxfVkHsW-7BX5IN_K30hGZZ9eHPswIdHb9SpT-9km_Zmjf940HAeg51_JO8QfcHJMa9CEkHYFTs4JDhekhvkb10-fJoD1ZLH_WKLJSvQjE/s1600/SwingDatoJavaClaseLogin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Crear clase DJLoginGUI" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuRKH8pfrWvmOba7j8FRFBE-uY6uLtDlR8MtxfVkHsW-7BX5IN_K30hGZZ9eHPswIdHb9SpT-9km_Zmjf940HAeg51_JO8QfcHJMa9CEkHYFTs4JDhekhvkb10-fJoD1ZLH_WKLJSvQjE/s1600/SwingDatoJavaClaseLogin.png">
</a>
<figcaption>
Crear clase DJLoginGUI
</figcaption>
</figure>
</div>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp3VHHtagJnvgPj3GZbqL3SQIpjlFR5jgnNmyKppnsaSiI60yGyFY8Qd7PvtlYuV3Uiy3KpXuLXXs6_pi_2BDJd2ZNO4nnRD7oSLhYwSr_-jNA-kTR8SjIONW619YvjLpaF7Oun8Xh2wA/s1600/SwingDatoJavaClaseInicio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Crear clase DJInicioGUI" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp3VHHtagJnvgPj3GZbqL3SQIpjlFR5jgnNmyKppnsaSiI60yGyFY8Qd7PvtlYuV3Uiy3KpXuLXXs6_pi_2BDJd2ZNO4nnRD7oSLhYwSr_-jNA-kTR8SjIONW619YvjLpaF7Oun8Xh2wA/s1600/SwingDatoJavaClaseInicio.png">
</a>
<figcaption>
Crear clase DJInicioGUI
</figcaption>
</figure>
</div>
<a name="creacionImpSingleton"></a><h4>4. Creación e implementación de clase Singleton.</h4><br/>
Ahora vamos a crear la clase que controla la cantidad de instancias que deberíamos tener de nuestras clases, este patrón de diseño se llama <a href="http://es.wikipedia.org/wiki/Singleton" target="_blank"><strong>Singleton</strong></a> y sirve para asegurarnos de que solo crearemos una instancia de cada clase y así podremos acceder a esa instancia desde cualquier punto de nuestro código sin crear objetos nuevos en memoria innecesariamente. <br/><br/>
<p class="nota"><b>NOTA:</b> un tip de Java es que nunca olvidemos que un buen código va de la mano de muchos patrones de diseño.</p><br/>
Esta clase de Singleton tiene el nombre de <code class="codigo">DJSingleton</code> y la vamos a crear en el paquete <code class="codigo">datojava.singleton</code>, ya tenemos todas las clases que vamos a necesitar para este <strong>Mini tutorial de Swing</strong>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2nZCQmgQlBG2B8dD65MvqknsO0TnypGIRN4bmTf_2PsSiACN-hNXXWvtr0CM_5KwfJVmd8yGlh2SKkEpeohS-3cboJ9v8-ymzI6Y8c4MtwUK-qu0CKvoMUYIZ6_7CK3AOgO8G_qJKd_8/s1600/SwingDatoJavaNewEstructura.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Estructura Final Tutorial" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2nZCQmgQlBG2B8dD65MvqknsO0TnypGIRN4bmTf_2PsSiACN-hNXXWvtr0CM_5KwfJVmd8yGlh2SKkEpeohS-3cboJ9v8-ymzI6Y8c4MtwUK-qu0CKvoMUYIZ6_7CK3AOgO8G_qJKd_8/s1600/SwingDatoJavaNewEstructura.png">
</a>
<figcaption>
Estructura Final Tutorial
</figcaption>
</figure>
</div>
Ya que estamos en la clase <code class="codigo">DJSingleton</code> vamos a implementarla de una vez, este es su código.
<pre class="brush: java;">
package datojava.singleton;
import java.util.concurrent.ConcurrentHashMap;
public class DJSingleton {
private static ConcurrentHashMap<Class<?>, Object> objeto = new ConcurrentHashMap<Class<?>, Object>();
public static <T> T getInstancia(Class<T> clase) {
T instancia = clase.cast(objeto.get(clase));
if (instancia == null) {
synchronized (clase) {
if (instancia == null) {
instancia = getNuevaInstancia(clase);
objeto.put(clase, instancia);
}
}
}
return instancia;
}
private static <T> T getNuevaInstancia(Class<T> objetoClase) {
System.out.println("Creando nueva instancia de "+ objetoClase.getName());
T obj = null;
try {
obj = objetoClase.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
} </pre>
Explicando un poco el código anterior, vemos que hay 3 métodos:
<ul>
<li><code class="codigo">getInstancia(Class<T> clase)</code>: este método es público y es el método que tenemos que invocar desde cualquier parte del código para acceder a la instancia de la clase que pasemos como parámetro, si la instancia ya esta creada simplemente la devuelve si no la crea.</li>
<li><code class="codigo">getNuevaInstancia(Class<T> objetoClase)</code>: este metodo se invoca internamente solamente si la instancia de una clase es <code class="codigo">null</code> procediendo a crear una nueva instancia de la misma.</li>
<li><code class="codigo">clone()</code>: este método lo sobrescribimos para que no se pueda clonar una clase, en el caso de que lo intenten lanzaría una excepción.</li>
</ul><br/>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<a name="implementacionClases"></a><h4>5. Implementación de clases GUI.</h4><br/>
Sin más nada que hacer aquí pasamos a implementar la GUI del login en la clase <code class="codigo">DJLoginGUI</code>, primero creamos los componentes de la ventana.
<pre class="brush: java;">
private JFrame frame = new JFrame("DatoJava Swing");;
private JPanel panel = new JPanel();
private JLabel labelUsuario;
private JLabel labelClave;
private JTextField textFieldUsuario;
private JPasswordField passwordFieldClave;
private JButton buttonIngresar;
</pre>
Ahí creamos las etiquetas y los inputs para el usuario y la clave, el botón para ingresar al sistema, el panel donde van a estar todos los componentes y el frame que contiene el panel, este <strong>JFrame</strong> será el único creado en esta aplicación, la idea es que actualicemos el frame cambiando de paneles. Sin dudas hasta ahora, pasamos a crear un método para inicializar todos los componentes llamado <code class="codigo">void inicializarComponentes()</code>.
<pre class="brush: java; highlight: [19,20,31]">
public void inicializarComponentes() {
// Instanciar Componentes
labelUsuario = new JLabel("Usuario");
labelClave = new JLabel("Clave");
textFieldUsuario = new JTextField();
passwordFieldClave = new JPasswordField();
buttonIngresar = new JButton("Ingresar");
// Estilo del boton
buttonIngresar.setFont(new java.awt.Font("Arial Black", 0, 12));
buttonIngresar.setCursor(new Cursor(Cursor.HAND_CURSOR));
buttonIngresar.setBorder(null);
buttonIngresar.setContentAreaFilled(false);
// Listener del boton
buttonIngresar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (textFieldUsuario.getText().equals("datojava")
&& claveCorrecta(passwordFieldClave.getPassword())) {
// Ingresa Al sistema
// Falta implementar
} else {
JOptionPane.showMessageDialog(null, new String(
"Usuario/Clave Incorrecto"), "Ok", 0);
}
}
});
// Agregar los componentes al panel
agregarComponentesAlPanel(this.panel);
}
</pre>
Instanciamos los componentes, le damos un estilo diferente al botón cambiando la letra, quitándole los bordes y agregando un <strong>ActionListener</strong> para poder validar cuando el usuario intente ingresar al sistema, el usuario y la clave lo hemos predefinido en el mismo código porque no estamos utilizando ninguna base de datos, en el caso de que el usuario sea "datojava" y el password "123456" ingresa al sistema (aún no implementado, mas adelante vamos a implementar esta parte). Al momento de validar el usuario y la clave en la línea <b>20</b> vemos que hacemos una llamada a un metodo que lleva por nombre <code class="codigo">boolean claveCorrecta(char[])</code> al cual le pasamos la clave ingresada por el usuario y si es correcta devuelve el valor <code class="codigo">true</code>. Siguiendo con el código en la línea <b>31</b> invocamos un método llamado <code class="codigo">void agregarComponentesAlPanel(JPanel)</code> el cual recibe el panel que creamos anteriormente para ubicar y agregar los componentes en el mismo. <br/>Vamos a implementar esos dos métodos, primero el <code class="codigo">boolean claveCorrecta(char[])</code>.
<pre class="brush: java;">
private static boolean claveCorrecta(char[] claveIngresada) {
boolean correcto = true;
char[] clave = { '1', '2', '3', '4', '5', '6' };
if (claveIngresada.length != claveIngresada.length) {
correcto = false;
} else {
correcto = Arrays.equals(claveIngresada, clave);
}
Arrays.fill(clave, '0');
return correcto;
}
</pre>
Lo que hacemos es recibir como parámetro el arreglo de tipo <code class="codigo">char</code> que devuelve <code class="codigo">passwordFieldClave.getPassword()</code> y lo comparamos con el arreglo que contiene la clave correcta, si son iguales devuelve <code class="codigo">true</code> si no <code class="codigo">false</code>.<br/>
<p class="nota"><b>NOTA:</b> hay que recordar que esta deprecado obtener la clave como <code class="codigo">String</code> con el método <code class="codigo">passwordFieldClave.<s>getText()</s></code>, por eso obtenemos la clave como un arreglo de tipo <code class="codigo">char</code>.</p>
Ahora implementamos el método <code class="codigo">void agregarComponentesAlPanel(JPanel)</code>.
<pre class="brush: java; highlight: [2,19]">
public void agregarComponentesAlPanel(JPanel panel) {
panel.setLayout(null);
labelUsuario.setBounds(20, 30, 100, 30);
labelClave.setBounds(20, 50, 100, 30);
textFieldUsuario.setBounds(82, 33, 100, 20);
passwordFieldClave.setBounds(82, 58, 100, 20);
buttonIngresar.setBounds(165, 80, 80, 20);
panel.add(labelUsuario);
panel.add(labelClave);
panel.add(textFieldUsuario);
panel.add(passwordFieldClave);
panel.add(buttonIngresar);
panel.setSize(150, 250);
crear(panel);
}
</pre>
En la línea <b>2</b> declaramos que no vamos a utilizar ningún layout para ubicar los componentes nosotros mismos mediante coordenadas, el método <code class="codigo">setBounds(x, y, width, height)</code> sirve para especificar las coordenadas en donde vamos a ubicar el componente indicado (x,y), el ancho (width) que debería tener y la altura (height) adecuada, después de especificar esos datos los agregamos al panel con el método <code class="codigo">add</code>. Podemos ver que en la línea <b>19</b> invocamos a un método llamado <code class="codigo">crear(JPanel)</code> pasándole como parámetro el panel con los componentes ya ubicados en su interior, este es el código de ese método.
<pre class="brush: java;">
public void crear(JPanel panel) {
frame.setJMenuBar(null);
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(frame.getContentPane().getHeight(), frame
.getContentPane().getWidth());
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
}
</pre>
Aquí agregamos ciertas propiedades a la ventana principal, como es una ventana de login no le agregamos una barra de herramientas, recibimos como parámetro el panel con todos sus componentes y lo agregamos al frame, ponemos la ventana en el medio del monitor de nuestra pc, deshabilitamos el botón de agrandar la ventana y la hacemos visible. Por último vamos a crear un constructor de la clase que invoque al método <code class="codigo">void inicializarComponentes()</code> y nuestro método <code class="codigo">static void main(String[] args)</code> que solo instancie la clase <code class="codigo">DJLoginGUI</code> y queda lista nuestra ventana para el login del usuario al sistema. El constructor queda de esta manera.
<pre class="brush: java; highlight: 5">
public DJLoginGUI() {
inicializarComponentes();
}
</pre>
Y nuestro main así.
<pre class="brush: java;">
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
DJLoginGUI loginGUI = DJSingleton.getInstancia(DJLoginGUI.class);
}
});
}
</pre>
En la linea <b>5</b> estamos creando la instancia con el patrón de diseño <strong>Singleton</strong>, el código ya está tomando forma.<br/>
Este es el código completo de nuestra clase.
<div id="wrap">
<a href="#" id="mostrar-mas" class="mostrarLink" onclick="mostrarOcultar('mostrar');return false;">Mostrar el codigo.</a>
<div id="mostrar" class="more">
<a href="#" class="ocultarLink" onclick="mostrarOcultar('mostrar');return false;">Ocultar el codigo.</a>
<pre class="brush: java;">
package datojava.gui;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import datojava.singleton.DJSingleton;
/**
*
* @author datojava.blogspot.com
*
*/
public class DJLoginGUI {
private JFrame frame = new JFrame("DatoJava Swing");;
private JPanel panel = new JPanel();
private JLabel labelUsuario;
private JLabel labelClave;
private JTextField textFieldUsuario;
private JPasswordField passwordFieldClave;
private JButton buttonIngresar;
public void inicializarComponentes() {
// Instanciar Componentes
labelUsuario = new JLabel("Usuario");
labelClave = new JLabel("Clave");
textFieldUsuario = new JTextField();
passwordFieldClave = new JPasswordField();
buttonIngresar = new JButton("Ingresar");
// Estilo del boton
buttonIngresar.setFont(new java.awt.Font("Arial Black", 0, 12));
buttonIngresar.setCursor(new Cursor(Cursor.HAND_CURSOR));
buttonIngresar.setBorder(null);
buttonIngresar.setContentAreaFilled(false);
// Listener del boton
buttonIngresar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (textFieldUsuario.getText().equals("datojava")
&& claveCorrecta(passwordFieldClave.getPassword())) {
// Ingresa Al sistema
} else {
JOptionPane.showMessageDialog(null, new String(
"Usuario/Clave Incorrecto"), "Ok", 0);
}
}
});
// Agregar los componentes al panel
agregarComponentesAlPanel(this.panel);
}
private static boolean claveCorrecta(char[] claveIngresada) {
boolean correcto = true;
char[] clave = { '1', '2', '3', '4', '5', '6' };
if (claveIngresada.length != claveIngresada.length) {
correcto = false;
} else {
correcto = Arrays.equals(claveIngresada, clave);
}
Arrays.fill(clave, '0');
return correcto;
}
public void agregarComponentesAlPanel(JPanel panel) {
panel.setLayout(null);
labelUsuario.setBounds(20, 30, 100, 30);
labelClave.setBounds(20, 50, 100, 30);
textFieldUsuario.setBounds(82, 33, 100, 20);
passwordFieldClave.setBounds(82, 58, 100, 20);
buttonIngresar.setBounds(165, 80, 80, 20);
panel.add(labelUsuario);
panel.add(labelClave);
panel.add(textFieldUsuario);
panel.add(passwordFieldClave);
panel.add(buttonIngresar);
panel.setSize(150, 250);
crear(panel);
}
public void crear(JPanel panel) {
frame.setJMenuBar(null);
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(frame.getContentPane().getHeight(), frame
.getContentPane().getWidth());
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
}
public DJLoginGUI() {
inicializarComponentes();
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
DJLoginGUI loginGUI = DJSingleton
.getInstancia(DJLoginGUI.class);
}
});
}
}
</pre>
</div>
</div>
Ya con esta clase podemos ejecutar nuestra aplicación y el resultado es este.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXAhoCz7KY8q0loroRl6LuafnUS-sPrDP-K40SNdGlcwENgdl-E9s-zFFEVkcI1taKQgRetVT_knwpAMt0zBzI3jOkclCqaherT2_ttZe3oQ_UT-dT9SChypH3LSuDoHjWX26llAaPz20/s1600/SwingDatoJavaLoginGUI.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Login GUI" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXAhoCz7KY8q0loroRl6LuafnUS-sPrDP-K40SNdGlcwENgdl-E9s-zFFEVkcI1taKQgRetVT_knwpAMt0zBzI3jOkclCqaherT2_ttZe3oQ_UT-dT9SChypH3LSuDoHjWX26llAaPz20/s1600/SwingDatoJavaLoginGUI.png">
</a>
<figcaption>
Login GUI
</figcaption>
</figure>
</div>
Ya tenemos la primera ventana, ahora vamos a implementar la interfaz de inicio en la clase <code class="codigo">DJInicioGUI</code>, en esta GUI vamos a tener una pequeña barra de herramientas con un menú simple en donde cada menuItem nos dirija a una <b>URL</b> especifica, un mensaje y un botón para cerrar sesión que nos devuelva de nuevo a la ventana <code class="codigo">DJLoginGUI</code> y así tendremos nuestra <strong>Mini Aplicación Swing</strong>.<br/>
Es bueno recordar que no vamos a tener los mismos componentes que en la interfaz anterior ya que solo vamos a utilizar un <strong>frame principal</strong>, que es el que hemos creado en la clase <code class="codigo">DJLoginGUI</code>, a ese frame le vamos a pasar un nuevo panel con otros componentes y así lo que hacemos es actualizar el frame cambiando de paneles. Vamos a la práctica de una vez. Primero que todo esta clase tiene que implementar <code class="codigo"><strong>ActionListener</strong></code> para poder controlar cuando el usuario quiere salir o cuando el usuario elige una opción de la barra de herramientas.
<pre class="brush: java;">
public class DJInicioGUI implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
}
}
</pre>
Estos son los componentes de la GUI.
<pre class="brush: java;">
private JLabel labelMensaje;
private JButton buttonSalir;
private JPanel panel;
private Desktop desktop = Desktop.isDesktopSupported() ? Desktop
.getDesktop() : null;
</pre>
Creamos una etiqueta que contiene el mensaje de inicio, el botón para cerrar sesión, el panel que después vamos a pasar al frame principal y el Desktop de la librería <u>java.awt.Desktop</u> para abrir el navegador desde la aplicación Swing. Ahora vamos a crear el constructor de la clase.
<pre class="brush: java; highlight: 2">
public DJInicioGUI() {
inicializarcomponentes();
}
</pre>
Vemos que en la línea <b>2</b> invocamos un método llamado <code class="codigo">inicializarcomponentes()</code>, vamos a implementarlo.
<pre class="brush: java;">
public void inicializarcomponentes() {
panel = new JPanel();
panel.setLayout(null);
labelMensaje = new JLabel(
"<html><body><font color='red'>"
+ "Este tutorial de Java Swing esta hecho por DatoJava, <b r/>"
+ "espero que puedan hacer cosas muy interesantes con el. Suerte!!<b r/><b r/>"
+ "Recuerda compartir y comentar la entrada... "
+ "</font> </body></html>");
buttonSalir = new JButton("Salir");
buttonSalir.addActionListener(this);
}
</pre>
Seguimos utilizando paneles sin layout, el label del mensaje es un poco interesante, el mismo tiene un texto en <strong>HTML</strong>, la razón de esto es porque si queremos hacer una etiqueta con saltos de línea y otras propiedades esta es la mejor manera, agregamos al botón de salir el <strong>ActionListener</strong> que implementa la clase para controlar cuando el usuario desea salir de la aplicación.<br/>
Ahora Procedemos a crear un método que nos devuelva un <strong>JPanel</strong> con los componentes ya ubicados y agregados al mismo y así podremos invocarlo desde la clase principal y actualizar la ventana en el momento en el que el usuario y la clave sean correctas. Este es el código del método <code class="codigo">JPanel agregarComponentesAlPanel()</code>.
<pre class="brush: java;">
public JPanel agregarComponentesAlPanel() {
labelMensaje.setBounds(10, 20, 300, 100);
buttonSalir.setBounds(180, 140, 100, 20);
panel.add(labelMensaje);
panel.add(buttonSalir);
panel.setSize(220, 325);
return panel;
}
</pre>
No hay mucho que explicar, solo ubicamos y agregamos los componentes al panel que devuelve el método. Y siguiendo la misma lógica vamos a crear un método que devuelva una barra de herramientas <code class="codigo">JMenuBar</code> para poder agregarla a la ventana de inicio, este metodo se llama <code class="codigo">JMenuBar crearMenuBar()</code>.
<pre class="brush: java;">
public JMenuBar crearMenuBar() {
JMenuBar menuBar;
JMenu menu;
JMenu submenu;
JMenuItem menuItem;
menuBar = new JMenuBar();
menu = new JMenu("Dato Java");
menuBar.add(menu);
// Item dentro del menu
menuItem = new JMenuItem("Ir a DatoJava");
menuItem.addActionListener(this);
menu.add(menuItem);
// Crear un submenu
submenu = new JMenu("Tutoriales Parecidos");
menuItem = new JMenuItem("Primera aplicacion con primefaces. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("Aplicación con ADF y JSF. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("iReport con PL-SQL y primefaces. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("Generar Excel desde Java. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_4,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("JUnit Assert tutorial. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_5,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menu.add(submenu);
return menuBar;
}
</pre>
Esta barra de herramientas tiene la funcionalidad para dirigirnos a una URL especifica, obviamente los voy redirigir a <a href="http://datojava.blogspot.com/" target="_blank">DatoJava</a> solo para demostrar la funcionalidad de esta barra de herramientas, la idea es que después ustedes jueguen con eso y le saquen provecho al ejemplo. En las primeras líneas declaramos los componentes para crear un barra de herramientas:
<ul>
<li><code class="codigo">JMenuBar menuBar</code>: esta es la barra de herramientas.</li>
<li><code class="codigo">JMenu menu</code>: es el menu principal de la barra de herramientas.</li>
<li><code class="codigo">JMenu submenu</code>: en teoría es otro menú, dentro del menú anterior, osea un submenu. Se declara igual que un menú común.</li>
<li><code class="codigo">JMenuItem menuItem</code>: con esto creamos cada opción del menú, por ejemplo el submenu tiene varios <code class="codigo">JMenuItem</code>.</li>
</ul>
A cada <code class="codigo">JMenuItem</code> le agregamos un atajo de teclado, por ejemplo si abrimos el menú y presionamos "<u>Alt + 1</u>" deberíamos ir a la URL de la primera opción del submenú, eso lo hacemos con este método<br/>
<code class="codigo">setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK))</code>, aparte de eso le agregamos el respectivo <strong>ActionListener</strong> a cada opción del menú y con eso podemos pasar a implementar el método <code class="codigo">actionPerformed(ActionEvent e)</code> para controlar todos los eventos del usuario.<br/>
<pre class="brush: java; highlight: [4,5,6,10]">
@Override
public void actionPerformed(ActionEvent e) {
// Si quiere salir del sistema
if (e.getActionCommand().equals("Salir")) {
DJLoginGUI loginGUI = DJSingleton.getInstancia(DJLoginGUI.class);
loginGUI.inicializarComponentes();
}
// Si elige una opción del menú y puede abrir el browser desde Java
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
try {
switch (e.getActionCommand()) {
case "Ir a DatoJava":
desktop.browse(new URL("http://datojava.blogspot.com/")
.toURI());
break;
case "Primera aplicacion con primefaces. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2014/10/primeraAplicacionPrimefaces.html")
.toURI());
break;
case "Aplicación con ADF y JSF. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2014/08/tutorialJavaJSFAdf.html")
.toURI());
break;
case "iReport con PL-SQL y primefaces. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html")
.toURI());
break;
case "Generar Excel desde Java. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2014/09/reporte-excel-con-java.html")
.toURI());
break;
case "JUnit Assert tutorial. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2015/01/junitAssertTutorial.html")
.toURI());
break;
case "Depurar aplicacion Java. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2014/07/depurarAplicacionJava.html")
.toURI());
break;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
</pre>
Explicando el método anterior en la línea <b>4</b> validamos si el usuario quiere salir del sistema, de ser el caso en las líneas <b>5</b>, <b>6</b> ya comenzamos a utilizar nuestra clase <strong>Singleton</strong> obteniendo una instancia de la clase <code class="codigo">DJLoginGUI</code> e invocando su método <code class="codigo">inicializarComponentes()</code> lo que provocará que nuestra ventana se actualice y aparezca de nuevo la ventana de login. Si el usuario elige una opción del menú procedemos a validar en la línea <b>10</b> si el usuario puede abrir el navegador, de ser el caso abrimos el navegador con la URL de la opción que eligio.<br/><br/>
Recuerdan que en la clase <code class="codigo">DJLoginGUI</code> no implementamos el evento que actualiza la ventana en el método <code class="codigo">inicializarComponentes()</code> cuando el usuario y la clave son correctas porque no habíamos creado la ventana de inicio, bueno ya esta creada y así es como implementamos ese evento.
<pre class="brush: java; highlight: [8,10,11,13,14,15,16,17]">
// Listener del boton
buttonIngresar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (textFieldUsuario.getText().equals("datojava")
&& claveCorrecta(passwordFieldClave.getPassword())) {
// Ingresa Al sistema
DJInicioGUI inicioGUI = DJSingleton
.getInstancia(DJInicioGUI.class);
frame.getContentPane().removeAll();
frame.repaint();
// Agregamos la barra de herramientas al frame
frame.setJMenuBar(inicioGUI.crearMenuBar());
frame.setContentPane(inicioGUI.agregarComponentesAlPanel());
frame.setSize(frame.getContentPane().getHeight(), frame
.getContentPane().getWidth());
frame.setVisible(true);
} else {
JOptionPane.showMessageDialog(null, new String(
"Usuario/Clave Incorrecto"), "Ok", 0);
}
}
});
</pre>
Si es correcto el usuario y la clave en la línea:
<ul>
<li><b>8</b>: obtenemos una instancia de la clase <code class="codigo">DJInicioGUI</code>.</li>
<li><b>10</b>: eliminamos todos los componentes existentes en el panel actual.</li>
<li><b>11</b>: refrescamos la ventana.</li>
<li><b>13</b>: agregamos la barra de herramientas a la ventana invocando el metodo <code class="codigo">crearMenuBar()</code> de la clase <code class="codigo">DJInicioGUI</code>.</li>
<li><b>14</b>: agregamos el panel de inicio a la ventana principal.</li>
<li><b>15,16,17</b>: ponemos el tamaño de la ventana y la hacemos visible.</li>
</ul>
Ya con esto esta lista nuestra <strong>Mini Aplicación Swing</strong>.<br/>
Este es el código completo de la clase <code class="codigo">DJInicioGUI</code><br/>
<div id="wrap">
<a href="#" id="mostrarr-mas-ini" class="mostrarLink" onclick="mostrarOcultarIni('mostrarr');return false;">Mostrar el codigo.</a>
<div id="mostrarr" class="more">
<a href="#" class="ocultarLink" onclick="mostrarOcultarIni('mostrarr');return false;">Ocultar el codigo.</a>
<pre class="brush: java;">
package datojava.gui;
import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.net.URL;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import datojava.singleton.DJSingleton;
public class DJInicioGUI implements ActionListener {
private JLabel labelMensaje;
private JButton buttonSalir;
private JPanel panel;
private Desktop desktop = Desktop.isDesktopSupported() ? Desktop
.getDesktop() : null;
public DJInicioGUI() {
inicializarcomponentes();
}
public void inicializarcomponentes() {
panel = new JPanel();
panel.setLayout(null);
labelMensaje = new JLabel(
"<html><body><font color='red'>"
+ "Este tutorial de Java Swing esta hecho por DatoJava, <b r/>"
+ "espero que puedan hacer cosas muy interesantes con el. Suerte!!<b r/><b r/>"
+ "Recuerda compartir y comentar la entrada... "
+ "</font> </body></html>");
buttonSalir = new JButton("Salir");
buttonSalir.addActionListener(this);
}
public JPanel agregarComponentesAlPanel() {
labelMensaje.setBounds(10, 20, 300, 100);
buttonSalir.setBounds(180, 140, 100, 20);
panel.add(labelMensaje);
panel.add(buttonSalir);
panel.setSize(220, 325);
return panel;
}
public JMenuBar crearMenuBar() {
JMenuBar menuBar;
JMenu menu;
JMenu submenu;
JMenuItem menuItem;
menuBar = new JMenuBar();
menu = new JMenu("Dato Java");
menuBar.add(menu);
// Item dentro del menu
menuItem = new JMenuItem("Ir a DatoJava");
menuItem.addActionListener(this);
menu.add(menuItem);
// Crear un submenu
submenu = new JMenu("Tutoriales Parecidos");
menuItem = new JMenuItem("Primera aplicacion con primefaces. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("Aplicación con ADF y JSF. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("iReport con PL-SQL y primefaces. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("Generar Excel desde Java. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_4,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menuItem = new JMenuItem("JUnit Assert tutorial. ");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_5,
ActionEvent.ALT_MASK));
menuItem.addActionListener(this);
submenu.add(menuItem);
menu.add(submenu);
return menuBar;
}
@Override
public void actionPerformed(ActionEvent e) {
// Si quiere salir del sistema
if (e.getActionCommand().equals("Salir")) {
DJLoginGUI loginGUI = DJSingleton.getInstancia(DJLoginGUI.class);
loginGUI.inicializarComponentes();
}
// Si elige una opción del menú y puede abrir el browser desde Java
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
try {
switch (e.getActionCommand()) {
case "Ir a DatoJava":
desktop.browse(new URL("http://datojava.blogspot.com/")
.toURI());
break;
case "Primera aplicacion con primefaces. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2014/10/primeraAplicacionPrimefaces.html")
.toURI());
break;
case "Aplicación con ADF y JSF. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2014/08/tutorialJavaJSFAdf.html")
.toURI());
break;
case "iReport con PL-SQL y primefaces. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html")
.toURI());
break;
case "Generar Excel desde Java. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2014/09/reporte-excel-con-java.html")
.toURI());
break;
case "JUnit Assert tutorial. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2015/01/junitAssertTutorial.html")
.toURI());
break;
case "Depurar aplicacion Java. ":
desktop.browse(new URL(
"http://datojava.blogspot.com/2014/07/depurarAplicacionJava.html")
.toURI());
break;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
</pre>
</div>
</div>
Recuerda que la clase <code class="codigo">DJLoginGUI</code> cambio porque hay que agregarle la implementación del <strong>ActionListener</strong> al botón de ingresar al sistema que acabamos de hacer.
<a name="aplicacionFinal"></a><h4>6. Aplicación Swing Final.</h4><br/>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho9skyXgoQ3YF3Zinl9a8mRX1mcK5JJiURmsVC3sTsP2hEf-g1gbrK0aFJa1s6YIO7rYJrsMzNVISjYx7w2_9MKL7_T9Bpj65SwjVqLn1NlnQSgNq-wmMiy69kfok_-WL6hQ7mIJm0Tfg/s1600/SwingAppDatoJava.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Swing App DatoJava" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho9skyXgoQ3YF3Zinl9a8mRX1mcK5JJiURmsVC3sTsP2hEf-g1gbrK0aFJa1s6YIO7rYJrsMzNVISjYx7w2_9MKL7_T9Bpj65SwjVqLn1NlnQSgNq-wmMiy69kfok_-WL6hQ7mIJm0Tfg/s1600/SwingAppDatoJava.gif">
</a>
<figcaption>
Swing App DatoJava
</figcaption>
</figure>
</div>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
Este <strong>dato java</strong> lo puedes expandir y con el crear una <strong>buena aplicación Java Swing</strong>, si te intereso la entrada y te perdiste en algún punto del tutorial aquí te dejo el <a href="https://mega.co.nz/#!LN0jAbya!rTMs7jJ8ddK9nVv9G7Uo7RFscf18j876_rVcJrs6iOg" target="_blank">proyecto</a> para que lo descargues, solo tienes que ponerlo en tu <a href="http://datojava.blogspot.com/2014/12/crearWorkspaceEclipse.html" target="_blank">Workspace</a> e importarlo en tu Eclipse/JBoss Developer Studio. Suerte, no olvides comentar.
<br/>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.pe/2015/11/vaciarQuitarDatosDefaultTableModel.html" target="_blank"><strong>Vaciar DefaultTableModel.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html"><strong>Tutorial iReport con Oracle PL/SQL y Primefaces Parte 1.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/10/primeraAplicacionPrimefaces.html"><strong>Tutorial Primefaces con JSF. Primera aplicación.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/08/tutorialJavaJSFAdf.html"><strong>Tutorial ADF y JSF, aplicación web.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/junitEclipseJbossTutorial.html"><strong>Pruebas unitarias con JUnit y eclipse. Tutorial rápido.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/05/comoInstalarWindowbuilderEclipseJBossDev.html"><strong>Como instalar WindowBuilder en eclipse/JBoss Developer Studio.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-61138766902342888932015-05-22T15:50:00.001-07:002015-05-22T15:50:59.418-07:00Como instalar WindowsBuilder en eclipse o en JBoss Developer Studio<html>
<head>
<title>
Como instalar WindowBuilder en eclipse/JBoss Developer Studio.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Instalación del plugin WindowBuilder en eclipse/JBoss Developer Studio..
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br />
<article>
<div>
<div style='float:left; margin:5px 6px 0px 5px'>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Cuadrado contenido entradas -->
<ins class="adsbygoogle"
style="display:inline-block;width:180px;height:150px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="7309856003"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>Cuando necesitamos hacer una interfaz grafica nos ponemos creativos primero en nuestra mente, a veces agarramos un papel y lapiz y comenzamos a dibujar como sería nuestra interfaz, también por cosas de rapidez es necesario utilizar algún programa que con solo arrastrar los componentes a una ventana podamos construir la interfaz y mejor aún si nos va creando el codigo de una vez, aquí es donde entra en el juego el <strong>plugin</strong> para eclipse o JBoss Developer Studio que lleva por nombre <strong>WindowBuilder</strong>, personalmente si tengo tiempo y estoy en la capacidad prefiero crear la interfaz manualmente (siento que así aprendo un poco más). Si descargamos eclipse/JBoss Developer Studio en cualquier version reciente ya viene el plugin incluido pero hay veces en las que ya tenemos una version que no tiene ese plugin y necesitamos agregarlo a nuestro developer de esta manera:<br/>
</div>
<b>1)</b> Ingresamos a este link oficial de <a href="http://eclipse.org/windowbuilder/download.php">eclipse</a>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbg4_-VOu29AUKgONNStvAeK_AV3_v3kNJstpaqPu8GiErrUAWol2PHKy-lNCnnVh3XIF29TTQtA1z6UAuT1MJ8PEN5KaSmV3Yi1mGQ2-Tt2DCnLyeAwfIWy704ANxXljT1LD7BrVP4nE/s1600/DescargarWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Descargar WindowBuilder" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbg4_-VOu29AUKgONNStvAeK_AV3_v3kNJstpaqPu8GiErrUAWol2PHKy-lNCnnVh3XIF29TTQtA1z6UAuT1MJ8PEN5KaSmV3Yi1mGQ2-Tt2DCnLyeAwfIWy704ANxXljT1LD7BrVP4nE/s1600/DescargarWindowBuilderDatoJava.png" />
</a>
<figcaption>
Descargar WindowBuilder
</figcaption>
</figure>
</div>
<a name='more'></a>
<b/>2)</b> Buscamos la versión del <strong>WindowBuilder</strong> que vamos agregar y copiamos el enlace. (Posicionar el cursor en la version<b>></b> presionar clic derecho<b>></b> Copiar direccion de enlace.) En este caso vamos a instalar la ultima versión, 4.4 (<strong>Luna</strong>).
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh33vT8qYtj3NFwTUIYZv8T9QLRbzMF7w_fdphNCAolR2_suxt_rtl2ZOYCYeYcFSA8p-5LIjTeOCyvFNNuQXckVNIz6YpmlBAofJf4cwHcHGCmr0l7FFUC-yrzYYwl5YH9GlvmlUwPPQ4/s1600/VersionWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Versión WindowBuilder" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh33vT8qYtj3NFwTUIYZv8T9QLRbzMF7w_fdphNCAolR2_suxt_rtl2ZOYCYeYcFSA8p-5LIjTeOCyvFNNuQXckVNIz6YpmlBAofJf4cwHcHGCmr0l7FFUC-yrzYYwl5YH9GlvmlUwPPQ4/s1600/VersionWindowBuilderDatoJava.png" />
</a>
<figcaption>
Versión WindowBuilder
</figcaption>
</figure>
</div>
<b>3)</b> Abrimos eclipse/JBoss Developer Studio, en la barra de herramientas seleccionamos: Help<b>></b>Install New Software...
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZSbZ77HZB-5JhOa-QC6t_4nFmFED-XEKIWXV49BMQQ8u2hKnpIqf_nWLRaqtn2USL8D8n9IimDOgkHWdbkEW5C_xiNrFi2dJuoCfsVSyypFkqVU9BRgj7H0y5vbBaE96Obi6TLACWs1E/s1600/NewSoftwareWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Help WindowBuilder" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZSbZ77HZB-5JhOa-QC6t_4nFmFED-XEKIWXV49BMQQ8u2hKnpIqf_nWLRaqtn2USL8D8n9IimDOgkHWdbkEW5C_xiNrFi2dJuoCfsVSyypFkqVU9BRgj7H0y5vbBaE96Obi6TLACWs1E/s1600/NewSoftwareWindowBuilderDatoJava.png" />
</a>
<figcaption>
Help WindowBuilder
</figcaption>
</figure>
</div>
<b>4)</b> En el input <b>Work with</b> copiar el link que copiamos anteriormente de la versión del <strong>WindowBuilder</strong>, si no aparece nada en la sección <b>Name | Version</b> presionar el boton <b><i>Add</i></b> y el boton <b><i>Ok</i></b>. Debería aparecer algo parecido a esto:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaTaqth-rVS9vtjLBbKspJr6faNCe8WsNw0xXnpYAMVPT3TstkwTtubnT8j939gxZ24HVFAafQmtD_leDFCwi3UM5JQteIOEMG83zy_wXO_Sihb7oE6xZ26ZaCUFRzWp1rP4b1hu4JyeU/s1600/LinkWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Link WindowBuilder" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaTaqth-rVS9vtjLBbKspJr6faNCe8WsNw0xXnpYAMVPT3TstkwTtubnT8j939gxZ24HVFAafQmtD_leDFCwi3UM5JQteIOEMG83zy_wXO_Sihb7oE6xZ26ZaCUFRzWp1rP4b1hu4JyeU/s1600/LinkWindowBuilderDatoJava.png" />
</a>
<figcaption>
Link WindowBuilder
</figcaption>
</figure>
</div>
<b>5)</b> Presionamos el boton <b><i>Select All</i></b> para instalar todos los items.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKAME-wQEL9hUaAUjN3-OMyZ9wj54ZLErNIwqExnnDfeGoZ3cR8Tl6-ZDf7O-BeTyqbWEwTW5rASpf2giQ7cuJTdhnfMndItWRxBeAe6NS-WDsayptiGemZdlHPAxBNUEt7f8srCjVsvE/s1600/SelectAllWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="SelectAll WindowBuilder" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKAME-wQEL9hUaAUjN3-OMyZ9wj54ZLErNIwqExnnDfeGoZ3cR8Tl6-ZDf7O-BeTyqbWEwTW5rASpf2giQ7cuJTdhnfMndItWRxBeAe6NS-WDsayptiGemZdlHPAxBNUEt7f8srCjVsvE/s1600/SelectAllWindowBuilderDatoJava.png" />
</a>
<figcaption>
SelectAll WindowBuilder
</figcaption>
</figure>
</div>
Presionamos el boton <b><i>Next ></i></b>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWszYdQUMp8cuKBnjU2eyazxHc001bQgfhWJZUvZkqWYWUif_QQJomlEygoMe5VNgd1r5UAg0HkpBsLceO5GI77Ky766cybgK6SV1iUDQE0NZnITgKDpNRFMfZuiTfwPtQ-QwT_HOjcUM/s1600/NextWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Items a instalar" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWszYdQUMp8cuKBnjU2eyazxHc001bQgfhWJZUvZkqWYWUif_QQJomlEygoMe5VNgd1r5UAg0HkpBsLceO5GI77Ky766cybgK6SV1iUDQE0NZnITgKDpNRFMfZuiTfwPtQ-QwT_HOjcUM/s1600/NextWindowBuilderDatoJava.png" />
</a>
<figcaption>
Items a instalar
</figcaption>
</figure>
</div>
Aceptamos los terminos y condiciones, presionamos de nuevo el boton <b><i>Next ></i></b>, .
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmS3-gNeBeb0hpsZ_Q9o6vsSDbt8NTLEVbP0lmthrewyvLKnfJxrpFPC11t8sJYppv6eic28vlcdTVrEZKT9Kz7tvZlOTDWGcyVZdiRhepaieStEQtoeIlly0QnZ90IR6yz7DKAYTRHPs/s1600/AceptarWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Aceptar Terminos y Condiciones" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmS3-gNeBeb0hpsZ_Q9o6vsSDbt8NTLEVbP0lmthrewyvLKnfJxrpFPC11t8sJYppv6eic28vlcdTVrEZKT9Kz7tvZlOTDWGcyVZdiRhepaieStEQtoeIlly0QnZ90IR6yz7DKAYTRHPs/s1600/AceptarWindowBuilderDatoJava.png" />
</a>
<figcaption>
Aceptar Terminos y Condiciones
</figcaption>
</figure>
</div>
Presionamos el boton <b><i>Finish</i></b> para iniciar la instalación.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdzQSXLcknXtOqBHBgXUa9RytysN7gvIxqHUfgKxXnxWY0DeSnM73-YeFnH22Ii_xtVHUNOMoKvt05Sidh4_tp5KqLJPCki0y3KD_oep5KUn4_3-ETugY88gXSTNwNIjALBLE7TDqN74k/s1600/FinishWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Progreso Instalacion WindowBuilder" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdzQSXLcknXtOqBHBgXUa9RytysN7gvIxqHUfgKxXnxWY0DeSnM73-YeFnH22Ii_xtVHUNOMoKvt05Sidh4_tp5KqLJPCki0y3KD_oep5KUn4_3-ETugY88gXSTNwNIjALBLE7TDqN74k/s1600/FinishWindowBuilderDatoJava.png" />
</a>
<figcaption>
Progreso Instalacion WindowBuilder
</figcaption>
</figure>
</div>
Esto puede demorar un rato dependiendo de tu velocidad de internet y la cantidad de items a instalar así que no desesperes, si te molesta la ventana que muestra el progreso de la instalación puedes presionar el boton <b><i>Run in Background</i></b> para que puedas seguir utilizando tu developer tranquilamente.<br/><br/>
<b>6)</b> Después de descargar todos los items tenemos que reiniciar el eclipse o el JBoss Developer Studio.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifBd0PBYOFaTrUsbQxv4B7bmc4iVaYlUJxdlJwAjvqcrGOtEjFCt21ctJO0SwHhNtwZteIkyiCKwd-TCyXcc4MajiAfsOwEvSIYvJmLfDSI076UhNXzrXaGkTCFvD4w2h34t_FdUyaAHU/s1600/RestartWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Reiniciar eclipse/JBoss Developer Studio" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifBd0PBYOFaTrUsbQxv4B7bmc4iVaYlUJxdlJwAjvqcrGOtEjFCt21ctJO0SwHhNtwZteIkyiCKwd-TCyXcc4MajiAfsOwEvSIYvJmLfDSI076UhNXzrXaGkTCFvD4w2h34t_FdUyaAHU/s1600/RestartWindowBuilderDatoJava.png" />
</a>
<figcaption>
Reiniciar eclipse/JBoss Developer Studio
</figcaption>
</figure>
</div>
<b>7)</b> Una vez reiniciado el Developer vamos a comprobar que de verdad se instalo nuestra plugin de <strong>WindowBuilder</strong> creando un proyecto nuevo. Primero en la barra de herramientas de nuestro Developer y en la esquina superior izquierda presionamos el boton <img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9nL-rkLefEoVAYULMWYgJZb4pLXMyF6A2h-Aqwpc-uXLgLCxbMCqEkORCPSdkV8VWp_96poGVMwVQ5eY6k8fal2b3gLJsckkLSk2F1jQNOxseqKjyx7cxlEtoFB_phYBofPn-8_z28Uo/s200/BotonNewProject.png" /> o vamos a la opción File <b>></b> New<b>></b> Other...
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEKcNMGVqrElQjqsK9ePVcoG6QmgaFEas2DvFygDi4fr5X7hi_Iwyildk3pjt5ZrrFFzSA6dmhJ8fHeYkVnkdpR_XRNm1f1WeUUPcm1xk6KSEDbnTNMtBVPLIRtF8ZL3vpQscXlJDha54/s1600/NewProjectWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="New Project eclipse/JBoss Developer Studio" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEKcNMGVqrElQjqsK9ePVcoG6QmgaFEas2DvFygDi4fr5X7hi_Iwyildk3pjt5ZrrFFzSA6dmhJ8fHeYkVnkdpR_XRNm1f1WeUUPcm1xk6KSEDbnTNMtBVPLIRtF8ZL3vpQscXlJDha54/s1600/NewProjectWindowBuilderDatoJava.png" />
</a>
<figcaption>
New Project eclipse/JBoss Developer Studio
</figcaption>
</figure>
</div>
Ahora se abre una ventana tipo wizard en donde vamos a buscar la opción <strong>WindowBuilder</strong>, si aparece la opción ya esta instalado y todo esta bien.<br/><br/>
<b>8)</b> Para comenzar a utilizar el <strong>WindowBuilder</strong> creamos un proyecto normal de <strong>Java</strong> (es opcional, si tienes un proyecto ya creado puedes trabajar con el), después de eso vamos a buscar de nuevo en el wizard para crear un proyecto nuevo la opción de <strong>WindowBuilder</strong><b>></b> Swing Designer<b>></b> Application Window y presionamos el boton <b><i>Next ></i></b>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxEM6eel5D7KSArG-wVGZhcYvCEBDbufG5IJmLDoMYskpXWJ7aYy4X1MGXPyUaFkFZCtuLMfgwdxRaoxi19pfzRuSW_oUg1DwnpH8jZW4ve4VBb2gjZeHIYptIMG7vZgL5TQkd7NJ6hGE/s1600/NuevoWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="WindowBuilder eclipse/JBoss Developer Studio" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxEM6eel5D7KSArG-wVGZhcYvCEBDbufG5IJmLDoMYskpXWJ7aYy4X1MGXPyUaFkFZCtuLMfgwdxRaoxi19pfzRuSW_oUg1DwnpH8jZW4ve4VBb2gjZeHIYptIMG7vZgL5TQkd7NJ6hGE/s1600/NuevoWindowBuilderDatoJava.png" />
</a>
<figcaption>
WindowBuilder eclipse/JBoss Developer Studio
</figcaption>
</figure>
</div>
Aparece otra ventana en la cual vamos a elegir en que proyecto existente vamos a crear la nueva aplicación Swing con <strong>WindowBuilder</strong>.<br/>
<b><u>Source folder:</u></b> presionamos el boton <b><i>Browse</i></b> y elegimos el proyecto en donde vamos a crear la aplicación.<br/>
<b><u>Package:</u></b> elegimos el paquete en donde vamos a crear la clase.<br/>
<b><u>Name:</u></b> copiamos el nombre de la clase. <br/>
Presionamos el boton <b><i>Finish</i></b> y listo.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr89DujHb63myWjl9GWSbJrQM9dkTX8yzascWlKfs6O2qFclJQI-FFTsnCV9iqdfFwSLpHJKUd7_6KvUbwGKI1HiQTsA_S9ZiW0EPDJkgwy9SprBfE9N3Ws8yZ3sFDDwfdJ2phj8mujYo/s1600/ConfiguracionWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Configuración Aplicación WindowBuilder" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr89DujHb63myWjl9GWSbJrQM9dkTX8yzascWlKfs6O2qFclJQI-FFTsnCV9iqdfFwSLpHJKUd7_6KvUbwGKI1HiQTsA_S9ZiW0EPDJkgwy9SprBfE9N3Ws8yZ3sFDDwfdJ2phj8mujYo/s1600/ConfiguracionWindowBuilderDatoJava.png" />
</a>
<figcaption>
Configuración Aplicación WindowBuilder
</figcaption>
</figure>
</div>
Ahora podemos ver nuestra clase creada y comenzar hacer nuestra interfaz grafica con <strong>WindowBuilder</strong>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6ZPnEZRO2VrOaGI5xAeV9Ch283Gizk3oHdjnP8d_KNWkCBEmirfVnIsEB5Q-q-82vlpcD78hDwUcR74Zf2Wfc1Gn0MZ9Cga7DiUG9ecDtMd7rq0faD0D6M7BsoNrb7nyo86eD12LBm9w/s1600/InstalacionCompletaWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Instalación completa WindowBuilder" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6ZPnEZRO2VrOaGI5xAeV9Ch283Gizk3oHdjnP8d_KNWkCBEmirfVnIsEB5Q-q-82vlpcD78hDwUcR74Zf2Wfc1Gn0MZ9Cga7DiUG9ecDtMd7rq0faD0D6M7BsoNrb7nyo86eD12LBm9w/s1600/InstalacionCompletaWindowBuilderDatoJava.png" />
</a>
<figcaption>
Instalación completa WindowBuilder
</figcaption>
</figure>
</div>
Un plus para esta entrada, si tenemos un proyecto de <strong>Swing</strong> creado con anterioridad podemos abrir las clases con <strong>WindowBuilder</strong> y acomodarlas o simplemente ver de que manera se ven. Para hacer eso solo nos posicionamos en la clase que queremos abrir y presionamos Clic derecho<b>></b> Open With<b>></b> WindowBuilder Editor y estamos listos, ya podemos ver como se ve la ventana.
<center>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBS3OQkMC-nOKsagPnVL-QZVisRWViIIENjgGEaM9P2bCxY64jr-HhHSVdBgwrSe-VxURaBnS3r_IvzOwaSt8iHJgSTOs6a-WWhBDafC-hgYGGGg6Ef4x7dAYzC1iVep242tBqSXlkBDk/s1600/AbrirSwingConWindowBuilderDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Abrir clase Swing con WindowBuilder" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBS3OQkMC-nOKsagPnVL-QZVisRWViIIENjgGEaM9P2bCxY64jr-HhHSVdBgwrSe-VxURaBnS3r_IvzOwaSt8iHJgSTOs6a-WWhBDafC-hgYGGGg6Ef4x7dAYzC1iVep242tBqSXlkBDk/s1600/AbrirSwingConWindowBuilderDatoJava.png" />
</a>
<figcaption>
Abrir clase Swing con WindowBuilder
</figcaption>
</figure>
</div>
Buena idea si estas aprendiendo y tienes un proyecto de escritorio ya hecho y aparte del codigo quieres ver como se ve esa ventana rapidamente. Suerte, comparte y comenta cualquier duda.
</article>
<br/>
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/05/diferenciaEntreThrowyThrowsEnJava.html"><strong>Diferencias entre throw y throws en Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/07/depurarAplicacionJava.html"><strong>Como depurar (debug) una aplicación en Java</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/05/insta.html"><strong>Como instalar el agente del JBoss ON Server, jon server.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html"><strong>Tutorial iReport con Oracle y Primefaces desde 0.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-90421076847551473762015-05-19T09:02:00.000-07:002016-07-21T07:29:48.395-07:00Diferencia entre throw y throws en Java.<html>
<head>
<title>
Diferencia entre throw y throws en Java.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Diferencias entre throw y throws, como utilizar estas palabras reservadas.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br />
<article>
Hablando de excepciones en <strong>Java</strong> a veces caemos en la confusión con las palabras reservadas <code class="codigo">throw</code> y <code class="codigo">throws</code> ya que son muy similares, voy a dar unos breves ejemplos de cómo se utilizan y para qué sirven. Las excepciones en Java son básicamente los problemas o fallas que puede tener nuestra aplicación al momento de ejecutarla o en su ejecución, estas excepciones tenemos que manejarlas en los respectivos bloques de <code class="codigo">try - catch</code>. La palabra reservada <code class="codigo">throw</code> nos sirve para lanzar una excepción en cualquier bloque de código de nuestra aplicación, si te preguntas cual es la utilidad de esto te pongo el siguiente caso:<br/><br/>
Supongamos que hacemos un método en el cual validamos ciertos datos, si hay un dato que según nuestros cálculos excede de un determinado valor podemos lanzar una excepción, ya sea creada por nosotros mismos o cualquiera del tipo <code class="codigo">java.lang.throwable</code>, por ejemplo:
<pre class="brush: java; highlight: 7">
public void pruebaThrow() throws Exception {
Exception exception = new Exception();
int a = 98;
int b = 101;
if (a > 100 || b > 100) {
throw exception;
}
}
</pre>
Como vemos en la línea número <b>07</b> lanzamos la excepción! OjO, ya sabemos que estas cosas hay que validarlas y no lanzar excepción de una vez, solo pongo esto de ejemplo para entender su funcionalidad...<br/>
Al hacer eso notaremos que la aplicación se detiene por la excepción.
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
La palabra reservada <code class="codigo">throws</code> funciona para indicarnos que un método lanza una excepción de un tipo especifico o general, se puede utilizar si la excepción se va manejar con un <code class="codigo">try - catch</code> o no. Así se utiliza:
<pre class="brush: java;">
public static void prueba() throws SQLException {
// Manejamos la excepcion de tipo SQL
}
public static void prueba() throws NullPointerException {
// Manejamos la excepcion de tipo NULL
}
public static void prueba() throws DataFormatException {
// Manejamos la excepcion de tipo DataFormat
}
</pre>
Si te fijas en el primer ejemplo de <code class="codigo">throw</code> ya utilizamos la palabra reservada <code class="codigo">throws</code> para especificar que ese metodo lanzaba una excepción. No hay mas nada que explicar por ahora...
</article>
<br/>
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2016/07/queEsHashMapYComoFunciona.html" target="_blank"><strong>Que es un HashMap y como funciiona.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/jndiDatasourceJavaJBoss.html"><strong>JNDI Datasource en JBoss.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/07/depurarAplicacionJava.html"><strong>Como depurar (debug) una aplicación en Java</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/dosJbossMismaMaquina.html"><strong>Tener dos JBoss en la misma maquina.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com7tag:blogger.com,1999:blog-9116102449526922332.post-67333357587495763422015-03-30T13:44:00.000-07:002016-06-06T15:08:25.364-07:00iReport con Oracle PL-SQL y Aplicación Java Web Primefaces. Parte 2.<html>
<head>
<title>
iReport con Oracle PL-SQL y Aplicación Web.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Tutorial de Jaspersoft iReport 5.6.0 utilizando Oracle PL-SQL y ejecutando el Reporte desde aplicación Java web con Primefaces. Parte 2.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7BXdS-wO-BC8ni_3UWrKu_hwAX-e4ShOgZpqXvj-zN-MZaDlVs0LzYD84bj4ZM50sRtwrzxGnVwRmwr-iGm6nhXhCu1Rn8Sy30UiAciWbzjzcegnFiZz-5hpTfar4gIi9pIcrLaH-FhI/s1600/JaspersoftPrimefacesPlsqlLogo2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 0.5em; margin-right: 0.5em;"><img alt="Jaspersoft iReport 5.6.0 utilizando Oracle PL-SQL y Java" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7BXdS-wO-BC8ni_3UWrKu_hwAX-e4ShOgZpqXvj-zN-MZaDlVs0LzYD84bj4ZM50sRtwrzxGnVwRmwr-iGm6nhXhCu1Rn8Sy30UiAciWbzjzcegnFiZz-5hpTfar4gIi9pIcrLaH-FhI/s1600/JaspersoftPrimefacesPlsqlLogo2.png"></a>Ya que en la <a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html" target="_blank">1era parte del Tutorial</a> creamos todo lo que tiene que ver con el Jaspersoft iReport y la parte de Oracle PL/SQL en esta 2da parte vamos a crear la aplicación en Java para ejecutar el reporte, como dije anteriormente al momento de compilar el reporte en el Jaspersoft iReport se crean dos archivos en el directorio que hemos elegido, uno con la extensión <i><b>.jasper</b></i> y otro con la extensión <i><b>.jrxml</b></i>, el que nosotros vamos a ejecutar es el <i><b>.jasper</b></i> ya que el otro sirve para que puedas modificarlo en directamente en el iReport, la aplicación que ejecute dicho archivo será web y la vamos a crear con el framework para JSF que se llama <strong>Primefaces</strong>, hace un tiempo ya hemos hecho un tutorial para crear una aplicación desde 0 con Primefaces obteniendo como resultado una página con un menú, este es el <a href="http://datojava.blogspot.com/2014/10/primeraAplicacionPrimefaces.html" target="_blank">Tutorial</a>, vamos a seguir con ese mismo ejemplo (puedes descargar el proyecto de ese tutorial desde <a href="https://mega.co.nz/#!fQclxS5Q!TjxZ2p12AzSSMWNZaLmdHlocB8e_Mye8omJIRwZUSZY" target="_blank">aquí</a>). Para no hacer tan larga esta estrada ya que la misma está centrada en la ejecución del reporte desde una aplicación Java web utilizando Primefaces, vamos a crear en el menú un nuevo ítem, en ese nuevo ítem vamos a ejecutar el reporte que creamos con iReport, así que vamos hacer unas modificaciones pequeñas en el proyecto para llevar a cabo la ejecución del reporte. <br/>
Ahora tenemos que crear nuestro managed bean que se encargara de hacer la lógica y mostrar nuestro reporte, primero crearemos un paquete llamado "<b>beansDatoJava</b>" y dentro del mismo crearemos el managed bean llamado "<b>DatoJavaReporteBean</b>" con un método que se llame <code class="codigo">ejecutarReportePDF</code> el cual vamos a implementar más adelante.<a name='more'></a> Así debería verse nuestra estructura del proyecto ahorita:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXY-atlRH_8y9w3m8-XrJloxp4HE9tfISPwEMEs6_fC1yv6K0C6hjrxZTb_PqXI45rXXujH6CSASm59T8OvDpfdVXhzDAAfha30ec7HeiQiwEqgvpZFvdKeCEyajOlps4CWzZaPJ7RHeE/s1600/iReport5.6.0JDBCProjectPrimefacesDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Primefaces Estructura" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXY-atlRH_8y9w3m8-XrJloxp4HE9tfISPwEMEs6_fC1yv6K0C6hjrxZTb_PqXI45rXXujH6CSASm59T8OvDpfdVXhzDAAfha30ec7HeiQiwEqgvpZFvdKeCEyajOlps4CWzZaPJ7RHeE/s1600/iReport5.6.0JDBCProjectPrimefacesDatoJava.png">
</a>
<figcaption>
Primefaces Estructura
</figcaption>
</figure>
</div>
Ahora vamos a registrar nuestro managed bean en el archivo de navegación de JSF, en el <code class="codigo">faces-config.xml</code>, este será el código:
<pre class="brush: xml;">
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
version="2.1">
<managed-bean>
<managed-bean-name>DJReporte</managed-bean-name>
<managed-bean-class>beansDatoJava.DatoJavaReporteBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config> </pre>
Ya registramos el managed bean y podemos utilizarlo en la pagina en donde está el menú, para refrescar un poco la memoria este es el menú que resulto del <a href="http://datojava.blogspot.com/2014/10/primeraAplicacionPrimefaces.html" target="_blank">Tutorial</a> de Primefaces:</div>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN76defiup-iDbK9ssTau4MVKNA9FanXoeejok65tWkdY_YUU8q4puNv-xLw5c24LJ7tQ5Ctf_TIMEvW4ggfgAlRbIORF81IvQyO4GKQ2m9P0kT-qXi6E2CJm8qhraaLnBwnuXPgnec_0/s1600/primefacesDatoJavaEj.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Primefaces Menú" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN76defiup-iDbK9ssTau4MVKNA9FanXoeejok65tWkdY_YUU8q4puNv-xLw5c24LJ7tQ5Ctf_TIMEvW4ggfgAlRbIORF81IvQyO4GKQ2m9P0kT-qXi6E2CJm8qhraaLnBwnuXPgnec_0/s1600/primefacesDatoJavaEj.png">
</a>
<figcaption>
Primefaces Menú
</figcaption>
</figure>
</div>
Este es el código de la pagina que tiene el menú:
<pre class="brush: xml;">
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<f:view>
<h:head>
<title>datojava.blogspot.com</title>
</h:head>
<h:body>
<h:form>
<p:outputLabel value="Tutorial de datojava.blogspot.com"/>
<p:separator/>
<p:spacer height="25px"/>
<p:panelMenu style="width:300px">
<p:submenu label="Menu">
<p:menuitem value="DatoJava" url="http://datojava.blogspot.com/" />
<p:menuitem value="Primefaces" url="http://primefaces.org/" />
</p:submenu>
</p:panelMenu>
</h:form>
</h:body>
</f:view>
</html>
</pre>
A ese menú vamos agregarle un nuevo ítem que lleve por nombre "<b>Reporte con iReport</b>" que será el que haga la llamada al método <code class="codigo">ejecutarReportePDF</code> que ya creamos en el bean <code class="codigo">DatoJavaReporteBean</code>:
<pre class="brush: xml;">
<p:menuitem value="Reporte con iReport" action="#{DJReporte.ejecutarReportePDF()}" ajax="false"/>
</pre>
Con eso creamos la nueva entrada en el menú, esa propiedad que se llama <i><b>ajax</b></i> hay que ponerla en <code class="codigo">false</code> porque sino nunca va mostrar el reporte en el lado del <i>cliente</i>, eso es un inconveniente tonto que puede quitar tiempo así que pendiente con eso. Ya con eso tenemos todo listo, ahora como te imaginaras para poder llevar a cabo este tutorial el proyecto necesita unas cuantas librerías, las librerías que vamos a utilizar son las versiones más actualizadas o las que son dependientes de otras, recuerda que estamos utilizando <strong>primefaces-5.0.jar</strong> y el reporte lo hicimos con el ultimo Jaspersoft iReport a la fecha, el <strong>Jaspersoft iReport Designer 5.6.0</strong>, aquí te dejo los <i><b>jars</b></i> para que los descargues uno por uno y los incorpores a tu classpath.<br><br/>
Descarga de jars:
<ul>
<li><a href="https://mega.co.nz/#!GYsT2TYA!HZnqdXM1YQUceg-DdThRDbyE4esXtG7VNcl_Ootp1pQ" target="_blank"><strong>commons-beanutils-1.8.3.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!3FF30AoI!mr-ym2i2IBbnSlK4iGjsy4ebrHnRb-kw9MxUhawlHDk" target="_blank"><strong>commons-collections-3.2.1.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!KIUQ3IiA!tH1wxtHn3Nv2a5okatoyEfKKbGtWy-WfiKflW-kkr6c" target="_blank"><strong>commons-digester-1.8.1.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!GcMGjLwb!_s4titJAbyQ-BnupLQGpQkqH5grdteH0fA0GnFRmE2E" target="_blank"><strong>commons-logging-1.2.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!qJNlUJyB!HuqGhsZ49iULJEQEwAgcooRIWqU_trWDiiS4Nou5fjU" target="_blank"><strong>groovy-all-1.0-beta-10.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!GBc0QSKA!pv5ww-Pb9gpeh9-k42OhHvUACTxSPKx7p63hgIahakM" target="_blank"><strong>ireport.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!aFszWDBY!ZfbXRSAmBPbw64YsDwcP0ZSuACfXlZi0SM4Go9-wC70" target="_blank"><strong>itext-pdfa-5.5.5.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!6R8RSD4Q!9GRz4EmZC6Jj6gXFQwUY3PLBcYwjgCwfYYerT2LEXM8" target="_blank"><strong>itextpdf-5.5.5.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!qMdHmDxZ!cE9f53J4B_fECy8p8hRPCEne5IEwu-Rq4eMSufInVDg" target="_blank"><strong>jasperreports-6.0.3.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!OdV3WRRD!gQJYbcpp30LjZdehEObzGWe8dRWo9objSfVBoOdOIuM" target="_blank"><strong>ojdbc14.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!HNcjXDRJ!Ox4imzTM6I35fsdktnZFnwHOomvGZJrUMJ20sk0EB3M" target="_blank"><strong>plsqlexecuter.jar</strong></a></li>
<li><a href="https://mega.co.nz/#!yJUigSiB!P7wDuvEwRzM498Ufdq6_LCUhbNhGKki1_XkBFLapIgU" target="_blank"><strong>primefaces-5.0.jar</strong></a></li>
</ul>
Ahora recuerda que después de haber agregado las librerías a tu classpath tienes que agregarlas al <b>Deployment Assembly</b>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA4Wj4LxtbEJHBoTfE7adNwNcGr_-ZDHvCPe8tScDgCTBqr8075jz0-Yw-UDufrNruVUS2b7XJhyphenhyphen-liwJgrvewSpTvW14AVNiBJeN48vi83ERqPgJf3KmaW9-08cMdXMqG8dSHG9ovbOQ/s1600/iReport5.6.0JDBCDeploymentAssemblyDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Deployment Assembly" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA4Wj4LxtbEJHBoTfE7adNwNcGr_-ZDHvCPe8tScDgCTBqr8075jz0-Yw-UDufrNruVUS2b7XJhyphenhyphen-liwJgrvewSpTvW14AVNiBJeN48vi83ERqPgJf3KmaW9-08cMdXMqG8dSHG9ovbOQ/s1600/iReport5.6.0JDBCDeploymentAssemblyDatoJava.png">
</a>
<figcaption>
Deployment Assembly
</figcaption>
</figure>
</div>
Ya podemos implementar el método para ejecutar el reporte <i><b>.jasper</b></i> en el lado del <i>cliente</i> desde Primefaces, tengo que recordar que como el reporte que hicimos en el iReport hace una consulta a la base de datos, en este caso a una base de datos en Oracle PL/SQL, al hacer la llamada al <i><b>.jasper</b></i> debemos pasarle como parámetro la conexión a Oracle, en este <a href="http://datojava.blogspot.com/2014/06/jdbcJavaOracle.html" target="_blank">dato java</a> explico como hacer la conexión JDBC en Java.
<pre class="brush: java;">
public void ejecutarReportePDF() {
Connection con = null;
try {
// Llamamos al metodo para obtener la conexion
con = getConnection();
// Revisar si esta es la dirección donde esta tu reporte .jasper
File file = new File("C:\\DJReportes\\reporteAlumnosDatoJava.jasper");
JasperReport reporte = (JasperReport) JRLoader
.loadObjectFromFile(file.getPath());
JasperPrint jasperPrint = JasperFillManager.fillReport(reporte,
null, con);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Content-disposition",
"attachment; filename=reporteDatoJava.pdf");
ServletOutputStream servletStream = httpServletResponse
.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint,
servletStream);
FacesContext.getCurrentInstance().responseComplete();
} catch (Exception e) {
e.printStackTrace();
}
}</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjegXQUx8L_v0TZvWBm81LBiwcW3nKeIuTdpACTft7jSDAGC5C3R9o_HAxUtk0eiNZpzkl5GbAKfbeL4RG3d9npp7Ivo1WjD92qSztK0CrBORRZFwTn4fRgY1TSrOm4t5bijgqEvXmqgcI/s1600/iReport5.6.0JDBCDIreportJavaDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="iReport Desde Java" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjegXQUx8L_v0TZvWBm81LBiwcW3nKeIuTdpACTft7jSDAGC5C3R9o_HAxUtk0eiNZpzkl5GbAKfbeL4RG3d9npp7Ivo1WjD92qSztK0CrBORRZFwTn4fRgY1TSrOm4t5bijgqEvXmqgcI/s1600/iReport5.6.0JDBCDIreportJavaDatoJava.png">
</a>
<figcaption>
iReport Desde Java
</figcaption>
</figure>
</div>
Hay varias maneras de mostrar el reporte en el lado del <i>cliente</i>, al ejecutar ese método se le pregunta al usuario si quiere guardar o abrir el reporte. Podemos hacer lo mismo con la clase <b>JRExporter</b> de jasperreports de esta manera:
<pre class="brush: java;">
public void ejecutarReportePDF() {
Connection connection = null;
try {
// Llamamos al metodo para obtener la conexion
connection = getConnection();
// Revisar si esta es la dirección donde esta tu reporte .jasper
File file = new File(
"C:\\DJReportes\\reporteAlumnosDatoJava.jasper");
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.setHeader("Cache-Control", "no-cache");
httpServletResponse.setHeader("Content-disposition",
"attachment; filename=" + "reporteDatoJava" + ".pdf");
httpServletResponse.setContentType("application/x-download");
httpServletResponse.addHeader("Content-Type",
"application/x-download");
JasperReport jasperReport = (JasperReport) JRLoader
.loadObjectFromFile(file.getPath());
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
null, connection);
JRExporter jrExporter = null;
jrExporter = new JRPdfExporter();
jrExporter.setParameter(JRExporterParameter.JASPER_PRINT,
jasperPrint);
jrExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
httpServletResponse.getOutputStream());
if (jrExporter != null) {
try {
jrExporter.exportReport();
} catch (JRException e) {
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null)
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
</pre>
O podemos simplemente mostrarlo en el <i>cliente</i> sin preguntar ni nada y después el usuario decide que hacer.
<pre class="brush: java;">
public void ejecutarReportePDF() {
Connection connection = null;
try {
// Llamamos al metodo para obtener la conexion
connection = getConnection();
// Revisar si esta es la dirección donde esta tu reporte .jasper
File file = new File(
"C:\\DJReportes\\reporteAlumnosDatoJava.jasper");
byte[] documento = JasperRunManager.runReportToPdf(file.getPath(),
null, connection);
String fileType = "inline";
String reportSetting = fileType + "; filename=\""
+ "reporteDatoJava.pdf\"";
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.setContentType("application/pdf");
httpServletResponse.setHeader("Content-Disposition",
"inline; flename=\reporteDatoJava.pdf\"");
httpServletResponse.setHeader("Cache-Control", "private");
httpServletResponse.setContentLength(documento.length);
ServletOutputStream servletOutputStream = httpServletResponse
.getOutputStream();
servletOutputStream.write(documento, 0, documento.length);
servletOutputStream.flush();
servletOutputStream.close();
connection.close();
FacesContext.getCurrentInstance().responseComplete();
} catch (Exception e) {
e.printStackTrace();
}
}
</pre>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGZAfInKLhY47XCBYXOPhRMt-jhcm3cpO1t2-28UzRHdeKWJuRN8RHw4m93vr9NxbpeLl2-t9___C9dO3OJI4vBGOgoiMRiR3dKCgggWsF7vz4JoImlet10EzK9sbqNoGEQanrveeafrk/s1600/iReport5.6.0JDBCDIreportJava1DatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="iReport Desde Java." border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGZAfInKLhY47XCBYXOPhRMt-jhcm3cpO1t2-28UzRHdeKWJuRN8RHw4m93vr9NxbpeLl2-t9___C9dO3OJI4vBGOgoiMRiR3dKCgggWsF7vz4JoImlet10EzK9sbqNoGEQanrveeafrk/s1600/iReport5.6.0JDBCDIreportJava1DatoJava.png">
</a>
<figcaption>
iReport Desde Java.
</figcaption>
</figure>
</div>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<br/>
Esto es todo por ahora, si estas comenzando siempre vas a encontrar muchas excepciones con las librerías, como te dije antes, ahí tienes todas las librerías para que lleves a cabo este ejemplo sin ningún inconveniente. Cualquier duda no te olvides de comentar. Suerte.
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces1.html"><strong>Tutorial iReport con Oracle PL/SQL y Primefaces Parte 1.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/10/primeraAplicacionPrimefaces.html"><strong>Tutorial Primefaces con JSF. Primera aplicación.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/08/tutorialJavaJSFAdf.html"><strong>Tutorial Java JSF y ADF.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/11/queryDinamicoFiltrosPlsql.html"><strong>Query Dinamico en Oracle PL-SQL.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/08/itextPDFJavaEjemplo.html"><strong>Generar un reporte PDF con iText</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com3tag:blogger.com,1999:blog-9116102449526922332.post-46351495772523161872015-03-30T13:33:00.000-07:002016-06-06T15:09:50.902-07:00iReport con Oracle PL-SQL y Aplicación Java Web Primefaces. Parte 1.<html>
<head>
<title>
iReport con Oracle PL-SQL y Aplicación Web.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.nota{
font-size: 75%;
color:#0b5394;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Tutorial de Jaspersoft iReport 5.6.0 utilizando Oracle PL-SQL y ejecutando el Reporte desde aplicación Java web con Primefaces. Parte 1.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBHcP9FjtX6OpwlfcYw02vfctjDbqXvhx7kvu-Z2Nd1tG0EaSXq4zO0lSKO7T_aCIyYpVFQGIDUjV7e5E5OsjCKgCBr2eB57NNGWlpBx8Plbr4TyJblMK_er2c7Nu1zCTZpAxnGJN27DA/s1600/JaspersoftPrimefacesPlsqlLogo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 0.5em; margin-right: 0.5em;"><img alt="Jaspersoft iReport 5.6.0 utilizando Oracle PL-SQL y Java" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBHcP9FjtX6OpwlfcYw02vfctjDbqXvhx7kvu-Z2Nd1tG0EaSXq4zO0lSKO7T_aCIyYpVFQGIDUjV7e5E5OsjCKgCBr2eB57NNGWlpBx8Plbr4TyJblMK_er2c7Nu1zCTZpAxnGJN27DA/s1600/JaspersoftPrimefacesPlsqlLogo.png"></a>Para este Tutorial vamos a utilizar <strong>Jaspersoft iReport Designer v5.6.0</strong>, <strong>Oracle PL-SQL</strong> para la base de datos y obviamente <strong>Java</strong> para ejecutar nuestro reporte en formato <strong>PDF</strong>, dicho reporte lo vamos a ejecutar desde una aplicación web con <strong>Primefaces</strong>, vamos a explicar cómo funciona este asunto primero.<br/>
<strong>Jaspersoft iReport</strong> es un diseñador para JasperReports, como sabemos JasperReports es una librería escrita totalmente en Java con la cual podemos crear informes de diferentes tipos, puedes crear/construir un archivo y exportarlo, puedes exportar archivos en varios formatos como por ejemplo: excel, word, xml, pdf, etc. En este Tutorial nos vamos a centrar en la creación de un archivo en .pdf.<br/> Por que deberías usar Jaspersoft iReport?? Primero si eres un programador Java te comento que está hecho 100% en código Java, es de fácil manejo, no tienes que instalar nada, solo se descarga y comienzas a usarlo, aparte de eso es poderoso y fácil de usar, posee múltiples funciones para agregar cuadros de texto, párrafos, separadores, imágenes, sub-reportes, tablas, etc, todo lo que puedas imaginar que lleva un informe en PDF con iReport puedes hacerlo y aparte de eso puedes hacer tu conexión a la base de datos con <strong>JDBC</strong> y hacerle consultas a la misma ya sea con sql o llamando a un Stored Procedure y los registros que retorne puedes mostrarlos en el reporte, ya quedaron atrás esas librerías en las que uno redactaba todo el contenido del informe dentro del mismo código Java.<br/>
Imagina que haces un reporte con esa librería utilitaria en código Java y quieras cambiar una pequeña parte del informe después que el sistema ya paso a producción, bueno tampoco es que es muy difícil, buscar de nuevo dentro del código la parte que quieres editar, hacer el cambio, las pruebas y después coordinar otro pase a producción, un poco fastidioso no?? En fin con iReport solo buscas el archivo que exportaste y lo editas directamente ahí sin tener que tocar tu código Java lo que es una mejor practica de programación.</div><a name='more'></a>
<br/>
Ya que este Tutorial es un poco largo lo voy a dividir en 2 partes:<br/>
<ul>
<li>
<b>Parte 1:</b> Configuración y creación del reporte en Jaspersoft iReport y creación de la tabla y el Stored Procedure en Oracle PL-SQL.</li>
<li><b>Parte 2:</b> <a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces2.html" target="_blank"> Creación de la aplicación Java web con Primefaces para ejecutar el reporte</a>.</li>
</ul>
Creo que ya te di unas cuantas razones para que dejes esas viejas clases utilitarias y aprendas a usar Jaspersoft iReport, primero vamos a la página oficial de <a href="https://community.jaspersoft.com/project/ireport-designer/releases" target="_blank"><strong>Jaspersoft iReport.</strong></a> y descargamos la versión <strong>iReport Designer v5.6.0</strong> que es la ultima hasta este momento, depende de que sistema operativo estés utilizando, descargas el adecuado.
<br/>
Una vez que tienes la carpeta descomprimida navegas hasta el archivo <i>iReport.exe</i> que esta en este directorio: <i>iReport-5.6.0</i>><i>bin</i>><i>ireport.exe</i>.<br/>
Si quieres creas tu acceso directo apuntando al .exe o simplemente ejecutas desde ahí mismo el iReport.
<br/>
<br/>
Al momento de iniciar iReport esta es la pantalla de bienvenida:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP7HZIrIfmSsWPnA8qa_WBozWIALP7MXM7XdTZE0gcZ61P-Q9PHrw3Fmv9Ky8Svkw6df-8v4oXCmAuVKxN5hCSI1uveIoucdYJa5CbqlBNGU5En5N6WixnEia7Y8J6s_zTEINmjyCdrMU/s1600/iReport5.6.0DatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="iReport Inicio" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP7HZIrIfmSsWPnA8qa_WBozWIALP7MXM7XdTZE0gcZ61P-Q9PHrw3Fmv9Ky8Svkw6df-8v4oXCmAuVKxN5hCSI1uveIoucdYJa5CbqlBNGU5En5N6WixnEia7Y8J6s_zTEINmjyCdrMU/s1600/iReport5.6.0DatoJava.png">
</a>
<figcaption>
iReport Inicio
</figcaption>
</figure>
</div>
Si ya posees una versión anterior te recuerda que puedes importar la configuración del diseñador anterior. Lo que deberíamos hacer ahora es seguir los pasos, el primer paso habla de la conexión a la base de datos, como dije anteriormente vamos a utilizar una base de datos de Oracle PL-SQL, así que necesitamos hacer la conexión mediante JDBC, para eso nos descargamos el driver de PL-SQL de la página oficial de <a href="http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-10201-088211.html" target="_blank"><strong>Oracle</strong></a>, este es el .jar que tenemos que descargarnos:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTs0zGZjZWkz1lMzNMrY1yPF9May8fD1uoqFu2LddGbqSb0-fx-xKUXZWDs7X40B3yllaPloNaav_ruv8rHWxalR5oxUknQWLe-Sjhdd-jYvGdfYWLPYYbfmfSLRONim6FMFNrulXXIZQ/s1600/oracleDriver.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTs0zGZjZWkz1lMzNMrY1yPF9May8fD1uoqFu2LddGbqSb0-fx-xKUXZWDs7X40B3yllaPloNaav_ruv8rHWxalR5oxUknQWLe-Sjhdd-jYvGdfYWLPYYbfmfSLRONim6FMFNrulXXIZQ/s320/oracleDriver.png" alt="Driver Oracle">
</a>
<figcaption>
Driver Oracle
</figcaption>
</figure>
</div>
Una vez que ya descargamos el driver tenemos que importarlo en el iReport, para eso vamos a navegar hasta: <i>Herramientas</i>><i>Opciones</i>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSs4lIkLWoKf0B9H2TUNRIq2soY9szO46dJl7nt8udMiEq_lSKnxQJDnUhLY6jPM_BkdSb7I9gQscW6AXIH_90BQP5qFOnOBKRzFt2Fu9u2WeAebw0WQF77m4E83gANIjFR6njSzJttCc/s1600/iReport5.6.0AgregarDriverDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSs4lIkLWoKf0B9H2TUNRIq2soY9szO46dJl7nt8udMiEq_lSKnxQJDnUhLY6jPM_BkdSb7I9gQscW6AXIH_90BQP5qFOnOBKRzFt2Fu9u2WeAebw0WQF77m4E83gANIjFR6njSzJttCc/s1600/iReport5.6.0AgregarDriverDatoJava.png" alt="Agregar Driver Oracle">
</a>
<figcaption>
Agregar Driver Oracle
</figcaption>
</figure>
</div>
Se nos va a desplegar una pantalla así y vamos a seleccionar la pestaña <strong>Classpath</strong>:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYYxAG4v9SGqrIECVCHwlkYdEJyPK70BuQTUVXRRGenTGciZEXHfkiSgIrSFZEtGE8UjtdoUcSL6JgeyYSQGu292WNliBB_voj7lUH1g9TYHFOZqtsvrtL4nSIqw2m4G3iEyer4qgrUmI/s1600/iReport5.6.0AgregarDriver1DatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYYxAG4v9SGqrIECVCHwlkYdEJyPK70BuQTUVXRRGenTGciZEXHfkiSgIrSFZEtGE8UjtdoUcSL6JgeyYSQGu292WNliBB_voj7lUH1g9TYHFOZqtsvrtL4nSIqw2m4G3iEyer4qgrUmI/s1600/iReport5.6.0AgregarDriver1DatoJava.png" alt="Agregar Driver Oracle">
</a>
<figcaption>
Agregar Driver Oracle
</figcaption>
</figure>
</div>
Después vamos a presionar el botón <i><b>Add JAR</b></i> y vamos a buscar el driver que descargamos y lo agregamos y presionamos el botón <i><b>Aceptar</b></i>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH-B-9NQZQf7hMNDF0fFKKjrZwxM8aV3tAD3I17ir8zlMGq-snFlgxu5Q1Ej5MysnN_bzoNx6xwAxSZXrQRMyi_TI4W1udYjSjJrVwHHriXbMJcsV33QINUT6tpXseqWlm5FxjP9KmPFo/s1600/iReport5.6.0AgregarDriver2DatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Agregar Driver Oracle" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH-B-9NQZQf7hMNDF0fFKKjrZwxM8aV3tAD3I17ir8zlMGq-snFlgxu5Q1Ej5MysnN_bzoNx6xwAxSZXrQRMyi_TI4W1udYjSjJrVwHHriXbMJcsV33QINUT6tpXseqWlm5FxjP9KmPFo/s1600/iReport5.6.0AgregarDriver2DatoJava.png">
</a>
<figcaption>
Agregar Driver Oracle
</figcaption>
</figure>
</div>
Una vez hecho eso, vamos a configurar la conexión a la base de datos presionando sobre el icono en el paso numero 1.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtamSFyKeV3llQUv9chTFpA_Vj76Nrpukz2OsX4Qd1vLWEZvynPzc3kLXJkd7IVi75pAnSXO-RgFdsWfM_Cw2n6yNUIrWBOsWlawg9keNO-YbeRFEqolTPI-o1OCRG1hCnU4md4_HKPeA/s1600/iReport5.6.0JDBCConexionDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JDBC iReport" border="0" width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtamSFyKeV3llQUv9chTFpA_Vj76Nrpukz2OsX4Qd1vLWEZvynPzc3kLXJkd7IVi75pAnSXO-RgFdsWfM_Cw2n6yNUIrWBOsWlawg9keNO-YbeRFEqolTPI-o1OCRG1hCnU4md4_HKPeA/s1600/iReport5.6.0JDBCConexionDatoJava.png">
</a>
<figcaption>
JDBC iReport
</figcaption>
</figure>
</div>
Como vemos en la imagen hay varias opciones, nosotros vamos a escoger la opción resaltada que es mediante JDBC y presionamos el botón <i><b>Next</b></i>. Y en <i>JDBC Driver</i> vamos a elegir la opción de Oracle.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMN0YlEVJdub9VAqMdcSnp99-83dNBPm91MKeh_UT1scs-W2U_hGQ11l_vOgQVFj4T7yF6nTkmduqq_BrjVLFOdw4zLnQFeokGGGZ3Pan6VWgRnKeiaDCv_-G5w3W0V646Egy1MsdLv3g/s1600/iReport5.6.0JDBCConfiguracionDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Configuracion JDBC iReport" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMN0YlEVJdub9VAqMdcSnp99-83dNBPm91MKeh_UT1scs-W2U_hGQ11l_vOgQVFj4T7yF6nTkmduqq_BrjVLFOdw4zLnQFeokGGGZ3Pan6VWgRnKeiaDCv_-G5w3W0V646Egy1MsdLv3g/s1600/iReport5.6.0JDBCConfiguracionDatoJava.png">
</a>
<figcaption>
Configuración JDBC iReport
</figcaption>
</figure>
</div>
Para rellenar los datos que se nos piden vamos a ingresar los siguientes:
<ul>
<li><b>Name:</b> conexion-plsql.</li>
<li><b>JDBC URL:</b> aquí vamos a copiar nuestra cadena de conexión a Oracle.</li>
<li><b>Username:</b> el nombre de usuario para acceder a tu base de datos.</li>
<li><b>Password:</b> la clave para tu nombre de usuario.</li>
</ul>
<div class="nota"><b>Nota:</b> para saber cuál es tu cadena de conexión ingresa a tu <strong>PL-SQL Developer</strong> y navega hasta: <i>Help</i>><i>Support Info</i>><i>TNS names</i>, buscas el tuyo y anotas el alias o descriptor, host o ip y el puerto. Así se escribe la cadena de conexión: jdbc:oracle:thin:<i>host</i>:<i>puerto</i>:<i>alias</i>, si la base de datos esta en tu maquina local puedes poner: <i>@localhost</i>.</div><br/>
Algo así tiene que quedar:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSH8Koh6FdVeHojgykVx1KcYVrimNkIteWd4FzHMwhXgtBj_iDG1o78mbb5Xcvf78_dR5-uCV2BYahgnv2M7fLrLPHoNgRnJRs48-n2_jskuovAVso69HxNw8gXXUWNosZ81I4yjZR7TM/s1600/iReport5.6.0JDBCNameDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Nombre Conexión iReport" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSH8Koh6FdVeHojgykVx1KcYVrimNkIteWd4FzHMwhXgtBj_iDG1o78mbb5Xcvf78_dR5-uCV2BYahgnv2M7fLrLPHoNgRnJRs48-n2_jskuovAVso69HxNw8gXXUWNosZ81I4yjZR7TM/s1600/iReport5.6.0JDBCNameDatoJava.png">
</a>
<figcaption>
Nombre Conexión iReport
</figcaption>
</figure>
</div>
Después de eso presionamos el botón <i><b>Test</b></i> y si todo está bien nos saldrá un mensaje como este:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzy6CZWtxPIafQlv1GjSKfpej9OoIsNVPTeWbDvMnjLSxc3swL8u1-DTqZzSIdiswV5sl4qX9LkQpoZr6NjDfpG-aki2LXn4VXT6WQwNCbRsIY9eKE1ev5uu6qxrkJiL5Z6DZHTC0kIzs/s320/iReport5.6.0JDBCTestDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Test Connection iReport" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzy6CZWtxPIafQlv1GjSKfpej9OoIsNVPTeWbDvMnjLSxc3swL8u1-DTqZzSIdiswV5sl4qX9LkQpoZr6NjDfpG-aki2LXn4VXT6WQwNCbRsIY9eKE1ev5uu6qxrkJiL5Z6DZHTC0kIzs/s320/iReport5.6.0JDBCTestDatoJava.png">
</a>
<figcaption>
Test Connection iReport
</figcaption>
</figure>
</div>
Ya tenemos la conexión a la base de datos, ahora podemos pasar el paso número 2, en el cual vamos a crear nuestro primer reporte, vamos a crear algo sencillo para comenzar, un reporte con un Titulo y la información de una tabla que obtendremos desde un Stored Procedure de PL-SQL. Así que antes vamos a crear un Stored Procedure en PL-SQL el cual nos retornara los datos que vamos a insertar en el reporte. <br/>
Para este Tutorial vamos a crear una tabla de alumnos que vamos a llamar <code class="codigo"><b>DATO_JAVA_ALUMNOS</b></code> con estos registros: id_alumno, dni y nombre. Asi creamos la tabla en PL-SQL:
<pre class="brush: sql;">
create table DATO_JAVA_ALUMNOS
(
id_alumno NUMBER,
dni INTEGER not null,
nombre VARCHAR2(20)
)
</pre>
Ahora vamos a insertar unos cuantos alumnos en esa tabla, 3 registros:
<pre class="brush: sql;">
insert into DATO_JAVA_ALUMNOS DJA
(DJA.ID_ALUMNO, DJA.DNI, DJA.NOMBRE)
values
(1, 12345678, 'JOSE');
insert into DATO_JAVA_ALUMNOS DJA
(DJA.ID_ALUMNO, DJA.DNI, DJA.NOMBRE)
values
(2, 21158225, 'JULIANA');
insert into DATO_JAVA_ALUMNOS DJA
(DJA.ID_ALUMNO, DJA.DNI, DJA.NOMBRE)
values
(3, 85285269, 'MANUEL');
</pre>
Una vez que tenemos 3 alumnos en la base de datos podemos hacer un Stored Procedure básico para traernos a todos los alumnos y así poder ejecutar el mismo desde iReport. Recuerda que una buena práctica de programación es crear el Stored Procedure dentro de un package y su especificación. El package lo vamos a llamar <code class="codigo">PKG_DJ_ALUMNOS</code>. Así creamos el package body, su especificación y el Stored Procedure:
<pre class="brush: sql;">
/*Creamos la especificacion*/
CREATE OR REPLACE PACKAGE PKG_DJ_ALUMNOS AS
/*Declaramos un cursor para devolver los datos*/
TYPE RESULT_SET IS REF CURSOR;
PROCEDURE BUSCAR_TODOS_ALUMNOS(o_result_set OUT RESULT_SET);
END PKG_DJ_ALUMNOS;
/*-----------------------------------------------*/
/*Creamos el body*/
CREATE OR REPLACE PACKAGE BODY PKG_DJ_ALUMNOS IS
PROCEDURE BUSCAR_TODOS_ALUMNOS(
o_result_set OUT RESULT_SET
)
AS
BEGIN
OPEN o_result_set FOR SELECT * FROM
DATO_JAVA_ALUMNOS ORDER BY NOMBRE;
END BUSCAR_TODOS_ALUMNOS;
END PKG_DJ_ALUMNOS; </pre>
Una vez que tenemos hecho todo esto en PL-SQL vamos crear el reporte, como dije anteriormente vamos hacer algo básico, un titulo y los datos de los alumnos que tenemos en la base de datos que acabamos de crear. Al momento de presionar el icono en el paso 2 nos aparece esta pantalla:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpxxVjFy-OZj-hhUYsPttehuydKshF2C8-7FQTSwapfucUsOgXW6fqYjF4gpT9Genu1s4rOr-avAPzKR2Q0btrnFuoE8LKwi8LgaOOIDXYjIRmzORoCu3XAhsFVJWgVQ-0XoPDvYI5XpA/s1600/iReport5.6.0JDBCReporteDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Reporte A4 iReport" width="400" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpxxVjFy-OZj-hhUYsPttehuydKshF2C8-7FQTSwapfucUsOgXW6fqYjF4gpT9Genu1s4rOr-avAPzKR2Q0btrnFuoE8LKwi8LgaOOIDXYjIRmzORoCu3XAhsFVJWgVQ-0XoPDvYI5XpA/s1600/iReport5.6.0JDBCReporteDatoJava.png">
</a>
<figcaption>
Reporte A4 iReport
</figcaption>
</figure>
</div>
Elegimos el reporte <i>A4</i> y presionamos el botón <i><b>Open this Template</b></i> y le vamos a poner de nombre al reporte <b>reporteAlumnosDatoJava</b> y vamos a elegir la ubicación del mismo, siempre es bueno crear una carpeta en donde tengamos nuestros reportes de iReport. Después de eso presionamos el botón <i><b>Siguiente</b></i> y luego el botón <i><b>Terminar</b></i>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4MY1alh55Z19dBZ8VOEcpgP4mSSt-aBXtisn0Js8-BSi566YKILAeIXftyUE6ES_NBmomjoKHj6RI_YV3CD-RHnYGIrKNOHgPyzuiNM8pQmeBj3U3Rj6-dXG3lSSf2f1PUQ85laqy3-A/s1600/iReport5.6.0JDBCNombreReporteDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Nombre Reporte" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4MY1alh55Z19dBZ8VOEcpgP4mSSt-aBXtisn0Js8-BSi566YKILAeIXftyUE6ES_NBmomjoKHj6RI_YV3CD-RHnYGIrKNOHgPyzuiNM8pQmeBj3U3Rj6-dXG3lSSf2f1PUQ85laqy3-A/s1600/iReport5.6.0JDBCNombreReporteDatoJava.png">
</a>
<figcaption>
Nombre Reporte
</figcaption>
</figure>
</div>
Ya tienes el reporte creado, ahora necesitamos cambiar el lenguaje del reporte a <strong>Java</strong> para evitar errores al ejecutarlo desde la aplicación, para cambiar el lenguaje desplegamos la ventana que está del lado superior izquierdo que tiene por nombre <b>Report Inspector</b>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_H3fD2g89ZaYWXvaRCFKvlqytdOFshQD-XBDIPhbZ_40qpjL3cBzlBntf0zntJlsHowrLHFHyzawdopSC8A4C3dKI4kMXRy1cevYZMsca5AY_Iz7zwNiSQKtW-a_NKO8G1slLxHH0D0k/s1600/iReport5.6.0JDBCReportInspectorDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Report Inspector" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_H3fD2g89ZaYWXvaRCFKvlqytdOFshQD-XBDIPhbZ_40qpjL3cBzlBntf0zntJlsHowrLHFHyzawdopSC8A4C3dKI4kMXRy1cevYZMsca5AY_Iz7zwNiSQKtW-a_NKO8G1slLxHH0D0k/s1600/iReport5.6.0JDBCReportInspectorDatoJava.png">
</a>
<figcaption>
Report Inspector
</figcaption>
</figure>
</div>
Seleccionamos el reporte "<b>reporteAlumnosDatoJava</b>" presionamos clic derecho y vamos a las propiedades, cambiamos el lenguaje actual <i>Groovy</i> por <i>Java</i>.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9qS_jAciEtpyufPfsLUNDxV9iaOIMf1vVDu6AV3rUFqqXHl7-CDTYRc7AJcxcV4WUc3q4oP1H_Fp5gQCueSfQhKvqSWUXfQLuc0aguFUl4Ym7hYpozReFOOBe6tqKhA8rTNf08fApPrA/s1600/iReport5.6.0JDBCLenguajeJavaDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Lenguaje Java" border="0" width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9qS_jAciEtpyufPfsLUNDxV9iaOIMf1vVDu6AV3rUFqqXHl7-CDTYRc7AJcxcV4WUc3q4oP1H_Fp5gQCueSfQhKvqSWUXfQLuc0aguFUl4Ym7hYpozReFOOBe6tqKhA8rTNf08fApPrA/s1600/iReport5.6.0JDBCLenguajeJavaDatoJava.png">
</a>
<figcaption>
Lenguaje Java
</figcaption>
</figure>
</div>
Ahora vamos a comenzar a crear la estructura del mismo, hay una paleta del lado superior derecho en la cual podemos elegir varios componentes que con solo arrastrarlos al reporte ya se agregan. La pantalla que debería aparecerte es esta:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5xz3K6IqPInM4WwZIpRAEQQKmETHpEcOWgnWXXZxOWh6K0C3yEDOJEc7I-1Rg4CVtgq6NT96YdZvS7sKIthFMTItrgcoy1szqlFTJJIRH_yfq5Sa_KkVA6b4nB3vwSKxPu67cZgpokgc/s1600/iReport5.6.0JDBCEstructuraDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Inicio Reporte" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5xz3K6IqPInM4WwZIpRAEQQKmETHpEcOWgnWXXZxOWh6K0C3yEDOJEc7I-1Rg4CVtgq6NT96YdZvS7sKIthFMTItrgcoy1szqlFTJJIRH_yfq5Sa_KkVA6b4nB3vwSKxPu67cZgpokgc/s1600/iReport5.6.0JDBCEstructuraDatoJava.png">
</a>
<figcaption>
Inicio Reporte
</figcaption>
</figure>
</div>
Ahora explicare un poco mas como funciona este diseñador, vamos a mostrar los registros del Stored Procedure en PL-SQL que devuelve un cursor con los datos de los 3 alumnos, tenemos que crear un parámetro en el iReport que sea del tipo <code class="codigo">ResultSet</code> y así cuando hagamos la llamada al Stored Procedure podamos pasar este parámetro creado del mismo tipo. Para crear el parámetro en iReport vamos a la ventana <b>Report Inspector</b>
en la opción de <i><b>Parameters</b></i> presionamos clic derecho y elegimos la opción <i><b>Agregar Parameter</b></i>, seleccionamos el parámetro creado y presionamos la opción <i><b>Propiedades</b></i> ubicada en el lado superior derecho, o desde el menú <i><b>Ventana</b></i>, ahí vamos a cambiar las propiedades del mismo por:
<ul>
<li><b>Name:</b> P_CURSOR.</li>
<li><b>Parameter Class:</b> java.sql.ResultSet.</li>
<li><b>Use as a prompt:</b> desactivado.</li>
</ul>
Lo demás se deja por defecto.
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFLOqQjPPBsg9lUQuS6FZCdpVfwbdCiccnG2GpqFCAAQcwfPPlfqc9CGRqC5FqiPftb7UtbpnqXiedP9aF0bu-ZwLIeJxtvy5x2YFeZENYiWaFdX40P5oILG7XTYL7ZRLsvOukT4a688s/s1600/iReport5.6.0JDBCPropiedadesrDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Parameters Propiedades" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFLOqQjPPBsg9lUQuS6FZCdpVfwbdCiccnG2GpqFCAAQcwfPPlfqc9CGRqC5FqiPftb7UtbpnqXiedP9aF0bu-ZwLIeJxtvy5x2YFeZENYiWaFdX40P5oILG7XTYL7ZRLsvOukT4a688s/s1600/iReport5.6.0JDBCPropiedadesrDatoJava.png">
</a>
<figcaption>
Parameters Propiedades
</figcaption>
</figure>
</div>
<div class="nota"><b>Nota:</b> por cada parámetro que reciba un Stored Procedure o un query normal tienes que crear un parámetro en el iReport del mismo tipo.</div>
<br/>
Ahora hay que crear los campos que están en el cursor, el cursor devuelve los campos ID_ALUMNO, DNI y NOMBRE, vamos a crear los campos en el iReport con el mismo nombre para poder mostrarlo en el reporte. Para agregar un campo vamos a la ventana <b>Report Inspector</b>, en la opción <i><b>Fields</b></i> presionamos el clic derecho y elegimos la opción <i><b>Agregar Field</b></i>, seleccionamos el campo creado y vamos a sus propiedades y le cambiamos el nombre, la clase no hace falta cambiarla en esta ocasión, tienes que crear 3 campos que se llamen igual que los campos que están en el cursor:
<ul>
<li><b>ID_ALUMNO.</b></li>
<li><b>DNI.</b></li>
<li><b>NOMBRE.</b></li>
</ul>
Una vez creado los campos vamos hacer la llamada al Stored Procedure desde el iReport y vamos a probar si devuelve los datos esperados.
<br/>
Ahora en la misma ventana <b>Report Inspector</b> seleccionamos el reporte <b>reporteAlumnosdatoJava</b> y presionamos el clic derecho y seleccionamos la opción <i><b>Edit Query</b></i>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNE__b1XDxn2HgH1km5ZJ6IYOlLvnszPmA5x91RrVqCS6DsQ4BM4CQLDv2LIiVGiYbpTtVU9sLMTR9q9WZWNuXR_0Z8vI2sF9T5Ok94YzwYkzQTwEqI8B1UCupPr0M0loknFidu7U6sYI/s1600/iReport5.6.0JDBCEditQueryODatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Edit Query Option" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNE__b1XDxn2HgH1km5ZJ6IYOlLvnszPmA5x91RrVqCS6DsQ4BM4CQLDv2LIiVGiYbpTtVU9sLMTR9q9WZWNuXR_0Z8vI2sF9T5Ok94YzwYkzQTwEqI8B1UCupPr0M0loknFidu7U6sYI/s1600/iReport5.6.0JDBCEditQueryODatoJava.png">
</a>
<figcaption>
Edit Query Option
</figcaption>
</figure>
</div>
Aquí hay que agregar la llamada al Stored Procedure, elegir el lenguaje y ver los resultados esperados:
<ul>
<li><b>Query language:</b> aquí vamos a elegir la opción plsql ya que es el lenguaje que estamos utilizando.</li>
<li><b>Llamada al SP:</b> "{call usuario.pkg_dj_alumnos.buscar_todos_alumnos($P{P_CURSOR})}", <b>usuario</b> es tu nombre de usuario en Oracle PL-SQL, hacemos la llamada pasando el parámetro que creamos antes <b>P_CURSOR</b>.</li>
<li><b>Resultados Esperados:</b> presionamos el botón <b>Preview Data</b>.</li>
</ul>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_2DF0synON1g0bHY6nI1gFOtbB86p7kiY0pBDM5iQS-gvswbeQyXxXbTleIlpxWFf1e3UXtciM2pM11FfAcNxXPewEN4EKjXmxh2lyb6RE577xxeLD6_IZrIdrmzZf9WAmZiDXvH9uhA/s1600/iReport5.6.0JDBCEditQueryDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Edit Query iReport" width="400" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_2DF0synON1g0bHY6nI1gFOtbB86p7kiY0pBDM5iQS-gvswbeQyXxXbTleIlpxWFf1e3UXtciM2pM11FfAcNxXPewEN4EKjXmxh2lyb6RE577xxeLD6_IZrIdrmzZf9WAmZiDXvH9uhA/s1600/iReport5.6.0JDBCEditQueryDatoJava.png">
</a>
<figcaption>
Edit Query
</figcaption>
</figure>
</div>
Ahora vamos a poner el Titulo del reporte y los datos que vienen de la base de datos. Arrastramos un <i>label</i> de la paleta al reporte y lo situamos en el espacio que dice <b>Title</b>. Le ponemos este nombre <strong>Primer Reporte con iReport</strong>, ahora vamos arrastrar los campos que creamos al reporte para mostrar la información que devuelve el cursor, estos los vamos a situar en el espacio del reporte que se llama <b>Detail 1</b>. Así debería verse:<br/><br/>
<div class="nota"><b>Nota:</b> cuando agregamos los campos que devuelve el cursos automáticamente se agrega un label con el nombre del campo, ese label lo situamos en el espacio que dice <b>Column Header</b>, tenemos que acomodar el reporte para que queden bien situados los campos, al título le cambie el tamaño de la letra. El espacio <b>Detail 1</b> lo puse más pequeño para que a la hora de imprimir el reporte se vea mejor.</div>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix6-U_umcqAnuM48Uj3sE7gGkV-P_RH5AG3l_zigBlQGom5VbtEAQ7Yhcflqnkb6UIYxglh5J_N-r8ogpsmwXH2cPCwEIGnT349veDg6Ij-9ry0av7idP5JZu4YfXPVIGJ3lD_TIcEdJs/s1600/iReport5.6.0JDBCReporteArmadoDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Reporte Final" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix6-U_umcqAnuM48Uj3sE7gGkV-P_RH5AG3l_zigBlQGom5VbtEAQ7Yhcflqnkb6UIYxglh5J_N-r8ogpsmwXH2cPCwEIGnT349veDg6Ij-9ry0av7idP5JZu4YfXPVIGJ3lD_TIcEdJs/s1600/iReport5.6.0JDBCReporteArmadoDatoJava.png">
</a>
<figcaption>
Reporte Final
</figcaption>
</figure>
</div>
Para ver un preview del reporte tienes que compilar el mismo y después presionar en <b>Preview</b>:
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9dTYqHhl3WwDlrpIpTYYdcIM5iv3UDiqRg0fblQjuhtB7N0hsoPFU4BTMkf8EMEhmEz5MYmvnd4a9oAw3swyerRxWdC6mxKZkKWb_xYE4Xn0Sh7BCQpwrZavdpNjR8ojHXgmytFvpl3w/s1600/iReport5.6.0JDBCCompilarDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Compilar Reporte" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9dTYqHhl3WwDlrpIpTYYdcIM5iv3UDiqRg0fblQjuhtB7N0hsoPFU4BTMkf8EMEhmEz5MYmvnd4a9oAw3swyerRxWdC6mxKZkKWb_xYE4Xn0Sh7BCQpwrZavdpNjR8ojHXgmytFvpl3w/s1600/iReport5.6.0JDBCCompilarDatoJava.png">
</a>
<figcaption>
Compilar Reporte
</figcaption>
</figure>
</div>
<div style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNcl7DRjqlKCQX90yTGgpxicMCuivPeoB1ZQyICnFrdIVdtezYbeiO9uqzsJrtZ80tvFkH1QJFB3FOMMQkCnUaFfNqA2XPTMguYj9645HXqTh7SW3I9FZXGmVFQE2Iv_qTaVxksXoixW0/s1600/iReport5.6.0JDBCPreviewPDFDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Preview Reporte" border="0" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNcl7DRjqlKCQX90yTGgpxicMCuivPeoB1ZQyICnFrdIVdtezYbeiO9uqzsJrtZ80tvFkH1QJFB3FOMMQkCnUaFfNqA2XPTMguYj9645HXqTh7SW3I9FZXGmVFQE2Iv_qTaVxksXoixW0/s1600/iReport5.6.0JDBCPreviewPDFDatoJava.png">
</a>
<figcaption>
Preview Reporte
</figcaption>
</figure>
</div>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<br/>
Cada vez que compilas el reporte de iReport se crean dos archivos, en el directorio que elegimos antes, si ya están creados se reemplazan. Con esto ya tenemos el reporte listo en iReport, ahora solo nos falta ejecutar dicho reporte desde Java que es lo que viene en la parte 2 de este Tutorial. <a href="http://datojava.blogspot.com/2015/03/TutorialiReportPLSQLJavaPrimefaces2.html" target="_blank">Seguir con el Tutorial</a><br/>
</article>
<br/>
<article>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2014/08/tutorialJavaJSFAdf.html"><strong>Tutorial JSF y ADF.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/10/primeraAplicacionPrimefaces.html"><strong>Tutorial Primefaces con JSF. Primera aplicación.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/02/junitMatchersHamcrestTutorial.html"><strong>Tutorial JUnit Matchers. Tutorial JUnit Hamcrest.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/09/reporte-excel-con-java.html"><strong>Ejecutar un reporte excel desde Java con POI.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/06/tutorialAplicacionJavaSwingEjemplo.html"><strong>Tutorial de Aplicación Java Swing, ejemplo simple y sencillo.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/08/itextPDFJavaEjemplo.html"><strong>Generar un reporte PDF con iText</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com6tag:blogger.com,1999:blog-9116102449526922332.post-26756872022796113812015-03-18T15:45:00.000-07:002016-06-06T15:16:32.032-07:00Estilo y color en celdas Excel desde Java<html>
<head>
<title>
Estilo y color en celdas Excel desde Java.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
.verde{
color:#078400;
}
.rojo{
color:#FF0000;
}
.amarillo{
color:#C4BA00;
}
</style>
</head>
<body>
<section>
<header>
<div align="center">
<h1>
Color en reporte Excel desde Java. Estilos en las celdas.
</h1>
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTHul9e7IA1X2PYM7nsn6l4Yg-70WZ1RrvfeTS24BjgF9kApW2LXBRtw8AjqHzjMy5ld7BSqdUiRwYs5rZvdYXnDRBsnICqopIDNQCDWFYH2LiH_-cUs5p54oZ8HWuFblT49f862l9spU/s1600/EstilosExcelDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="Estilos Excel Java" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTHul9e7IA1X2PYM7nsn6l4Yg-70WZ1RrvfeTS24BjgF9kApW2LXBRtw8AjqHzjMy5ld7BSqdUiRwYs5rZvdYXnDRBsnICqopIDNQCDWFYH2LiH_-cUs5p54oZ8HWuFblT49f862l9spU/s1600/EstilosExcelDatoJava.png">
</a>
</figure>
<hr />
<br />
</div>
</header>
<div align="justify">
<br />
<article>
Para ponerle color a las celdas en un <strong>Excel</strong> desde <strong>Java</strong> es fácil, en este ejemplo vamos a construir el Excel (Si no sabes cómo hacerlo puedes aprenderlo <a href="http://datojava.blogspot.com/2014/09/reporte-excel-con-java.html" target="_blank">aquí</a>), vamos a ponerle color a las celdas dependiendo de un dato que en el mismo Excel se encuentra. Por ejemplo nos dan un requerimiento para un reporte con estas columnas "ID, NOMBRE, INGRESO" y en el mismo se pide:
<ul>
<li type="circle">Si el ingreso de un cliente está entre (0 - 100) esta celda debe ser de color <strong class="rojo">ROJO</strong></li>
<li type="circle">Si el ingreso de un cliente está entre (100 - 600) esta celda debe ser de color <strong class="amarillo">AMARILLO</strong></li>
<li type="circle">Si el ingreso de un cliente es mayor a 600 esta celda debe ser de color <strong class="verde">VERDE</strong></li>
</ul>
Después que ya creamos todo el Excel vamos a recorrerlo de nuevo y le vamos a dar el estilo correspondiente dependiendo del ingreso del cliente. Este es el método para que lo hagas:<a name='more'></a>
<pre class="brush: java;">
/**
*
* @param hssfWorkbook = El excel completo
* @param numCelda = el numero de la celda que cambiara
*
* @author datojava.blogspot.com
*/
public void colorCeldas(HSSFWorkbook hssfWorkbook, int numCelda) {
HSSFSheet mySheet = hssfWorkbook.getSheetAt(0);
// Creamos el estilo de celda del color ROJO
HSSFCellStyle styleGroup3 = hssfWorkbook.createCellStyle();
styleGroup3.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
styleGroup3.setFillForegroundColor(HSSFColor.RED.index);
// Creamos el estilo de celda del color AMARILLO
HSSFCellStyle styleGroup2 = hssfWorkbook.createCellStyle();
styleGroup2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
styleGroup2.setFillForegroundColor(HSSFColor.YELLOW.index);
// Creamos el estilo de celda del color VERDE
HSSFCellStyle styleGroup1 = hssfWorkbook.createCellStyle();
styleGroup1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
styleGroup1.setFillForegroundColor(HSSFColor.GREEN.index);
// Recorrer cada columna del excel
// Comenzamos en 1 porque la 0 es el header del excel
for (int i = 1; i <= mySheet.getLastRowNum(); i++) {
HSSFRow myRow = mySheet.getRow(i);
// Recorremos sobre cada celda de la columna seleccionada
Iterator cellIter = myRow.cellIterator();
while (cellIter.hasNext()) {
HSSFCell myCell = (HSSFCell) cellIter.next();
// Cuando sea la celda correcta
if (myCell.getCellNum() == numCelda) {
// Hay que parsear el contenido de la celda de ser necesario,
// La mayoría de las veces insertamos datos como "String"
if (Integer.parseInt(myCell.toString()) >= 0
&& Integer.parseInt(myCell.toString()) <= 100) {
// Aplicamos el estilo correspondiente ROJO
myCell.setCellStyle(styleGroup3);
} else if (Integer.parseInt(myCell.toString()) > 100
&& Integer.parseInt(myCell.toString()) < 600) {
// Aplicamos el estilo correspondiente AMARILLO
myCell.setCellStyle(styleGroup2);
} else if (Integer.parseInt(myCell.toString()) > 600) {
// Aplicamos el estilo correspondiente VERDE
myCell.setCellStyle(styleGroup1);
}
}
}
}
}</pre>
Todo esta explicado en el mismo código, ojo este método es para darle estilo a las celdas una vez que el Excel ya está hecho, en el caso contrario puedes darle el estilo a la celda desde el principio. Si estas siguiendo el ejemplo <a href="http://datojava.blogspot.com/2014/09/reporte-excel-con-java.html" target="_blank">anterior</a> para crear las celdas con colores en el Excel deberías llamar este método justamente después de obtener el Excel completamente, para refrescar la memoria este es el método <code class="codigo">exportarExcel()</code> que ejecuta el Excel, justamente en la línea <b>12</b> hacemos el llamado para cambiar el color de la celda que queremos dependiendo de el dato que esta contenga:<br /><br />
<div align="left" style="color: #7eb4ff; font-size: 9.0pt;">
<strong>Método: exportarExcel</strong>
</div>
<pre class="brush: java; highlight: 12">
public void exportarExcel() {
// Llenar la cabecera y el contenido del excel
dataModelReporte();
// Hacer el excel con su cabecera y contenido
HSSFWorkbook hssfWorkbook = obtenerExcel(dataModelContenido,
dataModelCabecera, "datojava.blogspot.com");
//Pasamos el "2" suponiendo que esa sea la celda
//AQUI LA LLAMADA
colorCeldas(hssfWorkbook, 2);
try {
// Guardar el Archivo
FileOutputStream fileOutputStream = new FileOutputStream(
"datojava.xls");
hssfWorkbook.write(fileOutputStream);
fileOutputStream.close();
File file = new File("datojava.xls");
// Abrir el archivo
Desktop.getDesktop().open(file);
} catch (Exception e) {
e.printStackTrace();
}
}
</pre>
</article>
<br />
<article>
<center>
<script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle" data-ad-client="ca-pub-9352598088641935" data-ad-slot="6053448801" style="display: inline-block; height: 60px; width: 468px;"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
Un plus, si no sabes cómo hacer un autosize en las celdas del Excel desde Java para que aparezca todo el contenido de cada celda aprende aquí:
<pre class="brush: java;">
/**
* Primero obtenemos la primera hoja del excel, despues la primera
* columna que viene siendo la cabecera y despues la cantidad de celdas
* que tiene esa columna para darle autosize a cada celda en el for.
*/
for (int i = 0; i < hssfWorkbook.getSheetAt(0).getRow(0)
.getLastCellNum(); i++) {
hssfWorkbook.getSheetAt(0).autoSizeColumn((short) i);
}
</pre>
Ya con este <strong>dato java</strong> no solo puedes darle color a una celda, puedes hacer muchas cosas, por ejemplo, la letra, el tamaño, color de letra, tamaño de la celda, queda a tu imaginación. Suerte.
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2014/09/reporte-excel-con-java.html"><strong>Como hacer reporte Excel desde Java.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/10/excel-java-web.html"><strong>Como hacer el reporte en Excel desde Java y ejecutarlo desde App Web.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/07/depurarAplicacionJava.html"><strong>Como depurar aplicación web Java desde Eclipse/JBoss Developer Studio.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/junitEclipseJbossTutorial.html"><strong>Como utilizar JUnit en Eclipse/JBoss Developer Studio Tutorial.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com9tag:blogger.com,1999:blog-9116102449526922332.post-85889119046794118122015-03-11T09:57:00.000-07:002016-06-06T15:18:02.112-07:00Tabs/Pestañas en ADF<html>
<head>
<title>
Tabs/Pestañas en ADF.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Como hacer tabs/pestañas en ADF JSF.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br />
<article>
Cuando estamos en un proyecto a veces necesitamos hacer unas pestañas en el front-end, son prácticas y se hacen en una sola página. Para hacer pestañas en <strong>ADF</strong> es sencillo, aparte de crear las pestañas tenemos que crear su contenido y un backing bean que se encargara de hacer el renderer o mostrar el contenido de la pestaña seleccionada. <br/><br/>
Vamos a imaginar que queremos mostrar la información de una cámara en varias pestañas:
<ul>
<li>Vista General.</li>
<li>Características.</li>
<li>Especificaciones.</li>
</ul>
Las pestañas deberían mostrarse de esta manera:
<div class="separator" style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtT6arHboMCK1cTVy79TLP2_rLDgnhE-YGwW671dN8VvSHi0ATEKYEi84LLqhAjPJI4Ayf2yF4U_JO4un-2TNCw5vn3VHq3a0tZWAItrNy6zg5hpB8b668arVt9AXotCjH1B2LbKb_dew/s1600/ADFTabsDatoJava.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtT6arHboMCK1cTVy79TLP2_rLDgnhE-YGwW671dN8VvSHi0ATEKYEi84LLqhAjPJI4Ayf2yF4U_JO4un-2TNCw5vn3VHq3a0tZWAItrNy6zg5hpB8b668arVt9AXotCjH1B2LbKb_dew/s1600/ADFTabsDatoJava.gif">
</a>
<figcaption>
ADF tabs
</figcaption>
</figure>
</div>
<a name='more'></a>
En la imagen anterior vemos el resultado de las pestañas en ADF, ahora vamos al código para lograr eso.<br/>
Primero vamos hacer la parte del front-end:
<pre class="brush: xml;">
<!-- Pestañas -->
<af:panelHeader>
<af:menuTabs>
<af:commandMenuItem text="Vista General"
selected="#{datoJavaTabsBean.tabVistaGeneral}"
actionListener="#{datoJavaTabsBean.cambiarTabVistaGeneral}"
immediate="true" />
<af:commandMenuItem text="Características"
selected="#{datoJavaTabsBean.tabCaracterisitcas}"
actionListener="#{datoJavaTabsBean.cambiarTabCaracterisiticas}"
immediate="true" />
<af:commandMenuItem text="Especificaciones"
selected="#{datoJavaTabsBean.tabEspecificaciones}"
actionListener="#{datoJavaTabsBean.cambiarTabEspecificaciones}"
immediate="true" />
</af:menuTabs>
</af:panelHeader>
<!-- Contenido de la pestaña "Vista General" -->
<af:panelHeader text="VISTA GENERAL"
rendered="#{datoJavaTabsBean.tabVistaGeneral}">
<af:objectSpacer height="10" />
<af:panelBox>
<af:outputText>
Es una cámara muy buena para las personas que quieren iniciarse en la fotografía.
Es semi profesional y por la cantidad de dinero que cuesta es una buena oportunidad.
</af:outputText>
</af:panelBox>
</af:panelHeader>
<!-- Contenido de la pestaña "Características" -->
<af:panelHeader text="CARACTERÍSTICAS"
rendered="#{datoJavaTabsBean.tabCaracterisitcas}">
<af:objectSpacer height="10" />
<af:panelBox>
<af:panelList>
<af:outputText> Potente Zoom de 100x y calidad de imagen HD. </af:outputText>
<af:outputText> Reconocimiento de escena.</af:outputText>
<af:outputText> Multiples funciones de disparo.</af:outputText>
<af:outputText> Funciones decuerpo compacto.</af:outputText>
<af:outputText> Semi Reflex.</af:outputText>
</af:panelList>
</af:panelBox>
</af:panelHeader>
<!-- Contenido de la pestaña "Especificaciones" -->
<af:panelHeader text="ESPECIFICACIONES"
rendered="#{datoJavaTabsBean.tabEspecificaciones}">
<af:objectSpacer height="10" />
<af:panelBox>
<af:panelHeader text="Numero de Píxeles efectivos">
<af:outputText>14 millones de píxeles</af:outputText>
</af:panelHeader>
<af:panelHeader text="Formato De Archivos">
<af:outputText>Fotografía: JPEG (Exif Ver. 2.3*³) (Regla de diseño para
sistema de archivo de cámara / compatible con DPOF)
Vídeo: AVI (Motion JPEG)
Audio: formato WAVE, sonido monoaural</af:outputText>
</af:panelHeader>
</af:panelBox>
</af:panelHeader>
</pre>
En el código anterior podemos ver que estamos construyendo primero las pestañas dentro de un <code class="codigo"><af:panelHeader></code>, esto es un plus, no es una regla que se halla que seguir, en esta oportunidad lo use para que le diera un poco mas de estética a las pestañas, después de eso vemos que cada pestaña tiene 3 propiedades:
<ul>
<li><code class="codigo">selected</code>: esta propiedad está amarrada a una variable <code class="codigo">boolean</code> en el backing bean la cual indica si la pestaña tiene que estar seleccionada o no.</li>
<li><code class="codigo">actionListener</code>:Esta propiedad invoca un método en el backing bean que debe ser ejecutado cada vez que se presione la pestaña.</li>
<li><code class="codigo">immediate</code>: esta propiedad indica que se cambiará de pestaña así el ciclo de vida de JSF este en otra fase. Ahora con mis palabras, esto indica que si presionamos esta pestaña se cambiará a la misma así JSF este validando campos requeridos.</li>
</ul>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<br/>
Después creamos el contenido de cada pestaña dentro de un <code class="codigo"><af:panelHeader></code> el cual tiene la propiedad <code class="codigo">rendered</code> que sirve para mostrar/ocultar el mismo, este <code class="codigo">boolean</code> esta en el backing bean llamado <code class="codigo">datoJavaTabsBean</code>. Si no tienes idea de lo que hablo puedes ver este <a href="http://datojava.blogspot.com/2014/08/tutorialJavaJSFAdf.html" target="_blank"><strong>tutorial</strong></a> de ADF y JSF para que tengas una mejor idea.
<br/>
<br/>
Ahora vamos a ver el código del backing bean:
<pre class="brush: java;">
package bbeans;
import javax.faces.event.ActionEvent;
/**
* @author http://datojava.blogspot.com/
*/
public class DatoJavaTabsBean {
// Booleans que indican que pestaña estara seleccionada
boolean tabVistaGeneral = true;
boolean tabCaracterisitcas = false;
boolean tabEspecificaciones = false;
// Metodo para mostrar solo la pestaña "Vista General"
public void cambiarTabVistaGeneral(ActionEvent actionEvent) {
tabVistaGeneral = true;
tabCaracterisitcas = false;
tabEspecificaciones = false;
}
// Metodo para mostrar solo la pestaña "Caracteristicas"
public void cambiarTabCaracterisiticas(ActionEvent actionEvent) {
tabVistaGeneral = false;
tabCaracterisitcas = true;
tabEspecificaciones = false;
}
// Metodo para mostrar solo la pestaña "Especificaciones"
public void cambiarTabEspecificaciones(ActionEvent actionEvent) {
tabVistaGeneral = false;
tabCaracterisitcas = false;
tabEspecificaciones = true;
}
//Getter y Setters de las variables que JSF pueda acceder a ellos desde el front-end
public boolean isTabVistaGeneral() {
return tabVistaGeneral;
}
public void setTabVistaGeneral(boolean tabVistaGeneral) {
this.tabVistaGeneral = tabVistaGeneral;
}
public boolean isTabCaracterisitcas() {
return tabCaracterisitcas;
}
public void setTabCaracterisitcas(boolean tabCaracterisitcas) {
this.tabCaracterisitcas = tabCaracterisitcas;
}
public boolean isTabEspecificaciones() {
return tabEspecificaciones;
}
public void setTabEspecificaciones(boolean tabEspecificaciones) {
this.tabEspecificaciones = tabEspecificaciones;
}
}</pre>
El backing bean es sencillo, posee tres métodos que sirven para controlar el comportamiento de las pestañas y tres variables para mostrar/ocultar el contenido de las mismas dependiendo del caso. Si tienes una sugerencia o consulta no olvides comentar.
</article>
<br/>
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/columnasAnidadasAgrupadasADFTable.html"><strong>Columnas anidadas en ADF table.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/10/vaciarInputCambiarTabADF.html"><strong>Vaciar input en ADF al cambiar de pestaña.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/footerADFTableJava.html"><strong>Como hacer footer en ADF table.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-13700467565477653612015-03-09T14:16:00.000-07:002016-06-06T15:19:20.145-07:00Footer en ADF Table.<html>
<head>
<title>
Footer en ADF Table.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Footer en ADF Table, JSF y Java.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br/>
<article>
Es común que en los requerimientos de un proyecto en Java con el framework <strong>ADF</strong> utilicemos tablas para representar cierta información, a veces nos piden que en esa tabla se muestre una columna al final en donde de ser el caso totalice los datos mostrados de una columna, esto se llama <strong>footer</strong> y para agregarlo a una tabla en ADF tenemos que utilizar el tag <code class="codigo"><facet></code>, no solo se utiliza para hacer una totalización de los datos representados en una columna también sirve para mostrar una especie de leyenda, hay tablas que son tan grandes que los nombres de las columnas estan abreviados y en el footer podríamos poner su respectiva leyenda, una tabla en ADF con footer se veria de esta manera:
<div class="separator" style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXngZRTKWnjDWp3Peft4Kmzg_J9kRjJLrjX5If3ENM9SuZPcg-uKj4cRr2ONhLmwqX6Hi-g2oHYtRihOzhc4ApmMRlbwWirrxV5JZzAY5F3RJ85DvDUgoQ8pDEmUQQwR1SSMBUkNCN_nE/s1600/footerADFDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXngZRTKWnjDWp3Peft4Kmzg_J9kRjJLrjX5If3ENM9SuZPcg-uKj4cRr2ONhLmwqX6Hi-g2oHYtRihOzhc4ApmMRlbwWirrxV5JZzAY5F3RJ85DvDUgoQ8pDEmUQQwR1SSMBUkNCN_nE/s1600/footerADFDatoJava.png">
</a>
<figcaption>
footer ADF Table
</figcaption>
</figure>
</div>
</article>
<article>
Obviamente en la imagen anterior se llena la tabla con datos del backing bean, este es el codigo de este <strong>dato java</strong> para que puedas construir una tabla en ADF con footer:
<pre class="brush: xml;">
<af:table width="50%" banding="row" bandingInterval="1"
emptyText="">
<af:column headerText="ID">
<af:inputText readOnly="true" value="" />
</af:column>
<af:column headerText="INGRESO" formatType="number">
<af:inputText readOnly="true" value="" />
<f:facet name="footer">
<af:panelHorizontal halign="right">
<af:inputText value="" readOnly="true" />
</af:panelHorizontal>
</f:facet>
</af:column>
<af:column headerText="EGRESO" formatType="number">
<af:inputText readOnly="true" value="" />
<f:facet name="footer">
<af:panelHorizontal halign="right">
<af:inputText value="" readOnly="true" />
</af:panelHorizontal>
</f:facet>
</af:column>
<!--Con este facet dibujamos la columna adicional donde se muestra el footer -->
<f:facet name="footer">
<af:panelHorizontal halign="left">
<af:inputText value="TOTAL" readOnly="true" />
</af:panelHorizontal>
</f:facet>
</af:table> </pre>
Recuerda que tienes que poner un <code class="codigo"><facet></code> por cada columna en el caso de que quieras poner un footer en cada columna, de no ser así solo agregas un <code class="codigo"><facet></code> en las columnas que sea necesario.
</article>
<br/>
<article>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre pequeño -->
<ins class="adsbygoogle"
style="display:inline-block;width:468px;height:60px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="6053448801"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<h4>
<br/>
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2014/08/tutorialJavaJSFAdf.html"><strong>Tutorial JSF y ADF.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/03/columnasAnidadasAgrupadasADFTable.html"><strong>Columnas anidadas en ADF Table.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/10/vaciarInputCambiarTabADF.html"><strong>Vaciar input al cambiar de pestaña en ADF, JSF.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/junitEclipseJbossTutorial.html"><strong>JUnit en Eclipse/JBoss Developer Studio Tutorial.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-87124399204128449042015-03-02T15:04:00.000-08:002016-06-06T15:20:25.210-07:00Columnas Anidadas En ADF Table.<html>
<head>
<title>
Culumnas Anidadas/Agrupadas en ADF Table, JSF.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Culumnas Anidadas/Agrupadas en ADF Table, JSF.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br />
<article>
A veces es necesario en una tabla de <strong>ADF</strong> agrupar varias columnas en una sola, las columnas anidadas son necesarias cuando los datos que queremos representar estan relacionados entre si.<br/><br/>
Por ejemplo supongamos que queremos representar los datos de varios carros y motos en una tabla dependiendo de su marca, podríamos hacer columnas anidadas relacionadas a la marca del carro y de la moto:
<ul>
<li type="circle">Año</li>
<li type="circle">Precio</li>
<ul>
<li type="circle">USD</li>
<li type="circle">VEF</li>
<li type="circle">PEN</li>
</ul>
<li type="circle">Tipo</li>
<li type="circle">Color</li>
</ul>
Una representación como la lista anterior pero en una tabla con columnas agrupadas debería verse así:
<div class="separator" style="clear: both; text-align: center;">
<figure>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlNrQhhXRfvBPJPulLXnDtBdTQTxPLehIcIAybR2L_wHGBrLUALKZsR4cNX3yE2k2ZERQJkfucZZP3IIRAw7pzU2uqHQp3Ep2iy0Y4oHbDXTOt7PmNq9cy6R-NQ5utjO3bzrjmlzZTOSE/s1600/ColumnasAnidadasDatoJava.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;">
<img alt="JUnit Paremetros" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlNrQhhXRfvBPJPulLXnDtBdTQTxPLehIcIAybR2L_wHGBrLUALKZsR4cNX3yE2k2ZERQJkfucZZP3IIRAw7pzU2uqHQp3Ep2iy0Y4oHbDXTOt7PmNq9cy6R-NQ5utjO3bzrjmlzZTOSE/s1600/ColumnasAnidadasDatoJava.png">
</a>
</figure>
</div>
Aqui te dejo el codigo para que puedas hacer tablas en ADF core con columnas anidadas:
<pre class="brush: xml;">
<af:table inlineStyle="font-size:8pt;" rows="12" width="50%"
banding="row" bandingInterval="1" emptyText="">
<af:column headerText="CARROS">
<af:column headerText="">
<af:column headerText="AÑO">
</af:column>
<af:column headerText="PRECIO" formatType="number">
<af:column headerText="USD"></af:column>
<af:column headerText="VEF"></af:column>
<af:column headerText="PEN"></af:column>
</af:column>
<af:column headerText="TIPO">
</af:column>
<af:column headerText="COLOR">
</af:column>
</af:column>
</af:column>
<af:column headerText="MOTOS">
<af:column headerText="">
<af:column headerText="AÑO">
</af:column>
<af:column headerText="PRECIO" formatType="number">
<af:column headerText="USD"></af:column>
<af:column headerText="VEF"></af:column>
<af:column headerText="PEN"></af:column>
</af:column>
<af:column headerText="TIPO">
</af:column>
<af:column headerText="COLOR">
</af:column>
</af:column>
</af:column>
</af:table>
</pre>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre -->
<ins class="adsbygoogle"
style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="5934514400"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
<br/>
Recuerda como dije anteriormente en este <strong>dato java</strong> que siempre que creemos columnas anidadas es porque las mismas estan relacionadas entre si.
</article>
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2014/08/tutorialJavaJSFAdf.html"><strong>Tutorial de JSF y ADF. Primera Aplicación.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/10/vaciarInputCambiarTabADF.html"><strong>Vaciar input en ADF al cambiar de pestaña.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2014/12/cargarScrollSubmitRefresh.html"><strong>Como cargar scroll de la pagina al hacer submit().</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0tag:blogger.com,1999:blog-9116102449526922332.post-34847605837862419462015-02-26T14:20:00.000-08:002016-06-06T15:21:14.722-07:00JUnit Suite<html>
<head>
<title>
JUnit Suite.
</title>
<style>
h1 {
color:#0b5394;
}
h4{
color:#000000;
}
article {
color:#606060;
font-size:16px;
}
.codigo{
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.1);
border-radius: 3px;
}
TD{
background-color:#FFFFFF;
}
TH{
color:#0b5394;
background-color: rgba(0,0,0,0.1);
}
TABLE{
border-collapse: collapse;
}
.afirmaciones{
background-color:#0b5394;
}
.titulo{
color:#FFFFFF;
}
</style>
</head>
<body>
<section>
<header>
<div align="left">
<h1>
Pruebas unitarias con JUnit Suite.
</h1>
<hr/>
</div>
</header>
<br />
<div align="justify">
<br />
<article>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5wixRF_sqnbXE0LAU13SLNkUDUk_FyK0cgBaY0s90K5Ut11nyJaOcoMJ0KzXDYBMi_Z-7vunSCD2bUFZzLwSk5tOaQnwv7LBsGTvqP2sBGhoZmjAT-wQlprBzaNNCPYOxQivT5Z-sozk/s1600/DatoJavaJUnitSuite.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Pruebas parametrizadas en JUnit. JUnitParams." border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5wixRF_sqnbXE0LAU13SLNkUDUk_FyK0cgBaY0s90K5Ut11nyJaOcoMJ0KzXDYBMi_Z-7vunSCD2bUFZzLwSk5tOaQnwv7LBsGTvqP2sBGhoZmjAT-wQlprBzaNNCPYOxQivT5Z-sozk/s1600/DatoJavaJUnitSuite.png"></a>
Es muy común utilizar <strong>JUnit</strong> en proyectos grandes de Java ya que casi siempre trabajan varias personas en el mismo proyecto y es una buena práctica hacerle una prueba unitaria a los métodos que son un poco complejos para verificar que a medida que pasa el tiempo y los mismos son modificados en requerimientos futuros los métodos siguen estando completamente operativos. Lo que pasa es que las cosas se tienen que hacer entendibles y ordenadas, y para hacerlo de esa manera sería bueno hacer una clase de pruebas unitaria por cada clase que contenga métodos que queramos testear, si estas en un proyecto grande la cantidad de clases de pruebas unitarias sería muy grande. Para no correr una clase de prueba unitaria a la vez JUnit implemento una clase llamada <strong>JUnit Suite</strong> en la cual podemos correr todas las clases de pruebas unitarias de una sola vez y no una por una.<br/><br/>
Para implementar esta clase tenemos que utilizar la anotación del runner <code class="codigo">@RunWith(Suite.class)</code> y <code class="codigo">@SuiteClasses({ DatoJava1.class, DatoJava2.class, DatoJava3.class.... })</code> en donde declaramos las clases de pruebas unitarias que se van a ejecutar en este suite. Ubicamos esas anotaciones antes del nombre de la clase y con eso basta, no es necesario implementar algún método dentro de la clase o cualquier otra cosa. Un ejemplo de JUnit Suite sería así:<a name='more'></a>
</div>
<pre class="brush: java;">
package datojavaTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({ DatoJava1.class, DatoJava2.class, DatoJava1.class })
public class JUnitSuite {
}</pre>
<center>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Banner despues del pre -->
<ins class="adsbygoogle"
style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-9352598088641935"
data-ad-slot="5934514400"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</center>
Como dije anteriormente en este <strong>dato java</strong> acerca del orden que debería llevar un proyecto es muy importante para que sea entendible que las clases vinculadas entre sí estén en paquetes separados de los demás, por ejemplo las clases de JUnit deberían estar en un paquete distinto. Siempre pon en práctica el orden en tus proyectos, revisa los otros tutoriales de JUnit para que aprendas más...
</article>
<article>
<h4>
<br />
Temas Relacionados:
</h4>
<ul>
<li type="circle"><a href="http://datojava.blogspot.com/2015/01/junitAssertTutorial.html"><strong>JUnit Assert Tutorial.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/01/junitAssumeTutorial.html"><strong>JUnit Asssume Tutorial.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/02/junitMatchersHamcrestTutorial.html"><strong>Junit Matchers Tutorial. Hamcrest lib.</strong></a></li>
<li type="circle"><a href="http://datojava.blogspot.com/2015/02/junitPruebasTestConParametros.html"><strong>Pruebas unitarias parametrizadas en JUnit. Test con parámetros en JUnit. JUnitParams.</strong></a></li>
</ul>
</article>
</div>
</section>
</body>
</html>Anonymoushttp://www.blogger.com/profile/12012348740250015357noreply@blogger.com0