<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-399756579626982142</id><updated>2018-03-05T17:25:29.875-08:00</updated><category term="source code"/><category term="Gnu/linux"/><category term="java"/><category term="swing"/><category term="bash"/><category term="MDI"/><category term="eyecandy"/><category term="internet"/><category term="javascript"/><category term="jinternalframe"/><category term="xhtml"/><category term="Ajax"/><category term="CodeIgniter"/><category term="JQuery"/><category term="PHP"/><category term="debian"/><category term="jcombobox"/><category term="videos"/><category term="kde"/><category term="listeners"/><category term="temas"/><category term="xml"/><category term="CriteriaBuilder"/><category term="Jtree"/><category term="MySQL"/><category term="boot"/><category term="burg"/><category term="compiz"/><category term="css"/><category term="docky"/><category term="gnome"/><category term="jpa"/><category term="jtextfield"/><category term="laf"/><category term="nautilus-elementary"/><category term="popup"/><category term="predicates"/><category term="skins"/><category term="splashy"/><title type='text'>Gnu/Linux, Programacion y mas</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-8355556907349970378</id><published>2012-04-20T23:20:00.000-07:00</published><updated>2012-04-30T20:16:23.519-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="JQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="xhtml"/><title type='text'>Tutorial: Ajax pagination Codeigniter // Paginación con Ajax en CodeIgniter</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Hey Hola, como les va a todos, antes que nada vamos a ver el resultado final, o almenos lo que esperamos obtener al final de este articulo. &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://s674.photobucket.com/albums/vv109/McCubo/?action=view&amp;amp;current=twitter_pagination.gif&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Photobucket&quot; border=&quot;0&quot; src=&quot;http://i674.photobucket.com/albums/vv109/McCubo/twitter_pagination.gif&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como podemos apreciar, los nuevos resultados son anexados de forma&amp;nbsp;asíncrona&amp;nbsp;usando ajax. pretty cool x). Bueno a primera vista solo&amp;nbsp;podríamos&amp;nbsp;decir eso, pero si somos mas cuidadosos podemos ver una pequeña&amp;nbsp;animación&amp;nbsp;la cual nos indica que la consulta para los nuevos registros esta siendo procesada, ademas, el enlace de &lt;i&gt;More Results&lt;/i&gt;&amp;nbsp;es&amp;nbsp;des habilitado&amp;nbsp;para prevenir el caso que un usuario impaciente pueda realizar nuevamente click en el enlace si aun haberse completado totalmente la consulta anterior, nuevamente, pretty cool x). y por ultimo, cuando ya no quedan mas registros por ser retornados desde la base de datos, notificamos al usuario que no hay mas registros para mostrar.&lt;br /&gt;&lt;br /&gt;Para lograr lo anteriormente explicado vamos a utilizar: &lt;a href=&quot;http://jquery.com/&quot;&gt;Libreria Javascript JQuery&lt;/a&gt; para realizar las llamadas ajax a la base de datos. como gestor de base de datos... bueno eso es indiferente, pero como yo uso &lt;a href=&quot;http://www.apachefriends.org/es/xampp.html&quot;&gt;XAMPP &lt;/a&gt;vamos a trabajar con MySql y PhpMyAdmin. y para manejar las vistas y el acceso a la base de datos (osea el MVC) el &lt;a href=&quot;http://codeigniter.com/&quot;&gt;Framework Codeigniter&lt;/a&gt;. creo que no se me olvida nada... bueno, y un poco de CSS.&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bueno. que es lo primero que vamos a codificar. pues en si, la&amp;nbsp;lógica&amp;nbsp;de las consultas, y como estamos usando el Framework Codeigniter, nos referimos al Modelo. entonces, sin perder mas tiempo, procedamos a crear un nuevo archivo en la carpeta&amp;nbsp;application/models llamado (en mi caso) &lt;b&gt;UserModel.php&lt;/b&gt;&lt;br /&gt;El Modelo por el momento simplemente&amp;nbsp;contendrá un&amp;nbsp;método&amp;nbsp;el cual&amp;nbsp;recibirá&amp;nbsp;dos&amp;nbsp;parámetros, El máximo&amp;nbsp;numero de registros retornados($limit) y el $offset, que&amp;nbsp;vendría&amp;nbsp;a ser como el numero desde el cual la consulta retornara registros de la base de datos. bueno, ustedes&amp;nbsp;entenderán&amp;nbsp;a que me quiero referir, y si no es&amp;nbsp;así, cuando ejecutemos el&amp;nbsp;código&amp;nbsp;nos vamos a enterar :). so (8) dont worry, be happy.(8).&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt; // @author McCubo &amp;lt;-- ese soy yo xD&lt;br /&gt; // @copyright 2011&lt;br /&gt; // @license GPL V2.&lt;br /&gt;class UserModel extends CI_Model {&lt;br /&gt;&lt;br /&gt;    public function __construct() {&lt;br /&gt;        parent::__construct();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // @return $limit cantidad de registros a partir de $offset&lt;br /&gt;    public function getUserList($limit, $offset=0) {&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;select(&#39;id, first_name, last_name, nickname, registration_date&#39;);&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;order_by(&#39;first_name&#39;, &#39;asc&#39;);&lt;br /&gt;        return $this-&amp;gt;db-&amp;gt;get(&#39;user&#39;, $limit, $offset);&lt;br /&gt;    } // getUserList End&lt;br /&gt;&lt;br /&gt;    // @return integer del total de registros en la tabla&lt;br /&gt;    public function getTotalUserCount() {&lt;br /&gt;        $numRows = $this-&amp;gt;db-&amp;gt;count_all_results(&#39;user&#39;);&lt;br /&gt;        return $numRows;&lt;br /&gt;    }// getTotalUserCount End&lt;br /&gt;&lt;br /&gt;}//UserModel End&lt;br /&gt;&lt;br /&gt;?&amp;gt;//FILE END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Bastante sencillo no?. indicamos que campos necesitamos retornar con la consulta (ya que no quiero mostrar la password, tipo de privilegios, edad y otros campos que no son relevantes). los ordenamos por nombre ascendente y retornamos los valores encontrados por la consulta.&lt;br /&gt;&lt;br /&gt;Luego la otra función es aun mas sencilla, simplemente retornamos cuantos registros existen en la tabla (es importante conocer cuantos registros tiene la tabla a la hora de configurar la paginación)  Ahora, ya teniendo los métodos en el modelo, guardemos, y dejemos en segundo plano ese archivo para proceder con... no se, déjenme pensarlo, no se si el controlador o la vista. si, vamos a empezar con el controlador. Entonces procedemos a crear un nuevo archivo php llamado (en mi caso) &lt;b&gt;UserController.php &lt;/b&gt;en la carpeta application/controllers. justo ahora vamos a crear el&amp;nbsp;método&amp;nbsp;index:&lt;br /&gt;&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php&lt;br /&gt; // @author McCubo &amp;lt;-- otra vez yo...&lt;br /&gt; // @copyright 2011&lt;br /&gt; // @license GPL V2.&lt;br /&gt;class UserController extends CI_Controller {&lt;br /&gt;    private $limit = 1;&lt;br /&gt;&lt;br /&gt;    public function __construct() {&lt;br /&gt;        parent::__construct();&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;model(&#39;UserModel&#39;);&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;library(array(&#39;form_validation&#39;, &#39;table&#39;, &#39;session&#39;, &#39;encrypt&#39;));&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;helper(array(&#39;security&#39;, &#39;form&#39;));&lt;br /&gt;    } // End Construct&lt;br /&gt;&lt;br /&gt;    public function index() {&lt;br /&gt;        $data[&#39;userList&#39;] = $this-&amp;gt;UserModel-&amp;gt;getUserList($this-&amp;gt;limit);&lt;br /&gt;        $data[&#39;limit&#39;] = $this-&amp;gt;limit;&lt;br /&gt;        $data[&#39;totalCount&#39;] = $this-&amp;gt;UserModel-&amp;gt;getTotalUserCount();&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;view(&#39;user/userView&#39;, $data);&lt;br /&gt;    } // End Index&lt;br /&gt;&lt;br /&gt;    public function user_ajax_pag($offset) {&lt;br /&gt;       // Empty. not implemented yet&lt;br /&gt;    }&lt;br /&gt;}// End Controller&lt;br /&gt;?&amp;gt; // End File&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En el Constructor, lo normal, la llamada al constructor de la clase padre, cargamos el modelo, librerias y helpers que vamos a necesitar en todo el controlador.&lt;br /&gt;&lt;br /&gt;Mientras tanto en el index, llamamos al&amp;nbsp;método&amp;nbsp;que nos&amp;nbsp;devuelve&amp;nbsp;la lista de usuarios, si el $offset es enviado como&amp;nbsp;parámetro&amp;nbsp;a la&amp;nbsp;función, entonces este es 0 (Cero.) ya que necesitamos regresar desde el primer registro de la tabla, hasta un numero de $limit. Luego cargamos una nueva vista (que aun no hemos creado) y le pasamos un arreglo el cual contiene dos posiciones.&lt;br /&gt;&lt;br /&gt;Y Creamos una función &lt;i&gt;&lt;b&gt;user_ajax_pag&lt;/b&gt;&lt;/i&gt; (vacia por el momento), la cual es la que vamos a llamar desde la vista. dicha funcion nos retornara de forma asincrona los registros de las consultas.&lt;br /&gt;&lt;br /&gt;Bueno dejemos este otro archivo tambien en segundo plano para crear uno nuevo llamado &lt;b&gt;userView.php&lt;/b&gt; (en el directorio &lt;i&gt;application/views/user&lt;/i&gt;) en el cual vamos a desarrollar la vista, osea la paginación, como podemos ver en el gif de arriba, dicha tabla tiene dos imagenes (que suponen eliminar y editar). pues esas columnas por el momento las vamos a olvidar paracentrar nuestra atención en la cuestión de la paginación.&lt;br /&gt;La vista inicial:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-NGxDrV4cqmU/T5A6gqQVrMI/AAAAAAAAAUQ/t4zYMuiaAIE/s1600/userView_1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Codeigniter Ajax Pagination&quot; border=&quot;0&quot; height=&quot;216&quot; src=&quot;http://1.bp.blogspot.com/-NGxDrV4cqmU/T5A6gqQVrMI/AAAAAAAAAUQ/t4zYMuiaAIE/s640/userView_1.png&quot; title=&quot;Codeigniter Ajax Pagination&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Como podemos suponer, &lt;i&gt;userList&lt;/i&gt; será el div contenedor de la tabla. y la etiquita script que esta vacia, en ella se ejecutara la llamada al método que nos retornará los nuevos registros (que es el método vacio del controlador &lt;i&gt;&lt;b&gt;user_ajax_pag&lt;/b&gt;&lt;/i&gt;). Bueno antes que nada, vamos iniciar con una pequeña condicional, si no existen registros en la tabla, mostramos el mensaje correspondiente en lugar de la tabla:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php&quot;&gt;        &lt;br /&gt;  &amp;lt;div id=&quot;userList&quot;&amp;gt;&lt;br /&gt;      &amp;lt;?php if ($totalCount == 0) : ?&amp;gt;&lt;br /&gt;           &amp;lt;h3&amp;gt;No Records Found&amp;lt;/h3&amp;gt;&lt;br /&gt;      &amp;lt;?php else: ?&amp;gt;&lt;br /&gt;           // Generamos la tabla&lt;br /&gt;      &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Entonces, vamos a proceder a seguir editando la vista, en especifico a generar la tabla&lt;br /&gt;&lt;pre class=&quot;brush: php&quot;&gt;    &amp;lt;body&amp;gt;&lt;br /&gt;        &amp;lt;div id=&quot;userList&quot;&amp;gt;&lt;br /&gt;            &amp;lt;?php if ($totalCount == 0) : ?&amp;gt;&lt;br /&gt;                &amp;lt;h3&amp;gt;No user to display&amp;lt;/h3&amp;gt;&lt;br /&gt;            &amp;lt;?php else : ?&amp;gt;&lt;br /&gt;                // Generamos la tabla&lt;br /&gt;                &amp;lt;?php $this-&amp;gt;table-&amp;gt;set_heading(&#39;User Id&#39;, &#39;First Name&#39;, &#39;Last Name&#39;, &#39;NickName&#39;, &#39;Registration Date&#39;); ?&amp;gt;&lt;br /&gt;                &amp;lt;?php $template = array(&#39;table_open&#39; =&amp;gt; &#39;&amp;lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;0&quot; class=&quot;stripeTable&quot; style=&quot;width:500px;&quot;&#39;); ?&amp;gt;&lt;br /&gt;                &amp;lt;?php $this-&amp;gt;table-&amp;gt;set_template($template); ?&amp;gt;&lt;br /&gt;                &amp;lt;?php foreach ($userList-&amp;gt;result() as $user) : ?&amp;gt;&lt;br /&gt;                    &amp;lt;?php $this-&amp;gt;table-&amp;gt;add_row($user-&amp;gt;id, $user-&amp;gt;first_name, $user-&amp;gt;last_name, $user-&amp;gt;nickname, $user-&amp;gt;registration_date); ?&amp;gt;&lt;br /&gt;                &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;                &amp;lt;?php echo $this-&amp;gt;table-&amp;gt;generate(); ?&amp;gt;&lt;br /&gt;                &amp;lt;div id=&quot;div_more&quot; class=&quot;div_more_pag&quot;&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;More Results&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;                &lt;br /&gt;            &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Entonces si nos vamos a nuestro navegador y escribimos la url para nuestro controlador. si tenemos uno o mas registros en la tabla de la base de datos, entonces obtendremos algo como esto:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-xL3Y7KgYZnk/T5JGRCOKwbI/AAAAAAAAAUw/vzq9XMQSOr0/s1600/userView_table.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;82&quot; src=&quot;http://1.bp.blogspot.com/-xL3Y7KgYZnk/T5JGRCOKwbI/AAAAAAAAAUw/vzq9XMQSOr0/s400/userView_table.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;o si No tenemos registros:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-yHHzrJg16EE/T5JFd1DW00I/AAAAAAAAAUo/ggoeQwv0g0Q/s1600/userView_noRecords.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;118&quot; src=&quot;http://2.bp.blogspot.com/-yHHzrJg16EE/T5JFd1DW00I/AAAAAAAAAUo/ggoeQwv0g0Q/s400/userView_noRecords.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Bueno, Llegamos a este punto, guardamos todos los cambios en este archivo y nos regresamos al controlador, y vamos a implementar el método &lt;b&gt;user_ajax_pag&lt;/b&gt;.&lt;br /&gt;&lt;pre class=&quot;brush: php&quot;&gt;    public function user_ajax_pag($offset) {&lt;br /&gt;        // Lista con los Nuevos registros&lt;br /&gt;        $userList = $this-&amp;gt;UserModel-&amp;gt;getUserList($this-&amp;gt;limit, $offset);&lt;br /&gt;        $data[&#39;userList&#39;] = $userList;&lt;br /&gt;        // Vista que simplemente nos retorna una tabla en formato HTML con los nuevos registros de la consulta&lt;br /&gt;        $newTable = $this-&amp;gt;load-&amp;gt;view(&#39;user/ajax/userList_pagination&#39;, $data, true);&lt;br /&gt;        $returnedData = array(&#39;newtable&#39; =&amp;gt; $newTable);&lt;br /&gt;        // Codificamos a formato json (que es lo que vamos a esperar en la vista)&lt;br /&gt;        $json_encode = json_encode($returnedData);&lt;br /&gt;        // para que se note un poco mejor la animacion. deberia de ser removido una vez puesto en produccion&lt;br /&gt;        sleep(1);&lt;br /&gt;        echo $json_encode;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora vamos a ver la vista &lt;b&gt;userList_pagination.php&lt;/b&gt;, la cual se almacena en: &lt;i&gt;application/views/user/ajax&lt;/i&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php&lt;br /&gt;    foreach ($userList-&amp;gt;result() as $user) {&lt;br /&gt;        $this-&amp;gt;table-&amp;gt;add_row($user-&amp;gt;id, $user-&amp;gt;first_name, $user-&amp;gt;last_name, $user-&amp;gt;nickname, $user-&amp;gt;registration_date);&lt;br /&gt;    }&lt;br /&gt;    echo $this-&amp;gt;table-&amp;gt;generate();&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Eso seria todo por parte del Controlador, entonces guardamos y nos regresamos a la vista.&lt;br /&gt;Agregamos&amp;nbsp;código&amp;nbsp;entre las etiquetas de &amp;lt;script&amp;gt; que dejamos anteriormente sin implementar, y dicho&amp;nbsp;código&amp;nbsp;nos quedara parecido a lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: jscript&quot;&gt;           $(document).ready(function() {&lt;br /&gt;                // variable enviada desde el controlador&lt;br /&gt;                var totalCount = &quot;&amp;lt;?php echo $totalCount; ?&amp;gt;&quot;;&lt;br /&gt;                // variable enviada desde el controlador&lt;br /&gt;                var limit = &quot;&amp;lt;?php echo $limit; ?&amp;gt;&quot;;&lt;br /&gt;                var controller =  &quot;&amp;lt;?php echo site_url(&quot;userController/user_ajax_pag/&quot;); ?&amp;gt;&quot;;&lt;br /&gt;                limit = parseInt(limit);&lt;br /&gt;                var counter = limit;&lt;br /&gt;                $(&quot;#div_more a&quot;).click(function() {&lt;br /&gt;                    var methodUrl = controller+&quot;/&quot;+counter;                                        &lt;br /&gt;                    $.ajax({&lt;br /&gt;                        type: &quot;POST&quot;, // Indicamos que método se utilizará para la petición&lt;br /&gt;                        url: methodUrl, // Método a ejecutarse&lt;br /&gt;                        dataType: &quot;json&quot;, // Tipo de respuesta esperada&lt;br /&gt;                        beforeSend: function() {                            &lt;br /&gt;                            $(&quot;#div_more&quot;).toggleClass(&quot;div_more_pag loadingAjaxClass&quot;);&lt;br /&gt;                        },&lt;br /&gt;                        success: function(data) {&lt;br /&gt;                            // Si ningun error es arrojado obtenemos el HTML que contiene la nueva tabla, osea todos las etiquetas &amp;lt;tr&amp;gt;&lt;br /&gt;                            var newRecords = $(&quot;tbody&quot;, data.newtable).html();&lt;br /&gt;                            // Obtenemos la tabla y despues de la ultima fila agregamos N numero de filas devueltas por la consulta&lt;br /&gt;                            $(&quot;table tr:last&quot;).after(newRecords);&lt;br /&gt;                            // Creamos el estilo tipo Zebra para la tabla&lt;br /&gt;                            createTableStyle();&lt;br /&gt;                            // Aumentamos el counter, que lo podemos ver como el offset de la proxima consulta&lt;br /&gt;                            counter += limit;&lt;br /&gt;                        },&lt;br /&gt;                        complete: function() {&lt;br /&gt;                            $(&quot;#div_more&quot;).toggleClass(&quot;div_more_pag loadingAjaxClass&quot;);&lt;br /&gt;                            if (counter &amp;gt;= totalCount) {&lt;br /&gt;                                $(&quot;#div_more a&quot;)&lt;br /&gt;                                    .text(&quot;No More Results to show...&quot;) // Cambiamos el texto del enlace&lt;br /&gt;                                    .css(&quot;pointer-events&quot;, &quot;none&quot;) // deshabilitamos el enlace&lt;br /&gt;                                    .css(&quot;color&quot;, &quot;#CCC&quot;); // Cambiamos color del enlace&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    });&lt;br /&gt;                    return false;&lt;br /&gt;                });  // End link More Result Click event&lt;br /&gt;           }); // End Jquery document.ready&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Agregamos la referencia a la hoja de estilo en el header &lt;br /&gt;&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;&amp;lt;?php echo base_url(&quot;css/main.css&quot;); ?&amp;gt;&quot; &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y dicha Hoja de estilo es la siguiente: &lt;br /&gt;&lt;pre class=&quot;brush: css&quot;&gt;.div_more_pag, .loadingAjaxClass{&lt;br /&gt;    text-align: center;&lt;br /&gt;    margin-top: 10px;&lt;br /&gt;    padding-top: 7px;&lt;br /&gt;    height: 28px;&lt;br /&gt;    width: 500px;&lt;br /&gt;    background: #E0F2F7;&lt;br /&gt;    border: 1px solid #000;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.div_more_pag a, .loadingAjaxClass a {&lt;br /&gt;    text-decoration: none;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.div_more_pag a{&lt;br /&gt;    color: #000;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.loadingAjaxClass a {&lt;br /&gt;    color: #CCC;&lt;br /&gt;    pointer-events: none;&lt;br /&gt;    cursor: default;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.div_more_pag a:hover {&lt;br /&gt;    color: #610B0B;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.loadingAjaxClass {&lt;br /&gt;    background: #fff;&lt;br /&gt;    background-image: url(&quot;images/loading.gif&quot;);&lt;br /&gt;    background-repeat: no-repeat;&lt;br /&gt;    background-position: right;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Bueno, espero no se me olvide nada y si les gusta comenten, si no les gusta compartan x).&lt;br /&gt;Ojala les funcione, cualquier duda o comentario pueden hacerlo escribiendo en este post o a mi cuenta personal de google (gmail) y vamos a tratar de solucionar o aclarar cualquier&amp;nbsp;cuestión&amp;nbsp;del tema&lt;br /&gt;&lt;br /&gt;Suscribanse al blog o&amp;nbsp;háganse&amp;nbsp;seguidores demi cuenta de twitter para enterarse de los nuevos post que, ojala el tiempo y Dios lo permitan,&amp;nbsp;&amp;nbsp;estaré&amp;nbsp;publicando :D&lt;br /&gt;Saludos y&amp;nbsp;Cuídense.&amp;nbsp;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/8355556907349970378/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2012/04/tutorial-ajax-pagination-codeigniter.html#comment-form' title='14 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8355556907349970378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8355556907349970378'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2012/04/tutorial-ajax-pagination-codeigniter.html' title='Tutorial: Ajax pagination Codeigniter // Paginación con Ajax en CodeIgniter'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-NGxDrV4cqmU/T5A6gqQVrMI/AAAAAAAAAUQ/t4zYMuiaAIE/s72-c/userView_1.png" height="72" width="72"/><thr:total>14</thr:total><georss:featurename>Av Magesterial, San Salvador, El Salvador</georss:featurename><georss:point>13.730130307852061 -89.2005729675293</georss:point><georss:box>13.722417807852061 -89.2104434675293 13.737842807852061 -89.190702467529292</georss:box><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-8935821526673880105</id><published>2012-03-30T22:25:00.002-07:00</published><updated>2012-04-02T14:53:15.000-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CriteriaBuilder"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jpa"/><category scheme="http://www.blogger.com/atom/ns#" term="predicates"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><title type='text'>JPA CriteriaBuilder, Conjunction, Disjunction, in, like, between, greater Than, lower than</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Hola a todos. Después de mucho tiempo sin publicar nada por acá, me gustaría compartir lo que últimamente he aprendido con las lecturas que he realizado y aplicado con éxito en el trabajo. La cuestión en este tema será como crear consultas dinámicas usando el api de persistencia de Java (por sus siglas en inglés JPA).&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Para lograr dicho objetivo vamos a utilizar las clases EntityManager y CriteriaBuilder.&lt;/div&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt;Bueno iniciemos con un pequeño ejemplo de cómo sería un método el cual nos retorne todos los registros de la tabla.&lt;/span&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java&quot;&gt;public List&amp;lt;EntityClass&amp;gt; getAll() {&lt;br /&gt;     // Obtenemos una instancia de la clase, ya sea por medio de inversion de control o cualquier otro tipo de factoria&lt;br /&gt;     EntityManager entityManager = getEntityManager();&lt;br /&gt;     // Obtenemos el CriteriaBuilder&lt;br /&gt;     CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();&lt;br /&gt;     // Indicamos que tipo de objetos esperamos en nuestra consulta&lt;br /&gt;     CriteriaQuery&amp;lt;EntityClass&amp;gt; criteriaQuery = criteriaBuilder.createQuery(EntityClass.class);&lt;br /&gt;     // Indicamos la entidad sobre la cual necesitamos crear la consulta&lt;br /&gt;     Root&amp;lt;EntityClass&amp;gt; entityRoot = criteriaQuery.from(EntityClass.class);&lt;br /&gt;     // retornamos una lista de la entidad especificada&lt;br /&gt;     return entityManager.createQuery(criteriaQuery).getResultList();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Una consulta SQL equivalente sería un “SELECT entity FROM EntityClass AS entity”, y ese string pasarlo al entityManager y obtendríamos el mismo resultado.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt;En un caso como el anterior quizá uno llegue a plantearse la interrogante si es necesario usar el CriteriaBuilder para construir una consulta tan sencilla,….. Bueno a mi criterio si vale la pena. Ya que ese código es más fácil de mantener y en un futuro, mas fácil para escalar (Crear una clase abstracta la cual reciba como parámetro de clase el tipo de objeto el cual se va a manipular, no sé, algo así me puedo imaginar por el momento). Además usamos programación orientada a objetos lo cual es mejor que realizar una consulta tipo String.&lt;/span&gt; &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;La verdadera ventaja de usar CriteriaBuilder lo vamos a poder ver en casos en los cuales las consultas no son estáticas, óseas que dependiendo de algún tipo de parámetro enviado al método este agregara una restricción o añadirá una subquery a la búsqueda, entonces la consulta es creada en tiempo de ejecución, y es acá donde el uso de CriteriaBuilder nos facilita mucho el trabajo de construir nuestra consulta final.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Consideremos un ejemplo en el cual necesitamos que la consulta se cree en tiempo de ejecución; Tenemos una búsqueda de Usuarios (Entidad &lt;b&gt;&lt;i&gt;Usuario.class&lt;/i&gt;&lt;/b&gt;) en la cual le enviamos como parámetro la edad mínima y edad máxima que debe poseer un usuario para que sea tomado en cuenta en los criterios de la búsqueda, si la ambas edades no son proporcionadas, todos los usuarios de la base de datos serán retornados en el método, sin importar su edad. Tomando en cuenta que la entidad &lt;b&gt;&lt;i&gt;Usuario.class&lt;/i&gt;&lt;/b&gt;posee los métodos &lt;b&gt;getter y setter &lt;/b&gt;para una propiedad &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;edad &lt;/b&gt;tipo &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;Integer, &lt;/b&gt;procedamos a realizar el método de la búsqueda.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;    public List&amp;lt;Usuario&amp;gt; getAll(Integer edadMinima, Integer edadMaxima) {&lt;br /&gt;        EntityManager em = getEntityManager();&lt;br /&gt;        CriteriaBuilder cb = em.getCriteriaBuilder();&lt;br /&gt;        CriteriaQuery&amp;lt;Usuario&amp;gt; criteriaQuery = cb.createQuery(Usuario.class);&lt;br /&gt;        Root&amp;lt;Usuario&amp;gt; usuario = criteriaQuery.from(Usuario.class);&lt;br /&gt;        // Creamos un predicado conjunction, que vienen a ser un tipo de restriccion en el query&lt;br /&gt;        Predicate conjunction = cb.conjunction();&lt;br /&gt;        if (edadMinima != null) {&lt;br /&gt;            // agregamos una expresion al conjunction, greater than&lt;br /&gt;            conjunction.getExpressions().add(cb.gt(usuario.get(&quot;edad&quot;).as(Integer.class), edadMinima));&lt;br /&gt;        }&lt;br /&gt;        if (edadMaxima != null) {&lt;br /&gt;            // agregamos una expresion al conjunction, lower than&lt;br /&gt;            conjunction.getExpressions().add(cb.lt(usuario.get(&quot;edad&quot;).as(Integer.class), edadMaxima));&lt;br /&gt;        }&lt;br /&gt;        // O Podemos usar la restriccion Between, la cuestion es aprender a usar la gran amplia gama de restricciones&lt;br /&gt;        // que nos ofrece el CriteriaBuilder =D , ustedes eligen que restriccion se adecua a sus necesidades&lt;br /&gt;        // if you know what i mean x)&lt;br /&gt;        // Validamos que edad Minima y maxima != null&lt;br /&gt;        if (edadMaxima != null &amp;amp;&amp;amp; edadMinima != null) {&lt;br /&gt;             conjuntion.getExpressions().add(cb.between(usuario.get(&quot;edad&quot;).as(Integer.class), edadMinima, edadMaxima)));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // si el conjunction posee mas de cero expresiones, entonces las agregamos al query con el metodo where&lt;br /&gt;        if (conjunction.getExpressions().size() &amp;gt; 0) {&lt;br /&gt;            criteriaQuery.where(conjunction);&lt;br /&gt;        }&lt;br /&gt;        // retornamos la lista filtrada&lt;br /&gt;        return em.createQuery(criteriaQuery).getResultList();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bueno como dije anteriormente, el código es de fácil mantenimiento, lo que es igual a decir que es fácilmente entendimiento al lector, en este caso a un programador.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Lo primero, obtenemos una instancia de la clase EntityManager y con esta creamos un nuevo CriteriaBuilder, al CriteriaBuilder le indicamos que tipo de dato queremos que nos retorne la consulta, en este caso objeto Usuario (&lt;span style=&quot;font-size: 9pt; line-height: 115%;&quot;&gt;cb.createQuery(Usuario.class);&lt;/span&gt;). Luego al CriteriaQuery le indicamos &amp;nbsp;sobre qué entidad se efectuara la consulta (&lt;span style=&quot;font-size: 9pt; line-height: 115%;&quot;&gt;criteriaQuery.from(Usuario.class);&lt;/span&gt;) con esto tenemos una consulta la cual retorna todos los registros de la base de datos, pero ya que nuestra intención es filtrar mediante parámetros esa búsqueda creamos, a partir de la instancia del CriteriaBuilder, un Predicado (&lt;span style=&quot;font-size: 9pt; line-height: 115%;&quot;&gt;cb.conjunction();&lt;/span&gt;) este tipo de predicado (conjunction) lo podríamos ver como una compuerta lógica AND en el SQL estándar. Luego evaluamos si el parámetro es distinto a nulo entonces agregamos una expresión a la lista del conjunction, dicha expresión es el &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;G&lt;/b&gt;reater&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt; T&lt;/b&gt;han&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt; &lt;/b&gt;(&lt;span style=&quot;font-size: 9pt; line-height: 115%;&quot;&gt;cb.gt(“propiedad de la entidad a Evaluar”), valor&lt;/span&gt;) y &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;L&lt;/b&gt;ower&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt; T&lt;/b&gt;han respectivamente. Y por ultimo evaluamos si la lista del Predicado no esta vacía, de ser así, se lo agregamos al CriteriaQuery (&lt;span style=&quot;font-size: 9pt; line-height: 115%;&quot;&gt;criteriaQuery.where(conjunction);&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;El mismo método podría generar diversas consultas dependiendo de los parámetros, las posibilidades podrían ser :&lt;span style=&quot;font-size: 9pt; line-height: 115%;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;pre class=&quot;brush: sql&quot;&gt;-- (Ambos valores son diferente de nulo)&amp;nbsp;&lt;br /&gt;SELECT usu FROM Usuario AS usu WHERE usu.edad &amp;gt; ? AND usu.edad &amp;lt; ?&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;--  (Solamente edadMinima es diferente de nulo)&amp;nbsp; &lt;br /&gt;SELECT usu FROM Usuario AS usu WHERE usu.edad &amp;gt; ?&amp;nbsp;&lt;br /&gt;&lt;br /&gt;-- (Solamente edadMaxima es diferente de nulo)&lt;br /&gt;SELECT usu FROM Usuario AS usu WHERE usu.edad &amp;lt; ?&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-- (Ambos valores son nulos)&lt;br /&gt;SELECT usu FROM Usuario AS usu &lt;br /&gt;&lt;br /&gt;-- (Si usamos el Between)&lt;br /&gt;SELECT usu.nombre FROM usuario AS usu WHERE usu.edad BETWEEN ? AND ?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Como podemos observar, la consulta SQL se define en tiempo de ejecución dependiendo al número de parámetros o condiciones que se evalúen como verdaderas en los parámetros enviados al método. Obviamente no quiero dar a entender que este es el único método para realizar consultas dinámicas, claro que no, pero esta es la forma que a mi parecer es un poco mas auto explicativo  el código.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt;Eso nos regresa una lista de Usuario, pero ¿qué pasa si simplemente necesito conocer el nombre del usuario, y no todo el objeto en sí?&amp;nbsp; (una gran ayuda cuando estamos haciendo subconsultas &lt;b&gt;in&lt;/b&gt;).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt;Para dar respuesta al anterior párrafo, es muy sencillo, pues simplemente hacemos unos pequeños cambios al código. Obviamente el valor de retorno, del método, ahora será uno de Tipo &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 9pt; line-height: 115%;&quot;&gt;List&amp;lt;String&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt; &amp;nbsp;y al CriteriaBuilder le indicamos que tipo de clase esperamos como respuesta. Entonces cambiamos &lt;/span&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 9pt; line-height: 115%;&quot;&gt;cb.createQuery(Usuario.class);&lt;/span&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt; por algo como esto &lt;/span&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 9pt; line-height: 115%;&quot;&gt;cb.createQuery(String.class); (&lt;/span&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt;Porque ya no queremos todo el objeto, sino simplemente una propiedad tipo String de la entidad). Ahora el CriteriaBuilder ya sabe qué tipo de valor necesitamos que nos retorne, y ahora simplemente agregamos una línea debajo de &lt;/span&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 9pt; line-height: 115%;&quot;&gt;criteriaQuery.from(Usuario.class); &lt;/span&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt;&amp;nbsp;en la siguiente línea de código le indicamos que propiedad de la entidad necesitamos que nos retorne. Y nos quedaría algo así: &lt;/span&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java&quot;&gt;criteriaQuery.select(usuario.get(&quot;nombre&quot;).as(String.class));&lt;br /&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt;un equivalente (omitiendo las restricciones creadas por el predicado del conjunction) en SQL seria así :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: sql&quot;&gt;SELECT usu.nombre FROM Usuario AS usu&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Bueno, el uso del Disjunction es igual al del Conjunction, simplemente cambia la compuerta lógica empleada para ella, que en el caso del Disjunction es OR.&lt;br /&gt;A un conjunction se le puede agregar un disjunction de la siguiente manera, osea que tendríamos nuestro comparador OR dentro de un paréntesis en la consulta. para el siguiente ejemplo usaremos la tabla que se viene viendo en el post, usuario, cuya estrutura es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-F9A9XfUe12I/T3D1WaV1BOI/AAAAAAAAAT4/zfhTPd73vWA/s1600/tabla1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;165&quot; src=&quot;http://3.bp.blogspot.com/-F9A9XfUe12I/T3D1WaV1BOI/AAAAAAAAAT4/zfhTPd73vWA/s320/tabla1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: sql&quot;&gt;SELECT usu.nombre, usu.edad FROM usuario AS usu WHERE usu.nombre LIKE &#39;%a%&#39; AND (usu.tipo=1 OR usu.tipo=3)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;El resultado de la query seria:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-nA9VPJ0yvZI/T3DzHMDVW_I/AAAAAAAAATo/JT9xqlZb8es/s1600/tabla2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;201&quot; src=&quot;http://1.bp.blogspot.com/-nA9VPJ0yvZI/T3DzHMDVW_I/AAAAAAAAATo/JT9xqlZb8es/s400/tabla2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Pero la misma consulta sin los paréntesis retorna registros de la tabla que no deseamos mostrar. como podemos comprobar:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-BW09-Xxcfd8/T3DzJydAcGI/AAAAAAAAATw/S27c3qW9GE0/s1600/tabla3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;205&quot; src=&quot;http://4.bp.blogspot.com/-BW09-Xxcfd8/T3DzJydAcGI/AAAAAAAAATw/S27c3qW9GE0/s400/tabla3.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Bueno, ahora vamos a crear esa query usando instancias del CriteriaBuilder y algunos Predicados (Conjunction y Disjunction).&amp;nbsp; En esta parte voy a omitir el codigo de getEntityManager y lo del CriteriaQuery.from, ya que seria igual al ejemplo anterior ( el cual regresa la lista de usuarios ). Bueno. ahora el codigo:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class=&quot;brush: java&quot;&gt;    // Clase ObjetoBusqueda, posee todos los parametros que deseamos incluir en la busqueda, seria un POJO con sus&lt;br /&gt;    // getters y setters&lt;br /&gt;    public List&lt;usuario&gt; getAll(ObjetoBusqueda objetoBusqueda) {&lt;br /&gt;    // Obtenemos el EntityManager, CriteriaBuilder y Creamos el Query sobre la entidad deseada (Usuario.class en nuestro caso)&lt;br /&gt;    // Creamos los predicados&lt;br /&gt;    Predicate conjunction = cb.conjunction();&lt;br /&gt;    Predicate disjunction = cb.disjunction();&lt;br /&gt;    if (objetoBusqueda.getNombre() != null) {&lt;br /&gt;    // % Agregamos los comodines SQL al inicio y fin del parametro a buscar&lt;br /&gt;          conjunction.getExpressions().add(cb.like(cb.lower(usuario.get(&quot;nombre&quot;).as(String.class)), &quot;%&quot;+ objetoBusqueda.getNombre() + &quot;%&quot;));&lt;br /&gt;    }&lt;br /&gt;    if (objetoBusqueda.isBucarTipo()){&lt;br /&gt;        disjunction.getExpressions().add(cb.equal(usuario.get(&quot;tipo&quot;), 1));&lt;br /&gt;        disjunction.getExpressions().add(cb.equal(usuario.get(&quot;tipo&quot;), 3));&lt;br /&gt;    }&lt;br /&gt;    if (disjunction.getExpressions().size() &amp;gt; 0) {&lt;br /&gt;        // agregamos el disjunction al conjunction para que quede encerrado en paréntesis (como en el Query SQL&lt;br /&gt;        // de la Imagen de Arriba)&lt;br /&gt;        conjuntion.getExpressions().add(disjunction);&lt;br /&gt;    }&lt;br /&gt;    if (conjuntion.getExpressions().size() &amp;gt; 0) {&lt;br /&gt;    criteriaQuery.where(conjuntion);&lt;br /&gt;    }&lt;br /&gt;    // retornamos la lista filtrada&lt;br /&gt;    return em.createQuery(criteriaQuery).getResultList();&lt;br /&gt;}// Fin del Metodo&lt;br /&gt;&lt;/usuario&gt;&lt;/pre&gt;&lt;br /&gt;Bueno con ese código&amp;nbsp;obtendríamos&amp;nbsp;una lista de usuario al igual que en el sql de la imagen. Solo un par de detalles a resaltar del código, el parámetro que recibe el método, seria una clase java la cual&amp;nbsp;tendría&amp;nbsp;todos los&amp;nbsp;parámetros&amp;nbsp;por los cuales deseemos filtrar la&amp;nbsp;búsqueda, osea, eso es mejor que enviar todos los&amp;nbsp;parámetros&amp;nbsp;al&amp;nbsp;método,&amp;nbsp; y que los&amp;nbsp;parámetros&amp;nbsp;del&amp;nbsp;método&amp;nbsp;sean mas&amp;nbsp;fáciles&amp;nbsp;de manejar, igual, si en&amp;nbsp;algún&amp;nbsp;caso necesitamos agregar otro&amp;nbsp;parámetro&amp;nbsp;a la&amp;nbsp;búsqueda, solo le creamos la propiedad al POJO de&amp;nbsp;búsqueda&amp;nbsp;y lo tratamos en el método sin modificar la lista de&amp;nbsp;parámetros&amp;nbsp;que recibe el método :).&lt;br /&gt;&lt;br /&gt;Bueno, hasta acá, ya se ha cubierto una buena parte del total que este articulo tendrá, por lo tanto vamos a ver como usar un criteriaBuilder.in, para eso vamos a modificar, o mejor dicho agregar un par de tablas a la base de datos, bueno. para el siguiente ejemplo vamos a obtener una lista de usuarios que han ingresado al sistema en los&amp;nbsp;últimos&amp;nbsp;N&amp;nbsp;días, para eso vamos a suponer que cada vez que el usuario ingresa al sistema, en ese instante se guarda la fecha y el id del usuario. entonces tendríamos una entidad la cual llamaremos historial, y al usuario le vamos a agregar una propiedad de tipo lista de objetos de historial, en otras palabras, un usuario puede tener muchos historiales, y un registro de historia solo puede pertenecer a un usuario, osea que en usuario tenemos la relación @OneToMany, indicando una propiedad tipo Lista de Historial, y en historial tenemos una relación @ManyToOne haciendo referencia a una propiedad tipo usuario.&lt;br /&gt;Bueno, una imagen nos aclarara la&amp;nbsp;situación&amp;nbsp;^^.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-ncj7vQq2b1w/T3Z94knS0RI/AAAAAAAAAUA/ePTp8diZkd0/s1600/historial_per_user.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;289&quot; src=&quot;http://1.bp.blogspot.com/-ncj7vQq2b1w/T3Z94knS0RI/AAAAAAAAAUA/ePTp8diZkd0/s640/historial_per_user.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Bueno, los registros de la tabla usuario han cambiado respecto a la anterior imagen, pero es irrelevante la verdad. lo que si importa destacar acá es que tenemos 3 usuarios, 2 de ellos han tenido actividad los&amp;nbsp;últimos&amp;nbsp;&amp;nbsp;días&amp;nbsp;(esta entrada la estoy escribiendo el 30 de Marzo del 2012). entonces, si construimos una query la cual nos retorne los usuario que han tenido actividad en los&amp;nbsp;últimos... diez días, dicha consulta nos&amp;nbsp;debería&amp;nbsp;de retornar simplemente al usuario McCubo y Ringo 2012. vamos a construir la consulta entonces.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java&quot;&gt;    public List&amp;lt;Usuario&amp;gt; getUltimosLogeados() {&lt;br /&gt;        EntityManager entityManager = getEntityManager();&lt;br /&gt;        CriteriaBuilder cb = entityManager.getCriteriaBuilder();&lt;br /&gt;        CriteriaQuery&amp;lt;Usuario&amp;gt; historyCriteriaQuery = cb.createQuery(Usuario.class);&lt;br /&gt;        Root&amp;lt;Historial&amp;gt; historialRoot = historyCriteriaQuery.from(Historial.class);&lt;br /&gt;        historyCriteriaQuery.select(historialRoot.get(&quot;usuario&quot;).as(Usuario.class));&lt;br /&gt;        Predicate historyConjunction = cb.conjunction();&lt;br /&gt;        Calendar calendar = Calendar.getInstance();&lt;br /&gt;        calendar.add(Calendar.DATE, -10);&lt;br /&gt;        Date date = calendar.getTime();&lt;br /&gt;        // usamos greaterThanOrEqualTo en lugar de ge dado que ge espera recibir dos Expresiones tipo Numero, y dado que&lt;br /&gt;        // las fechas no son numeros, recurrimos a este otro metodo del Builder&lt;br /&gt;        historyConjunction.getExpressions().add(cb.greaterThanOrEqualTo(historialRoot.get(&quot;fechaIngreso&quot;).as(Date.class), date));&lt;br /&gt;        historyCriteriaQuery.where(historyConjunction);&lt;br /&gt;        List&amp;lt;Usuario&amp;gt; userList = entityManager.createQuery(historyCriteriaQuery).getResultList();&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        CriteriaQuery&amp;lt;Usuario&amp;gt; userCriteriaQuery = cb.createQuery(Usuario.class);&lt;br /&gt;        Root&amp;lt;Usuario&amp;gt; usuarioRoot = userCriteriaQuery.from(Usuario.class);&lt;br /&gt;        Predicate usuarioConjunction = cb.conjunction();&lt;br /&gt;        // Agregamos una restriccion a la consulta de Usuarios, indicando que necesitamos que retorne unicamente&lt;br /&gt;        // Los usuarios que estan en la lista que se pasa como parametro&lt;br /&gt;        usuarioConjunction.getExpressions().add(usuarioRoot.in(userList));&lt;br /&gt;        userCriteriaQuery.where(usuarioConjunction);&lt;br /&gt;        List&amp;lt;Usuario&amp;gt; resultList = entityManager.createQuery(userCriteriaQuery).getResultList();&lt;br /&gt;        System.out.println(date);&lt;br /&gt;        return resultList;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Bueno, aunque pueda ser que los ejemplos no tengan mucha correlación o que las restricciones (mas que todo en esta del IN) al parecer no tiene mucha lógica o se pudo evitar el IN agregando un&amp;nbsp;historyCriteriaQuery.distinct(true); para que nos retornara de una sola vez los usuarios que su ultima actividad estuviera en un lapso de tiempo menor a diez días, el objetivo era mas que nada, mostrar como se aplica la sintaxis de los métodos y para que sirva de guia para alguna alma perdida en el ciber espacio. pero bueno, después de mucho de no postear nada, espero me halla dado a entender y si no, pues en verdad lo siento, he tratado de comentar el código he ir insertando pequeñas imagen es para que el lector tenga una idea mas clara de lo que deseo compartir.&lt;br /&gt;&lt;br /&gt;Eso es todo, y espero comenten(No comentarios agresivos -.-) &amp;nbsp;si tienen alguna duda, trataremos de darle solución...&lt;br /&gt;Saludos!&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.mediafire.com/?snar7j9jcu1hzja&quot;&gt;ahhh por cierto, en este enlace quedan las entidades mapeadas por alguna duda.&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/8935821526673880105/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2012/03/jpa-criteriabuilder-conjunction.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8935821526673880105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8935821526673880105'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2012/03/jpa-criteriabuilder-conjunction.html' title='JPA CriteriaBuilder, Conjunction, Disjunction, in, like, between, greater Than, lower than'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-F9A9XfUe12I/T3D1WaV1BOI/AAAAAAAAAT4/zfhTPd73vWA/s72-c/tabla1.png" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Calle Arturo Ambrogi, San Salvador, El Salvador</georss:featurename><georss:point>13.705198952933641 -89.257049560546875</georss:point><georss:box>13.69748595293364 -89.26692006054688 13.712911952933641 -89.24717906054687</georss:box><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-7705119373249890407</id><published>2012-01-07T11:03:00.000-08:00</published><updated>2012-01-10T14:58:01.848-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="JQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><title type='text'>How to: Upload Files with Ajax in CodeIgniter // Subir Archivos usando ajax en CodeIgniter</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Hola a todos. antes que nada espero que esten pasando un feliz nuevo año y que la mayoria de las metas propuestas puedan ser completadas :D&lt;br /&gt;Bueno, empezando con el tema de la entrada, ahora veremos como subir archivos con el &lt;a href=&quot;http://codeigniter.com/&quot;&gt;framework php CodeIgniter.&lt;/a&gt; para eso vamos a usar la libraria upload que nos proporciona el framework, seria bueno darle una leida al articulo del &lt;a href=&quot;http://codeigniter.com/user_guide/libraries/file_uploading.html&quot;&gt;manual oficial&lt;/a&gt;&amp;nbsp;:D.&lt;br /&gt;&lt;br /&gt;Pero usando solamente la libreria del framework (que realiza su funcion de una manera excelente) no se logra obtener un funcionamiento asincrono,para ello vamos a usar este grandioso script de javascript el cual podemos descargar desde la web de los desarrolladores &lt;a href=&quot;http://www.phpletter.com/Our-Projects/AjaxFileUpload/&quot;&gt;aca&lt;/a&gt;, en la pagina explican como hacer funcionar el escript, asi que lo que vamos a hacer aca es simplemente integrarlo son CodeIgniter y usar la libreria upload para eso. entonces iniciamos.&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para esto vamos a crear los siguientes archivos, en mi caso:&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;/div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;View/files--&amp;gt; &lt;/b&gt;uploadFile.php&lt;/li&gt;&lt;li&gt;&lt;b&gt;Controllers--&amp;gt;&amp;nbsp;&lt;/b&gt;FileController.php&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;y por ultimo necesitaremos la libreria de javascript JQuery y la&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre-wrap;&quot;&gt;jquery-ui.min&lt;/span&gt;, las cuales podemos descargar desde la &lt;a href=&quot;http://jquery.com/&quot;&gt;pagina oficial de jquery.&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;una vez tengamos todos los archivos necesarios procedemos a crear la vista:&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;    &amp;lt;head&amp;gt;&lt;br /&gt;        &amp;lt;title&amp;gt;Upload Files by McCubo...gnuteam.blogspot.com&amp;lt;/title&amp;gt;&lt;br /&gt;        &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&amp;gt;&lt;br /&gt;        &amp;lt;script type=&quot;text/javascript&quot; src=&quot;&amp;lt;?= base_url(&quot;js/jquery.js&quot;); ?&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;script type=&quot;text/javascript&quot; src=&quot;&amp;lt;?= base_url(&quot;js/jquery-ui.min.js&quot;); ?&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;script type=&quot;text/javascript&quot; src=&quot;&amp;lt;?= base_url(&quot;js/ajaxfileupload.js&quot;); ?&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;&amp;lt;?= base_url(&quot;css/main.css&quot;); ?&amp;gt;&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;&amp;lt;?= base_url(&quot;css/smoothness/jquery-ui-1.8.16.custom.css&quot;); ?&amp;gt;&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;script type=&quot;text/javascript&quot; &amp;gt;&lt;br /&gt;            $(function() {&lt;br /&gt;                $(&#39;#uploadFile&#39;).submit(function(e) {&lt;br /&gt;                    e.preventDefault();&lt;br /&gt;                    var doUploadFileMethodURL = &quot;&amp;lt;?= site_url(&#39;fileController/doUploadFile&#39;); ?&amp;gt;&quot;;&lt;br /&gt;                    $.ajaxFileUpload({&lt;br /&gt;                        url : doUploadFileMethodURL,&lt;br /&gt;                        secureuri : false,&lt;br /&gt;                        fileElementId :&#39;userFile&#39;,&lt;br /&gt;                        dataType : &#39;json&#39;,&lt;br /&gt;                        data : { &#39;title&#39; : $(&#39;#title&#39;).val() },&lt;br /&gt;                        success  : function (data) {&lt;br /&gt;                            var base_url = &quot;&amp;lt;?= base_url(&quot;css&quot;); ?&amp;gt;&quot;;&lt;br /&gt;                            $(&quot;.userDialog&quot;)&lt;br /&gt;                            .html(data.message)&lt;br /&gt;                            .css(&quot;background&quot;, &#39;url(&#39;+base_url+&quot;/&quot;+data.background+&#39;) no-repeat right&#39;)&lt;br /&gt;                            .dialog({&lt;br /&gt;                                autoOpen: true,&lt;br /&gt;                                show: &quot;explode&quot;,&lt;br /&gt;                                hide: &quot;hide&quot;,&lt;br /&gt;                                modal: true&lt;br /&gt;                            });&lt;br /&gt;                            if(data.status != &#39;error&#39;) {&lt;br /&gt;                                $(&#39;#title&#39;).val(&#39;&#39;);&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    });&lt;br /&gt;                    //                    return false;&lt;br /&gt;                });&lt;br /&gt;            });&lt;br /&gt;        &amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;style type=&quot;text/css&quot; &amp;gt;&lt;br /&gt;            .userDialog{&lt;br /&gt;                display: none;&lt;br /&gt;            }&lt;br /&gt;        &amp;lt;/style&amp;gt;&lt;br /&gt;    &amp;lt;/head&amp;gt;&lt;br /&gt;    &amp;lt;body&amp;gt;&lt;br /&gt;            &amp;lt;fieldset style=&quot;width: 360px;&quot;&amp;gt;&amp;lt;legend&amp;gt;upload File&amp;lt;/legend&amp;gt;&lt;br /&gt;                &amp;lt;form action=&quot;&quot; method=&quot;post&quot; id=&quot;uploadFile&quot; &amp;gt;&lt;br /&gt;                    &amp;lt;label class=&quot;form&quot;&amp;gt;Title&amp;lt;/label&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; maxlength=&quot;40&quot;/&amp;gt;&lt;br /&gt;                    &lt;br /&gt;                &amp;lt;label class=&quot;form&quot;&amp;gt;File&amp;lt;/label&amp;gt;&amp;lt;input type=&quot;file&quot; id=&quot;userFile&quot; name=&quot;userFile&quot; size=&quot;20&quot; /&amp;gt;&lt;br /&gt;                &amp;lt;input type=&quot;submit&quot; id=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Upload File!&quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/form&amp;gt;&lt;br /&gt;        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;        &amp;lt;div class=&quot;userDialog&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;B&lt;/b&gt;ueno, lo que hay que tomar en cuenta es que en lugar de usar el &lt;i&gt;.ajax&lt;/i&gt; que provee Jquery usaremos el .&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;&lt;i&gt;ajaxFileUpload&lt;/i&gt; del script que nos hemos descargado. Y En ese método indicamos (mediante el atributo url) la direccion del metodo que se va ejecutar (en nuestro caso el metodo del controlador), el tipo de dato, y los parametros que recibira ese metodo y lo mas importante el atributo &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;fileElementId, donde indicamos el id que posee el componente de tipo &#39;&lt;i&gt;file&#39;&lt;/i&gt; en nuestro formulario.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;Bueno, ahora procedemos a crear nuestro Controlador y el metodo que se llamara como lo hemos indicado en el javascript(&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;doUploadFile)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;Creamos el modelo:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush:php&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;class FileController extends CI_Controller {&lt;br /&gt;&lt;br /&gt;    private $max_size = 1024;&lt;br /&gt;&lt;br /&gt;    public function __construct() {&lt;br /&gt;        parent::__construct();&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;library(array(&#39;upload&#39;, &#39;form_validation&#39;));&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;helper(array(&#39;form&#39;, &#39;string&#39;));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function index() {&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;view(&#39;files/uploadFile&#39;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;public function doUploadFile() {&lt;br /&gt;        $status = &#39;&#39;;&lt;br /&gt;        $message = &#39;&#39;;&lt;br /&gt;        $background = &#39;&#39;;&lt;br /&gt;        $file_element_name = &#39;userFile&#39;;&lt;br /&gt;        $this-&amp;gt;form_validation-&amp;gt;set_rules(&#39;title&#39;, &#39;Description&#39;, &#39;required|min_length[5]&#39;);&lt;br /&gt;        if (!$this-&amp;gt;form_validation-&amp;gt;run()) {   // Validation Error&lt;br /&gt;            $this-&amp;gt;form_validation-&amp;gt;set_error_delimiters(&#39;&#39;, &#39;&#39;);&lt;br /&gt;            $form_error_title = form_error(&#39;title&#39;);    //  catch file description field error&lt;br /&gt;            $message = $form_error_title . &quot;&amp;lt;br &amp;gt;&quot;;&lt;br /&gt;            $status = &#39;error&#39;;&lt;br /&gt;            $background = &#39;images/error.png&#39;;&lt;br /&gt;        } else {&lt;br /&gt;            if ($status != &#39;error&#39;) {&lt;br /&gt;                $config[&#39;upload_path&#39;] = &#39;./uploads/&#39;;&lt;br /&gt;                $config[&#39;allowed_types&#39;] = &#39;png|jpg|gif|doc|docx|pdf|txt|xsl|xslx|html|odf|rar|zip|7zip&#39;;&lt;br /&gt;                $config[&#39;max_size&#39;] = $this-&amp;gt;max_size * 8;&lt;br /&gt;                $config[&#39;overwrite&#39;] = TRUE;&lt;br /&gt;                $this-&amp;gt;upload-&amp;gt;initialize($config);&lt;br /&gt;                if (!$this-&amp;gt;upload-&amp;gt;do_upload($file_element_name)) {    // Validation Errors. FAIL&lt;br /&gt;                    $status = &#39;error&#39;;&lt;br /&gt;                    $message = $this-&amp;gt;upload-&amp;gt;display_errors(&#39;&#39;, &#39;&#39;);&lt;br /&gt;                    $background = &#39;images/error.png&#39;;&lt;br /&gt;                } else {&lt;br /&gt;                    $data = $this-&amp;gt;upload-&amp;gt;data();&lt;br /&gt;                    $title = $this-&amp;gt;input-&amp;gt;post(&#39;title&#39;);&lt;br /&gt;      // casi siempre queremos guardar ese archivo en la base de datos. para eso llamamos el metodo del modelo indicado&lt;br /&gt;                    // $insertFile = $this-&amp;gt;SOME_MODEL-&amp;gt;SAVE_FILE($data, $title);  // Llamada al modelo para guardar&lt;br /&gt;      $insertFile = TRUE;&lt;br /&gt;                    if ($insertFile) {  // File was added correctly to DB&lt;br /&gt;                        $status = &#39;succees&#39;;&lt;br /&gt;                        $message = &#39;File SuccessFully Uploaded!&#39;;&lt;br /&gt;                        $background = &#39;images/saved.png&#39;;&lt;br /&gt;                    } else {    // Record wasnt added to DB&lt;br /&gt;                        unlink($data[&#39;full_path&#39;]); # Deletes the File&lt;br /&gt;                        $status = &#39;error&#39;;&lt;br /&gt;                        $message = &#39;Something went wrong!!...&#39;;&lt;br /&gt;                        $background = &#39;images/error.png&#39;;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                @unlink($_FILES[$file_element_name]);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        $json_encode = json_encode(array(&#39;message&#39; =&amp;gt; $message, &#39;status&#39; =&amp;gt; $status, &#39;background&#39; =&amp;gt; $background));&lt;br /&gt;        echo $json_encode;&lt;br /&gt;    }&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Con eso seremos capaz de subir archivos al servido, y si queremos guardar informacion del mismo en una tabla de la base de datos.&lt;br /&gt;Espero me halla dado a entender, y que este pequeño ejemplo de como subir archivos sea util y funcional para alguien. Comenten si tienen problemas o dudas y vamos a tratar de encontrarles solucion :D.&lt;br /&gt;Suscribanse al Feed o haganse seguidores del blog para estar al pendiente de nuevos post.&lt;br /&gt;Hasta un nuevo post. Saludos!!!!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/7705119373249890407/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2012/01/how-to-upload-files-with-ajax-in.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/7705119373249890407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/7705119373249890407'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2012/01/how-to-upload-files-with-ajax-in.html' title='How to: Upload Files with Ajax in CodeIgniter // Subir Archivos usando ajax en CodeIgniter'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-6427922921115954550</id><published>2011-12-08T08:36:00.001-08:00</published><updated>2011-12-25T10:06:32.008-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="JQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="xhtml"/><title type='text'>How to: Create Login with Ajax and CodeIgniter // Crear Login con Ajax y CodeIgniter</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div&gt;Bueno, hola otra vez :D. Últimamente debido a mis pequeños momentos de ocio que he podido tener en el trabajo, me he dedicado a aprender un poco más (nunca esta de mas conocer un poco acerca de las tecnologías actuales :) ) acerca de programación web con &lt;a href=&quot;http://www.php.net/&quot;&gt;PHP&lt;/a&gt; 5 y el framework &lt;a href=&quot;http://codeigniter.com/&quot;&gt;CodeIgniter&lt;/a&gt; (version 2.1.0).&lt;br /&gt;&lt;br /&gt;Haciendo un poco de lectura en la documentación oficial del framework he decidido llevar a la practica lo que ahí se expone, claro esta, incluyendo una que otra funcionalidad con la libraría de javascript &lt;a href=&quot;http://jquery.com/&quot;&gt;JQuery&lt;/a&gt; (usando esta para las llamadas ajax a los controladores [llamadas a bases de datos y demás cosas]).&lt;br /&gt;&lt;br /&gt;En este punto doy por entendido que ya tienes Apache, PHP y MySQL instalado, configurado y el Framework CodeIgniter configurado con la base de datos que vamos a usar, de no ser así leer la &lt;a href=&quot;http://codeigniter.com/user_guide/database/configuration.html&quot;&gt;documentación oficial. &lt;/a&gt;&lt;br /&gt;En la base de datos debemos tener una tabla llamada &lt;i&gt;user/usuario/persona/&lt;/i&gt; o como querrás llamarla, eso es irrelevante (en mi caso &lt;i&gt;user&lt;/i&gt;), acá una imagen de la estructura:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-_fwar02t6y4/TuDtXEiMP0I/AAAAAAAAASM/ttgwkaFyumA/s1600/userTable.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;216&quot; src=&quot;http://4.bp.blogspot.com/-_fwar02t6y4/TuDtXEiMP0I/AAAAAAAAASM/ttgwkaFyumA/s640/userTable.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ahora crearemos.&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;una vista; la cual llamaremos &lt;i&gt;&lt;b&gt;userLogin.php &lt;/b&gt;&lt;/i&gt;y esta estara situada en application/views&lt;/li&gt;&lt;li&gt;un Controlador; &lt;i&gt;&lt;b&gt;UserController.php&lt;/b&gt;&lt;/i&gt; y lo guardamos en application/controllers&lt;/li&gt;&lt;li&gt;y por ultimo un modelo; &lt;i&gt;&lt;b&gt;UserModel.php&lt;/b&gt;&lt;/i&gt;, application/models&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;Creamos en la raíz del proyecto dos carpetas. llamadas&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;css.&lt;/b&gt; acá guardaremos (obviamente) las hojas de estilo y las imágenes del sistema&lt;/li&gt;&lt;li&gt;&lt;b&gt;js&lt;/b&gt;. carpeta que almacenará la libreria de jquery y jquery-ui.min, entre otros scripts que deseemos crear.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;Bueno una vez ya definido la estructura del sistema, ahora definiremos la lógica bajo la cual programaremos el Login.&lt;br /&gt;Por el momento los campos que nos interesan de la tabla &lt;b&gt;user&lt;/b&gt; con : password, nickname, email. mediante estos se validara al usuario.&lt;br /&gt;Las llamadas a la base de datos serán de modo &lt;a href=&quot;http://es.wikipedia.org/wiki/AJAX&quot;&gt;asíncronas&amp;nbsp; &lt;/a&gt;lo cual nos va a permitir consultar la base de datos sin necesidad de refrescar el sitio entero.&lt;br /&gt;Empecemos entonces creando el Modelo: &lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author McCubo&lt;br /&gt; * @copyright 2011&lt;br /&gt; * @license GPL V2.&lt;br /&gt; */&lt;br /&gt;class UserModel extends CI_Model {&lt;br /&gt;&lt;br /&gt;    public function __construct() {&lt;br /&gt;        parent::__construct(); //Llamada al constructor padre. Must&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @author McCubo&lt;br /&gt;     * @param String $ident Nickname o Email del usuario a buscar&lt;br /&gt;     * @return userResult objeto usuario del respectivo nick o email, null si no existe&lt;br /&gt;     */&lt;br /&gt;    public function getUserFromIdent($ident) {&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;where(&#39;nickname&#39;, $ident);&lt;br /&gt;        $this-&amp;gt;db-&amp;gt;or_where(&#39;email&#39;, $ident);&lt;br /&gt;        $userResult = $this-&amp;gt;db-&amp;gt;get(&#39;user&#39;)-&amp;gt;row();&lt;br /&gt;        return $userResult;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Como podemos ver, la única función del modelo es ejecutar la consulta a la base de datos, creamos la consulta y la convertimos a un único objeto&lt;i&gt;&lt;b&gt; -&amp;gt;row();&lt;/b&gt;&lt;/i&gt; retorna null si no existe usuario asociado al identificador proporcionando.&lt;br /&gt;Cabe hacer notar que los campos &lt;b&gt;nickname &lt;/b&gt;como &lt;b&gt;email &lt;/b&gt;son únicos en la tabla &lt;b&gt;user&lt;/b&gt;.&lt;br /&gt;Ahora crearemos el Controlador:&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author McCubo&lt;br /&gt; * @copyright 2011&lt;br /&gt; */&lt;br /&gt;class UserController extends CI_Controller {&lt;br /&gt;&lt;br /&gt;    public function __construct() {&lt;br /&gt;        parent::__construct();&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;model(&#39;UserModel&#39;);&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;library(array(&#39;form_validation&#39;, &#39;session&#39;, &#39;encrypt&#39;));&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;helper(array(&#39;security&#39;, &#39;form&#39;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Primer metodo al llamar al controlador&lt;br /&gt;    public function index() {&lt;br /&gt;        $this-&amp;gt;load-&amp;gt;view(&#39;userLogin&#39;);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // Metodo para logear usuario&lt;br /&gt;    public function doLogin() {&lt;br /&gt;        $this-&amp;gt;form_validation-&amp;gt;set_rules(&#39;userIdent&#39;, &#39;User Ident&#39;, &#39;required&#39;);&lt;br /&gt;        $this-&amp;gt;form_validation-&amp;gt;set_rules(&#39;password&#39;, &#39;Password&#39;, &#39;required&#39;);&lt;br /&gt;        if (!$this-&amp;gt;form_validation-&amp;gt;run()) {   // Falló la validación&lt;br /&gt;            $message = validation_errors();&lt;br /&gt;            $background = &#39;images/error.png&#39;;&lt;br /&gt;        } else {    # Validacion paso sin problemas&lt;br /&gt;            $userIdent = $this-&amp;gt;input-&amp;gt;post(&#39;userIdent&#39;);&lt;br /&gt;            $password = $this-&amp;gt;input-&amp;gt;post(&#39;password&#39;);&lt;br /&gt;            $user = $this-&amp;gt;UserModel-&amp;gt;getUserFromIdent($userIdent);&lt;br /&gt;            if ($user != null) {    // usuario con $userIdent existe en systema&lt;br /&gt;                if ($user-&amp;gt;password == do_hash($password, &#39;md5&#39;)) { //Encriptamos la password (en la db se guarda encriptada)&lt;br /&gt;                    $sessionData = array(&lt;br /&gt;                        &#39;username&#39; =&amp;gt; $user-&amp;gt;nickname,&lt;br /&gt;                        &#39;email&#39; =&amp;gt; $user-&amp;gt;email,&lt;br /&gt;                        &#39;loggedIn&#39; =&amp;gt; true&lt;br /&gt;                    );&lt;br /&gt;                    $this-&amp;gt;session-&amp;gt;set_userdata($sessionData); // agregamos info a la session&lt;br /&gt;                    $message = &quot;Now You&#39;re Logged in as &quot; . $this-&amp;gt;session-&amp;gt;userdata(&#39;username&#39;);&lt;br /&gt;                    $background = &#39;images/ok.png&#39;;&lt;br /&gt;                } else {    // Wrong password&lt;br /&gt;                    $message = &quot;Password Incorrect!&quot;;&lt;br /&gt;                    $background = &#39;images/error.png&#39;;&lt;br /&gt;                }&lt;br /&gt;            } else {    // user with $userIdent not Found in DB&lt;br /&gt;                $message = &quot;user Ident. &quot; . $userIdent . &quot; not found on McCubos System&quot;;&lt;br /&gt;                $background = &#39;images/error.png&#39;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        $returnedData = array(&lt;br /&gt;            &#39;message&#39; =&amp;gt; $message,&lt;br /&gt;            &#39;background&#39; =&amp;gt; $background&lt;br /&gt;        );&lt;br /&gt;        $jsonData = json_encode($returnedData);&lt;br /&gt;        echo $jsonData; //array asociativo json format&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Bueno una breve explicación. el método obtiene el identificado del usuario (puede ser &lt;i&gt;nickname &lt;/i&gt;o &lt;i&gt;email) &lt;/i&gt;y consulta si existe un registro con la información proporcionada (se ejecuta en el modelo). si el usuario existe, verificamos que la contraseña del formulario es igual a la contraseña que esta almacenada en la base de datos (codificadas con MD5). si ambas contraseñas coinciden, significa que la contraseña corresponde al registro con el identificador del usuario, iniciamos sesión con la cual controlaremos la seguridad de la pagina (mediante la propiedad &lt;i&gt;&lt;b&gt;loggedIn&lt;/b&gt;&lt;/i&gt;). de lo contrario se almacena en la variable mensaje el mensaje correspondiente al fallo que ocurrió en el proceso.&lt;br /&gt;Al final imprimimos un arreglo en formato &lt;a href=&quot;http://es.wikipedia.org/wiki/JSON&quot;&gt;&lt;i&gt;&lt;b&gt;json&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;para terminar y hacer funcionar el sistema de login creamos la vista, osea el formulario que llamará de forma asíncrona al método doLogin del controlador UserController.&lt;br /&gt;La Vista:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;    &amp;lt;head&amp;gt;&lt;br /&gt;        &amp;lt;title&amp;gt;Login to McCubo&#39;s System&amp;lt;/title&amp;gt;&lt;br /&gt;        &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&amp;gt;&lt;br /&gt;        &amp;lt;script type=&quot;text/javascript&quot; src=&quot;&amp;lt;?= base_url(&quot;js/jquery.js&quot;); ?&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;script type=&quot;text/javascript&quot; src=&quot;&amp;lt;?= base_url(&quot;js/jquery-ui.min.js&quot;); ?&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;&amp;lt;?= base_url(&quot;css/main.css&quot;); ?&amp;gt;&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;&amp;lt;?= base_url(&quot;css/smoothness/jquery-ui-1.8.16.custom.css&quot;); ?&amp;gt;&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;script type=&quot;text/javascript&quot; &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class=&quot;brush: js&quot;&gt;                $(&quot;#loginButton&quot;).click(function(){&lt;br /&gt;                    var base_url = &#39;&amp;lt;?= base_url(&#39;css&#39;); ?&amp;gt;&#39;;&lt;br /&gt;                    var doLoginMethodUrl = &#39;&amp;lt;?= site_url(&quot;userController/doLogin&quot;) ?&amp;gt;&#39;;&lt;br /&gt;                    var userIdent = $(&quot;#userIdent&quot;).val();&lt;br /&gt;                    var password = $(&quot;#userPassword&quot;).val();                    &lt;br /&gt;                    $.ajax({&lt;br /&gt;                        type: &quot;POST&quot;,&lt;br /&gt;                        url: doLoginMethodUrl,&lt;br /&gt;                        dataType: &quot;json&quot;,                        &lt;br /&gt;                        data: &#39;userIdent=&#39;+userIdent+&quot;&amp;amp;password=&quot;+password,&lt;br /&gt;                        cache: false,                        &lt;br /&gt;                        success: function(data){&lt;br /&gt;                            $(&quot;.userDialog&quot;)&lt;br /&gt;                            .html(data.message)&lt;br /&gt;                            .css(&quot;background&quot;, &#39;url(&#39;+base_url+&quot;/&quot;+data.background+&#39;) no-repeat right&#39;)&lt;br /&gt;                            .dialog({&lt;br /&gt;                                autoOpen: true,&lt;br /&gt;                                show: &quot;explode&quot;,&lt;br /&gt;                                hide: &quot;FadeOut&quot;&lt;br /&gt;                            })&lt;br /&gt;                        }&lt;br /&gt;                    });&lt;br /&gt;                    return false;&lt;br /&gt;                });&lt;br /&gt;            });&lt;br /&gt;&lt;/pre&gt;&lt;pre class=&quot;brush: php&quot;&gt;        &amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;style type=&quot;text/css&quot; &amp;gt;&lt;br /&gt;            .userDialog{&lt;br /&gt;                display: none; &lt;br /&gt;            }&lt;br /&gt;        &amp;lt;/style&amp;gt;&lt;br /&gt;    &amp;lt;/head&amp;gt;&lt;br /&gt;    &amp;lt;body&amp;gt;&lt;br /&gt;        &amp;lt;div class=&quot;userDialog&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;fieldset style=&quot;width: 300px;&quot;&amp;gt;&amp;lt;legend&amp;gt;user Data&amp;lt;/legend&amp;gt;&lt;br /&gt;            &amp;lt;?php form_open() ?&amp;gt;&lt;br /&gt;            &amp;lt;label class=&quot;form&quot;&amp;gt;Nickname/Email&amp;lt;/label&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;userIdent&quot; id=&quot;userIdent&quot; /&amp;gt;&lt;br /&gt;            &amp;lt;label class=&quot;form&quot;&amp;gt;Password&amp;lt;/label&amp;gt;&amp;lt;input type=&quot;password&quot; name=&quot;userPassword&quot; id=&quot;userPassword&quot; /&amp;gt;&lt;br /&gt;            &amp;lt;input type=&quot;submit&quot; id=&quot;loginButton&quot; name=&quot;loginButton&quot; value =&quot;Log in&quot; /&amp;gt;&lt;br /&gt;            &amp;lt;?php form_close() ?&amp;gt;&lt;br /&gt;        &amp;lt;/fieldset&amp;gt;&lt;br /&gt;    &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;De esta forma hemos creado un login el cual efectua las llamadas al controlador de forma asíncrona y respetando el &lt;a href=&quot;http://es.wikipedia.org/wiki/Modelo_Vista_Controlador&quot;&gt;modelo vista controlador(MVC) &lt;/a&gt;separando la lógica de la aplicación :D.&lt;br /&gt;&lt;br /&gt;Los resultados de un login exitoso seria como el de la imagen (user ident proporcionado nickname)&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-6_TAofJNoxY/TuEbit2Os_I/AAAAAAAAASU/X5Q7OKtpnb4/s1600/logged.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;192&quot; src=&quot;http://2.bp.blogspot.com/-6_TAofJNoxY/TuEbit2Os_I/AAAAAAAAASU/X5Q7OKtpnb4/s400/logged.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;o&amp;nbsp; (user ident proporcionado email):&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-o0M2ESv6D1Y/TuEdAysrveI/AAAAAAAAAS0/OIzH4PnryTY/s1600/emailLogged.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;216&quot; src=&quot;http://1.bp.blogspot.com/-o0M2ESv6D1Y/TuEdAysrveI/AAAAAAAAAS0/OIzH4PnryTY/s400/emailLogged.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Error en la validación de Campos:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-PSVrU9x-bCE/TuEbmlq7RJI/AAAAAAAAASs/nMUcwFDvy18/s1600/emptyFields.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;213&quot; src=&quot;http://4.bp.blogspot.com/-PSVrU9x-bCE/TuEbmlq7RJI/AAAAAAAAASs/nMUcwFDvy18/s400/emptyFields.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Identificador Existe pero contraseña no corresponde a dicho registro:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-ANfRC5a_Kns/TuEbijAW7DI/AAAAAAAAASY/A-Y85aAgP7s/s1600/userExistNoPassword.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;210&quot; src=&quot;http://2.bp.blogspot.com/-ANfRC5a_Kns/TuEbijAW7DI/AAAAAAAAASY/A-Y85aAgP7s/s400/userExistNoPassword.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Identificador no existe:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-vWn-0sDxjqs/TuEbioJ7K4I/AAAAAAAAASk/JXg7UC0TmcY/s1600/nouser.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;210&quot; src=&quot;http://3.bp.blogspot.com/-vWn-0sDxjqs/TuEbioJ7K4I/AAAAAAAAASk/JXg7UC0TmcY/s400/nouser.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Bueno aplicarle estilo a la pagina principal lo dejo a ustedes, ya que en esta entrada no es CSS el objetivo de aprendizaje. x)&lt;br /&gt;Por ahora dejamos esta entrada hasta acá, pero próximamente, si e Optimus Prime lo quiere y mi estado de animo no esta muy deteriorado, publicare futuros ejemplo de mantenimiento a la base de datos (Insert, Update, Delete) claro esta con Ajax ;).&lt;br /&gt;Recuerden crear los directorio en el raiz, dicho directorios deben tener este contenido (o similar).&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-qsYeZFfQ44E/TuEgDsQ9RTI/AAAAAAAAATA/DK7vDqxCaG8/s1600/folder_js.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-qsYeZFfQ44E/TuEgDsQ9RTI/AAAAAAAAATA/DK7vDqxCaG8/s1600/folder_js.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;y el Contenedor del Css de jquery y del Sitio:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-YPJCMxCKCkY/TuEgDhnAJ-I/AAAAAAAAAS8/xlXiIAyDU4U/s1600/folder_css.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-YPJCMxCKCkY/TuEgDhnAJ-I/AAAAAAAAAS8/xlXiIAyDU4U/s1600/folder_css.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Espero haberme dado a entender con este pequeño post, también que a alguien ahí afuera le sirva o almenos lo tome de guía para mejorarlo o algo así x). Nos vemos en el siguente post.&lt;br /&gt;Pásenla bien y gracias por leerme :)&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/6427922921115954550/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/12/how-to-create-login-with-ajax-and.html#comment-form' title='11 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/6427922921115954550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/6427922921115954550'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/12/how-to-create-login-with-ajax-and.html' title='How to: Create Login with Ajax and CodeIgniter // Crear Login con Ajax y CodeIgniter'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-_fwar02t6y4/TuDtXEiMP0I/AAAAAAAAASM/ttgwkaFyumA/s72-c/userTable.png" height="72" width="72"/><thr:total>11</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-2803231454527084494</id><published>2011-12-08T07:59:00.001-08:00</published><updated>2011-12-25T10:06:32.000-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jtextfield"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>How to: set MaxLength JTextfield // Setear longitud maxima de texto JTextField</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Hola a todos :D espero estén pasando bien y preparándose para la celebración de la Navidad (si es que la celebran claro :D). no hay nada de malo en no celebrarla pero muchas veces hay regalos y comida... y lo mejor de todo... Its FREE!! x).&lt;br /&gt;Bueno ya pasando al tema en cuestión. muchas veces (por no decir todas) queremos validar desde la interfaz del usuario la cantidad máxima de caracteres que un campo puede soportar. Cuando creamos una aplicación web la tarea es mas que sencilla, simplemente (si mi memoria no me falla) se hace asi:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-81khgxQ_bGU/TuDhAX1Y-PI/AAAAAAAAASE/6kFWD7oYeHs/s1600/textfield.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;22&quot; src=&quot;http://4.bp.blogspot.com/-81khgxQ_bGU/TuDhAX1Y-PI/AAAAAAAAASE/6kFWD7oYeHs/s320/textfield.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Fácil verdad :D. pero en Java. por diferentes razones no existe un método para lograr dicho comportamiento en nuestros JTextField. entonces nosotros creamos una clase a la cual le indicamos la longitud deseada. esto de la siguente manera:&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package tester;&lt;br /&gt;&lt;br /&gt;import javax.swing.text.AttributeSet;&lt;br /&gt;import javax.swing.text.BadLocationException;&lt;br /&gt;import javax.swing.text.PlainDocument;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; * @website http://www.gnuteam.blogspot.com&lt;br /&gt; * @version 0.1&lt;br /&gt; */&lt;br /&gt;public class TextLimiter extends PlainDocument {&lt;br /&gt;&lt;br /&gt;    private Integer limit;&lt;br /&gt;&lt;br /&gt;    public TextLimiter(Integer limit) {&lt;br /&gt;        super();&lt;br /&gt;        this.limit = limit;&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * sobre escribimos este metodo de la clase PlainDocument&lt;br /&gt;     * Si el limite es negativo o nulo no impone un limite al texto&lt;br /&gt;     */&lt;br /&gt;    @Override&lt;br /&gt;    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {&lt;br /&gt;        if (str == null) {&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;        if (limit == null || limit &amp;lt; 1 || ((getLength() + str.length()) &amp;lt;= limit)) {&lt;br /&gt;            super.insertString(offs, str, a);&lt;br /&gt;        } else if ((getLength() + str.length()) &amp;gt; limit) {&lt;br /&gt;            String insertsub = str.substring(0, (limit - getLength()));&lt;br /&gt;            super.insertString(offs, insertsub, a);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Y para usarlo simplemente (después del initComponent, en caso de usar NetBeans IDE...&lt;strike&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;como yo xD&lt;/span&gt;&lt;/strike&gt;):&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;jTextField1.setDocument(new TextLimiter(10));&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Como ven es simple de crear y fácil de implementar. Espero les sirva y espero comenten, esta vez no dejo archivo de descarga porque es simplemente una clase la que se debe crear. &lt;br /&gt;Comenten y Nos vemos en otras entradas :D&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/2803231454527084494/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/12/how-to-set-maxlength-jtextfield-setear.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/2803231454527084494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/2803231454527084494'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/12/how-to-set-maxlength-jtextfield-setear.html' title='How to: set MaxLength JTextfield // Setear longitud maxima de texto JTextField'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-81khgxQ_bGU/TuDhAX1Y-PI/AAAAAAAAASE/6kFWD7oYeHs/s72-c/textfield.png" height="72" width="72"/><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-1083790602823694382</id><published>2011-10-27T15:42:00.000-07:00</published><updated>2011-12-25T10:06:31.997-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eyecandy"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jinternalframe"/><category scheme="http://www.blogger.com/atom/ns#" term="laf"/><category scheme="http://www.blogger.com/atom/ns#" term="MDI"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>How to: Change JInternalFrame Icons // Cambiar iconos de los JInternalFrame (maximizar, cerrar, minimizar)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Hola a todos :D en esta ocasión vamos a ver como darle un aspecto un poco mas personalizado a nuestras aplicaciones swing en java. el objetivo de esta entrada es cambiar los botones de maximiza, minimizar y cerrar(en sus diferentes estados) de los JInternalFrames. He optado por usar la clase &lt;i&gt;NimbusLookAndFeel&lt;/i&gt; para lograr el objetivo, lo hago de estar forma porque es un LookAndFeel bastante agradable a la vista y permite (&lt;a href=&quot;http://gnuteam.blogspot.com/2011/09/how-to-jinternalframe-barra-de-titulo.html&quot;&gt;como vimos en esta entrada&lt;/a&gt;) poner, de una forma super sencilla, barras traslucidas a los JInternalFrames.&lt;br /&gt;Pasamos de tener algo como esto:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-68FRbKnTcwY/TqnJKy6MsWI/AAAAAAAAARE/ER6wHXm5Zpk/s1600/L.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-68FRbKnTcwY/TqnJKy6MsWI/AAAAAAAAARE/ER6wHXm5Zpk/s1600/L.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;a algo aun mas bonito y personalizado(me refiero al aspecto de los botones de los JInternalFrames x)... por alguna duda que pueda surgir) como esto: &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-PTLw3VFw10Y/TqnIQy_dgEI/AAAAAAAAAQ8/jOZ1wb7nt6U/s1600/LAF1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-PTLw3VFw10Y/TqnIQy_dgEI/AAAAAAAAAQ8/jOZ1wb7nt6U/s1600/LAF1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Como vamos a lograr eso?. la verdad super sencillo. algo asi:&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Bueno antes de nada, una pequeña y breve introducción de lo que vamos a hacer.&lt;br /&gt;Para empezar debemos tener en cuenta el estado que cada uno de los botones tiene, minimizar y cerrar comparten los mismo estados, los cuales son:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Pressed&lt;/b&gt; : cuando hacemos y sostenemos el click sobre el botón.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Enabled &lt;/b&gt;: este estado lo gana cuando la ventana que lo contiene gana el foco.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Enabled+WindowNotFocused&lt;/b&gt; : la ventana no tiene el foco.&lt;/li&gt;&lt;li&gt;&lt;b&gt;MouseOver&lt;/b&gt; : el puntero esta sobre el área del botón.&lt;/li&gt;&lt;li&gt;&lt;b&gt;MouseOver+WindowNotFocused&lt;/b&gt; : el puntero esta sobre el área del botón en una ventana inactiva (no poseedora del foco).&lt;/li&gt;&lt;/ul&gt;Mientras tanto Maximizar posee esos mismos estado pero agregando algunos mas propios de el, esos estados son :&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Enabled+WindowMaximized&lt;/b&gt; : el botón maximizar pasa a ese estado cuando la ventana contenedora regresa &lt;i&gt;true&lt;/i&gt; a la llamada del método &lt;b&gt;isMaximum()&lt;/b&gt;, en otras palabras, si esta maximizada pero con el foco ganado.&lt;/li&gt;&lt;li&gt;&lt;b&gt;MouseOver+WindowMaximized&lt;/b&gt; : el puntero esta sobre el área del botón y ademas la ventana esta maximizada.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Pressed+WindowMaximized&lt;/b&gt; : esta presionado y ventana padre maximizada.&lt;/li&gt;&lt;li&gt;&lt;b&gt;MouseOver+WindowNotFocused&lt;/b&gt; : puntero sobre el botón con la condición que la ventana padre no sea poseedora del foco.&lt;/li&gt;&lt;li&gt;&lt;b&gt;MouseOver+WindowMaximized+WindowNotFocused&lt;/b&gt; : bueno... este es una gran combinación de eventos: puntero sobre el botón con las condiciones que la ventana este maximizada pero no tenga el foco. &lt;/li&gt;&lt;/ul&gt;Cada botón tiene algunos otros estados, pero creo que con los mencionados el objetivo de dar a entender el funcionamiento se cubre perfectamente; si quieres agregar mas estados, los pasos básicamente serian igual :D&lt;br /&gt;Primero crearemos la clase principal, la cual constara unicamente de una barra de menú y un jdesktopPane.&lt;br /&gt;(si notan alguna similitud con &lt;a href=&quot;http://gnuteam.blogspot.com/2011/10/abrir-jinternalframe-desde-otro.html&quot;&gt;el código de la entrada anterior&lt;/a&gt; es porque es el mismo código ^^, almenos esta clase)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;import java.awt.BorderLayout;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import javax.swing.JDesktopPane;&lt;br /&gt;import javax.swing.JInternalFrame;&lt;br /&gt;import javax.swing.JMenu;&lt;br /&gt;import javax.swing.JMenuBar;&lt;br /&gt;import javax.swing.JMenuItem;&lt;br /&gt;import javax.swing.UIManager;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class LaFMain extends javax.swing.JFrame {&lt;br /&gt;&lt;br /&gt;    private JMenuBar menu;&lt;br /&gt;    private JMenu action;&lt;br /&gt;    private JMenuItem actionItem;&lt;br /&gt;    private static JDesktopPane jDesktopPane;&lt;br /&gt;&lt;br /&gt;    public LaFMain() {&lt;br /&gt;        initComponents();&lt;br /&gt;        setVisible(true);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void initComponents() {&lt;br /&gt;        menu = new JMenuBar();&lt;br /&gt;        action = new JMenu(&quot;Action&quot;);&lt;br /&gt;        actionItem = new JMenuItem(&quot;perform Action&quot;);&lt;br /&gt;        jDesktopPane = new JDesktopPane();&lt;br /&gt;        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;        setSize(600, 400);&lt;br /&gt;        setLayout(new BorderLayout());&lt;br /&gt;        jDesktopPane.setBorder(new BackgroundImage());&lt;br /&gt;        actionItem.addActionListener(getListener());&lt;br /&gt;        action.add(actionItem);&lt;br /&gt;        menu.add(action);&lt;br /&gt;        getContentPane().add(menu, BorderLayout.NORTH);&lt;br /&gt;        getContentPane().add(jDesktopPane, BorderLayout.CENTER);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private ActionListener getListener() {&lt;br /&gt;        return new ActionListener() {&lt;br /&gt;&lt;br /&gt;            public void actionPerformed(ActionEvent e) {&lt;br /&gt;                JIF jIF = new JIF();&lt;br /&gt;                jIF.setVisible(true);&lt;br /&gt;                jDesktopPane.add(jIF);&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static JDesktopPane getjDesktopPane() {&lt;br /&gt;        return jDesktopPane;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        new LaFMain();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class validador {&lt;br /&gt;&lt;br /&gt;    public static HashMap&amp;lt;String, JInternalFrame&amp;gt; jIframes = new HashMap&amp;lt;String, JInternalFrame&amp;gt;();&lt;br /&gt;&lt;br /&gt;    public static void addJIframe(String key, JInternalFrame jiframe) {&lt;br /&gt;        jIframes.put(key, jiframe);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static JInternalFrame getJInternalFrame(String key) {&lt;br /&gt;        return jIframes.get(key);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;esta clase la guardamos con el nombre de &lt;b&gt;LaFMain.java&lt;/b&gt;.&lt;br /&gt;Ahora, creamos una clase que extienda de &lt;b&gt;&lt;i&gt;com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel&lt;/i&gt;&lt;/b&gt; a esa clase la he llamado &lt;i&gt;&lt;b&gt;McLaFNimbus.java&lt;/b&gt;&lt;/i&gt;, esa clase solo tendrá 2 métodos y un constructor vació. y su código es el siguente:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;import com.sun.java.swing.Painter;&lt;br /&gt;import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;&lt;br /&gt;import java.awt.BasicStroke;&lt;br /&gt;import java.awt.Graphics2D;&lt;br /&gt;import java.awt.Image;&lt;br /&gt;import java.awt.RenderingHints;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;import javax.swing.JComponent;&lt;br /&gt;import javax.swing.UIDefaults;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class McLaFNimbus extends NimbusLookAndFeel {&lt;br /&gt;&lt;br /&gt;    public McLaFNimbus() {&lt;br /&gt;        super();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public UIDefaults getDefaults() {&lt;br /&gt;        UIDefaults defaults = super.getDefaults();&lt;br /&gt;        String closePressed = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.closeButton\&quot;[Pressed].backgroundPainter&quot;;&lt;br /&gt;        String closeEnable = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.closeButton\&quot;[Enabled].backgroundPainter&quot;;&lt;br /&gt;        String closeEnableNotFocused = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.closeButton\&quot;[Enabled+WindowNotFocused].backgroundPainter&quot;;&lt;br /&gt;        String closeRollOverNotFocus = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.closeButton\&quot;[MouseOver+WindowNotFocused].backgroundPainter&quot;;&lt;br /&gt;        String closeRollOver = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.closeButton\&quot;[MouseOver].backgroundPainter&quot;;&lt;br /&gt;&lt;br /&gt;        String iconEnable = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.iconifyButton\&quot;[Enabled].backgroundPainter&quot;;&lt;br /&gt;        String iconRollOver = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.iconifyButton\&quot;[MouseOver].backgroundPainter&quot;;&lt;br /&gt;        String iconPressed = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.iconifyButton\&quot;[Pressed].backgroundPainter&quot;;&lt;br /&gt;        String iconRollOverNotFocus = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.iconifyButton\&quot;[MouseOver+WindowNotFocused].backgroundPainter&quot;;&lt;br /&gt;        String iconNotFocus = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.iconifyButton\&quot;[Enabled+WindowNotFocused].backgroundPainter&quot;;&lt;br /&gt;&lt;br /&gt;        String maximizeEnable = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.maximizeButton\&quot;[Enabled].backgroundPainter&quot;;&lt;br /&gt;        String maximizeMaxEnable = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.maximizeButton\&quot;[Enabled+WindowMaximized].backgroundPainter&quot;;&lt;br /&gt;        String maximizeRollOverFocus = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.maximizeButton\&quot;[MouseOver].backgroundPainter&quot;;&lt;br /&gt;        String maximizeMaxRollOverFocus = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.maximizeButton\&quot;[MouseOver+WindowMaximized].backgroundPainter&quot;;&lt;br /&gt;        String maximizePressed = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.maximizeButton\&quot;[Pressed].backgroundPainter&quot;;&lt;br /&gt;        String maximizeMaxPressed = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.maximizeButton\&quot;[Pressed+WindowMaximized].backgroundPainter&quot;;&lt;br /&gt;        String maximizeNotFocus = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.maximizeButton\&quot;[Enabled+WindowNotFocused].backgroundPainter&quot;;&lt;br /&gt;        String maximizeRollOverNotFocus = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.maximizeButton\&quot;[MouseOver+WindowNotFocused].backgroundPainter&quot;;&lt;br /&gt;        String maximizeMaxNotFocus = &quot;InternalFrame:InternalFrameTitlePane:\&quot;InternalFrameTitlePane.maximizeButton\&quot;[MouseOver+WindowMaximized+WindowNotFocused].backgroundPainter&quot;;&lt;br /&gt;&lt;br /&gt;        defaults.put(closeEnableNotFocused, getPainter(&quot;src/resources/LookAndFeel/closeNotFocused.png&quot;));&lt;br /&gt;        defaults.put(closeRollOver, getPainter(&quot;src/resources/LookAndFeel/FrameCloseRoll.png&quot;));&lt;br /&gt;        defaults.put(closeEnable, getPainter(&quot;src/resources/LookAndFeel/FrameClose.png&quot;));&lt;br /&gt;        defaults.put(closePressed, getPainter(&quot;src/resources/LookAndFeel/FrameClosePush.png&quot;));&lt;br /&gt;        defaults.put(closeRollOverNotFocus, getPainter(&quot;src/resources/LookAndFeel/rollOverNotFocus.png&quot;));&lt;br /&gt;&lt;br /&gt;        defaults.put(iconEnable, getPainter(&quot;src/resources/LookAndFeel/iconEnable.png&quot;));&lt;br /&gt;        defaults.put(iconRollOver, getPainter(&quot;src/resources/LookAndFeel/iconRollOverFocus.png&quot;));&lt;br /&gt;        defaults.put(iconPressed, getPainter(&quot;src/resources/LookAndFeel/iconPush.png&quot;));&lt;br /&gt;        defaults.put(iconRollOverNotFocus, getPainter(&quot;src/resources/LookAndFeel/iconRollOverNotFocus.png&quot;));&lt;br /&gt;        defaults.put(iconNotFocus, getPainter(&quot;src/resources/LookAndFeel/iconNotFocus.png&quot;));&lt;br /&gt;&lt;br /&gt;        defaults.put(maximizeEnable, getPainter(&quot;src/resources/LookAndFeel/FrameMaximize.png&quot;));&lt;br /&gt;        defaults.put(maximizeMaxEnable, getPainter(&quot;src/resources/LookAndFeel/FrameRestore.png&quot;));&lt;br /&gt;        defaults.put(maximizeRollOverFocus, getPainter(&quot;src/resources/LookAndFeel/maximizeRollOverFocus.png&quot;));&lt;br /&gt;        defaults.put(maximizeMaxRollOverFocus, getPainter(&quot;src/resources/LookAndFeel/FrameRestoreMaxRollOver.png&quot;));&lt;br /&gt;        defaults.put(maximizePressed, getPainter(&quot;src/resources/LookAndFeel/FrameRestorePressed.png&quot;));&lt;br /&gt;        defaults.put(maximizeMaxPressed, getPainter(&quot;src/resources/LookAndFeel/FrameRestoreMaxPressed.png&quot;));&lt;br /&gt;        defaults.put(maximizeNotFocus, getPainter(&quot;src/resources/LookAndFeel/maximizeNotFocus.png&quot;));&lt;br /&gt;        defaults.put(maximizeRollOverNotFocus, getPainter(&quot;src/resources/LookAndFeel/maximizeRollOverNotFocus.png&quot;));&lt;br /&gt;        defaults.put(maximizeMaxNotFocus, getPainter(&quot;src/resources/LookAndFeel/maximizeMaxNotFocus.png&quot;));&lt;br /&gt;        return defaults;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Painter&amp;lt;JComponent&amp;gt; getPainter(final String path) {&lt;br /&gt;        return new Painter&amp;lt;JComponent&amp;gt;() {&lt;br /&gt;&lt;br /&gt;            public void paint(Graphics2D g, JComponent object, int width, int height) {&lt;br /&gt;                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);&lt;br /&gt;                g.setStroke(new BasicStroke(2f));&lt;br /&gt;                g.drawImage(ImageUtils.getScaledImage(path).getImage(), 0, 0, null);&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;class ImageUtils {&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     *&lt;br /&gt;     * @param URL direccion de la imagen dentro del proyecto&lt;br /&gt;     * @return una Imagen redimensionada a 16 x 16&lt;br /&gt;     */&lt;br /&gt;    public static ImageIcon getScaledImage(String path){&lt;br /&gt;        ImageIcon sourceIcon = new ImageIcon(path);&lt;br /&gt;        ImageIcon scaledIcon = new ImageIcon(sourceIcon.getImage().getScaledInstance(16, 16, Image.SCALE_DEFAULT));&lt;br /&gt;        return scaledIcon;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;y creamos un pequeño cambio en la clase principal, en el constructor, antes del método &lt;b&gt;initComponents();&lt;/b&gt; agregamos el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;        try {&lt;br /&gt;            UIManager.setLookAndFeel(new McLaFNimbus());&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;            System.out.println(ex);&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Lo corremos y ya!! tenemos iconos personalizados en nuestra aplicación java :D. como siempre el código completo de la aplicación lo pueden encontrar en el enlace de descarga justo al final de la entrada.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;PD1. Este método solo funciona con NimbusLookAndFeel, si quieres usar otro Look and Feel (MetalLookAndFeel por ejemplo) es totalmente diferente.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;PD2.No se si existe otra forma mas sencilla o con menos vueltas para lograr lo que acá he comentado. de ser asi... compartan el hipervínculo xD&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Bueno eso es todo. espero les guste/funcione/sirva/puedan aprender algo,&amp;nbsp; y para cualquier duda o sugerencia comenten :D. Si esta entrada o alguna otra del blog te ha servido comparte el enlace del blog para que &lt;strike&gt;me ayudes a conquistar el mundo&lt;/strike&gt; el conocimiento llegue a otras personas que también lo necesitamos. Saludos, nos vemos!!!!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;span style=&quot;background-color: #fff2cc;&quot;&gt;&lt;a href=&quot;http://www.mediafire.com/?96blhvzyalgaheu&quot;&gt;el código fuente completo y demás cosas acá&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/1083790602823694382/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/10/how-to-cambiar-iconos-de-los.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/1083790602823694382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/1083790602823694382'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/10/how-to-cambiar-iconos-de-los.html' title='How to: Change JInternalFrame Icons // Cambiar iconos de los JInternalFrame (maximizar, cerrar, minimizar)'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-68FRbKnTcwY/TqnJKy6MsWI/AAAAAAAAARE/ER6wHXm5Zpk/s72-c/L.png" height="72" width="72"/><thr:total>3</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-7592594109452934481</id><published>2011-10-21T14:13:00.000-07:00</published><updated>2011-12-25T10:06:32.012-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jinternalframe"/><category scheme="http://www.blogger.com/atom/ns#" term="MDI"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>Abrir JInternalFrame desde otro JInternalFrame</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Hola como respuesta a un comentario &lt;a href=&quot;http://gnuteam.blogspot.com/2011/08/abrir-solo-un-jinternalframe-por.html&quot;&gt;en esta entrada&lt;/a&gt; &lt;strike&gt;(por fin alguien comenta en el blog xD)&lt;/strike&gt; . veremos (justo lo que solicitan e indica el titulo de la entrada)&lt;br /&gt;Crearemos 3 Clases.(&lt;b&gt;LafMain.java, JIF.java, JIF2.java&lt;/b&gt;)&lt;br /&gt;el codigo de JIF2.java no lo escribo porque es un JinternalFrame vacio :D&lt;br /&gt;&lt;br /&gt;Si necesitan o quieren ver como crear un menú pueden entrar&lt;a href=&quot;http://gnuteam.blogspot.com/2011/10/how-to-crear-menu-desde-xml-en-java.html&quot;&gt; acá&lt;/a&gt; o &lt;a href=&quot;http://gnuteam.blogspot.com/2011/08/abrir-solo-un-jinternalframe-por.html&quot;&gt;acá&lt;/a&gt; :D&lt;br /&gt;la clase principal:&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;import java.awt.BorderLayout;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import javax.swing.JDesktopPane;&lt;br /&gt;import javax.swing.JInternalFrame;&lt;br /&gt;import javax.swing.JMenu;&lt;br /&gt;import javax.swing.JMenuItem;&lt;br /&gt;import javax.swing.UIManager;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class LaFMain extends javax.swing.JFrame {&lt;br /&gt;&lt;br /&gt;    private JMenuBar menu = new JMenuBar();&lt;br /&gt;    private JMenu action = new JMenu(&quot;Action&quot;);&lt;br /&gt;    private JMenuItem actionItem = new JMenuItem(&quot;perform Action&quot;);&lt;br /&gt;    private static JDesktopPane jDesktopPane = new JDesktopPane();&lt;br /&gt;    private static McLaFNimbus mcLaFNimbus;&lt;br /&gt;&lt;br /&gt;    public LaFMain() {&lt;br /&gt;        initComponents();&lt;br /&gt;        setVisible(true);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void initComponents() {&lt;br /&gt;        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;        setSize(600, 400);&lt;br /&gt;        setLayout(new BorderLayout());&lt;br /&gt;        actionItem.addActionListener(getListener());&lt;br /&gt;        action.add(actionItem);&lt;br /&gt;        menu.add(action);&lt;br /&gt;        getContentPane().add(menu, BorderLayout.NORTH);&lt;br /&gt;        getContentPane().add(jDesktopPane, BorderLayout.CENTER);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private ActionListener getListener() {&lt;br /&gt;        return new ActionListener() {&lt;br /&gt;&lt;br /&gt;            public void actionPerformed(ActionEvent e) {&lt;br /&gt;                JIF jIF = new JIF();&lt;br /&gt;                jIF.setVisible(true);&lt;br /&gt;                jDesktopPane.add(jIF);&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static JDesktopPane getjDesktopPane() {&lt;br /&gt;        return jDesktopPane;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        new LaFMain();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class validador {&lt;br /&gt;&lt;br /&gt;    public static HashMap&amp;lt;String, JInternalFrame&amp;gt; jIframes = new HashMap&amp;lt;String, JInternalFrame&amp;gt;();&lt;br /&gt;&lt;br /&gt;    public static void addJIframe(String key, JInternalFrame jiframe) {&lt;br /&gt;        jIframes.put(key, jiframe);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static JInternalFrame getJInternalFrame(String key) {&lt;br /&gt;        return jIframes.get(key);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Listo, un JFrame bastante sencillo, con una barra de menú en la parte superior y en el centro un JDesktopPane (tipo statico debido que el método que lo retorna es estatico).&lt;br /&gt;ahora crearemos JInternalFrame que llamara a otro JInternalFrame (el diseño con la ayuda del IDE NetBeans) y el listener del boton.&lt;br /&gt;la clase en cuestion:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import javax.swing.JInternalFrame;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class JIF extends javax.swing.JInternalFrame {&lt;br /&gt;&lt;br /&gt;    /** Creates new form JIF */&lt;br /&gt;    public JIF() {&lt;br /&gt;        setTitle(&quot;TITULO&quot;);&lt;br /&gt;        initComponents();&lt;br /&gt;        jButton1.addActionListener(getButtonActionListener());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private ActionListener getButtonActionListener(){&lt;br /&gt;        return new ActionListener(){&lt;br /&gt;&lt;br /&gt;            public void actionPerformed(ActionEvent e) {&lt;br /&gt;                JInternalFrame ji = validador.getJInternalFrame(JIF2.class.getName());&lt;br /&gt;                if(ji == null || ji.isClosed()){&lt;br /&gt;                    ji = new JIF2();&lt;br /&gt;                    LaFMain.getjDesktopPane().add(ji);&lt;br /&gt;                    validador.addJIframe(JIF2.class.getName(), ji);&lt;br /&gt;                }&lt;br /&gt;                ji.setVisible(true);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;    /*Codigo del diseño Generado por Netbeans*/&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;y esto seria el resultado:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-Dl2tptIFkPA/TqHfmuZV6GI/AAAAAAAAAQw/HN7VvyRbazY/s1600/openJIFfromJIF.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;404&quot; src=&quot;http://4.bp.blogspot.com/-Dl2tptIFkPA/TqHfmuZV6GI/AAAAAAAAAQw/HN7VvyRbazY/s640/openJIFfromJIF.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/7592594109452934481/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/10/abrir-jinternalframe-desde-otro.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/7592594109452934481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/7592594109452934481'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/10/abrir-jinternalframe-desde-otro.html' title='Abrir JInternalFrame desde otro JInternalFrame'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Dl2tptIFkPA/TqHfmuZV6GI/AAAAAAAAAQw/HN7VvyRbazY/s72-c/openJIFfromJIF.png" height="72" width="72"/><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-5776536023833889118</id><published>2011-10-12T08:18:00.000-07:00</published><updated>2011-12-25T10:06:32.006-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="listeners"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><category scheme="http://www.blogger.com/atom/ns#" term="xml"/><title type='text'>How To: Create Dinamic menu from XML file Java // Crear menu dinamico desde XML en Java</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Hola a todos, ahora lo que vamos a ver es como generar un menú y sus opciones hijas desde un xml, esto desde mi humilde punto de vista es bastante útil, dado que estar generando el menú desde código en java lleva mucho tiempo, y si queremos agregar otra opción al menú, se tienen que hacer demasiados cambios al código; con esto no quiero decir que con esta forma que veremos a continuación no se tiene que cambiar nada cuando se quiera cambiar la estructura del código, pero si los cambios son mínimos y el esfuerzo también.&lt;br /&gt;&lt;br /&gt;Para empezar veremos el resultado final (para que se animen mas a seguir leyendo ^^).&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-0YxAG3BF6IU/TpWdJHQy3lI/AAAAAAAAAQg/MFOm6WQAidk/s1600/jXmlMenu2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://2.bp.blogspot.com/-0YxAG3BF6IU/TpWdJHQy3lI/AAAAAAAAAQg/MFOm6WQAidk/s320/jXmlMenu2.png&quot; width=&quot;314&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;y la otra opción de menú:&lt;/div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-FmGg6RKshCQ/TpWdJTdVbZI/AAAAAAAAAQk/ZwmdkvdmJR4/s1600/jXmlMenu1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;256&quot; src=&quot;http://3.bp.blogspot.com/-FmGg6RKshCQ/TpWdJTdVbZI/AAAAAAAAAQk/ZwmdkvdmJR4/s400/jXmlMenu1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Como podemos ver en la segunda imagen, el menú puede tener tantas opciones anidadas como nosotros deseemos.&lt;br /&gt;Ahora veremos la estructura en el xml:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush : xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;menu itemLabel=&quot;McCuboMenu&quot; key=&quot;null&quot;&amp;gt;&lt;br /&gt;    &amp;lt;node itemLabel=&quot;File&quot; key=&quot;file&quot; icon=&quot;src/CustomJMenuXML/resources/default.png&quot;&amp;gt;&lt;br /&gt;        &amp;lt;leaf itemLabel=&quot;Save&quot; key=&quot;file.save&quot; icon=&quot;src/CustomJMenuXML/resources/save_as.png&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;node itemLabel=&quot;Save As...&quot; key=&quot;file.save.as&quot; icon=&quot;src/CustomJMenuXML/resources/save_as.png&quot; &amp;gt;&lt;br /&gt;            &amp;lt;leaf itemLabel=&quot;PDF&quot; key=&quot;file.save.as.pdf&quot; icon=&quot;src/CustomJMenuXML/resources/pdf_format.png&quot; /&amp;gt;&lt;br /&gt;            &amp;lt;leaf itemLabel=&quot;HTML&quot; key=&quot;file.save.as.html&quot; icon=&quot;src/CustomJMenuXML/resources/html_format.png&quot; /&amp;gt;&lt;br /&gt;            &amp;lt;leaf itemLabel=&quot;PPT&quot; key=&quot;file.save.as.ppt&quot; icon=&quot;src/CustomJMenuXML/resources/ppt_format.png&quot; /&amp;gt;&lt;br /&gt;            &amp;lt;leaf itemLabel=&quot;XLS&quot; key=&quot;file.save.as.xls&quot; icon=&quot;src/CustomJMenuXML/resources/xls_format.png&quot; /&amp;gt;&lt;br /&gt;            &amp;lt;node itemLabel=&quot;Other&quot; key=&quot;file.format.other&quot; icon=&quot;src/CustomJMenuXML/resources/default.png&quot;&amp;gt;&lt;br /&gt;                &amp;lt;leaf itemLabel=&quot;LXDE&quot; key=&quot;file.format.other.lxde&quot; icon=&quot;src/CustomJMenuXML/resources/default.png&quot; /&amp;gt;&lt;br /&gt;                &amp;lt;node itemLabel=&quot;Other&quot; key=&quot;file.format.other&quot; icon=&quot;src/CustomJMenuXML/resources/default.png&quot;&amp;gt;&lt;br /&gt;                    &amp;lt;leaf itemLabel=&quot;Other_Other&quot; key=&quot;file.format.other.other_other&quot; icon=&quot;src/CustomJMenuXML/resources/default.png&quot; /&amp;gt;&lt;br /&gt;                &amp;lt;/node&amp;gt;&lt;br /&gt;            &amp;lt;/node&amp;gt;&lt;br /&gt;        &amp;lt;/node&amp;gt;&lt;br /&gt;    &amp;lt;/node&amp;gt;&lt;br /&gt;    &amp;lt;node itemLabel=&quot;O.S and Apps&quot; key=&quot;os.app&quot; icon=&quot;src/CustomJMenuXML/resources/windows.png&quot;&amp;gt;&lt;br /&gt;        &amp;lt;leaf itemLabel=&quot;Compiz Fusion&quot; key=&quot;os.app.fusion&quot; icon=&quot;src/CustomJMenuXML/resources/fusion.png&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;leaf itemLabel=&quot;Chrome&quot; key=&quot;os.app.chrome&quot; icon=&quot;src/CustomJMenuXML/resources/chrome.png&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;node itemLabel=&quot;Debian&quot; key=&quot;os.app.debian&quot; icon=&quot;src/CustomJMenuXML/resources/debian.png&quot; &amp;gt;&lt;br /&gt;            &amp;lt;leaf itemLabel=&quot;Stable&quot; key=&quot;os.app.debian.stable&quot; icon=&quot;src/CustomJMenuXML/resources/default.png&quot; /&amp;gt;&lt;br /&gt;            &amp;lt;leaf itemLabel=&quot;Testing&quot; key=&quot;os.app.debian.testing&quot; icon=&quot;src/CustomJMenuXML/resources/default.png&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;/node&amp;gt;&lt;br /&gt;    &amp;lt;/node&amp;gt;&lt;br /&gt;&amp;lt;/menu&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;ese archivo lo guardaremos como &lt;b&gt;menuDefinition.xml, &lt;/b&gt;como pueden apreciar ese xml no tiene&lt;a href=&quot;http://es.wikipedia.org/wiki/Definici%C3%B3n_de_tipo_de_documento&quot;&gt; DTD &lt;/a&gt;, por motivos de tiempo x). pero seria bueno que ustedes si lo aplicaran x).&lt;br /&gt;&lt;br /&gt;La estructura del xml es sencilla, los elementos &lt;i&gt;node, &lt;/i&gt;son aquellos elementos que tienen mas elementos dentro (osea son un menú contenedor) y los elementos &lt;i&gt;leaf &lt;/i&gt;son los elementos de ultimo nivel.&lt;br /&gt;Cada elemento de la definición del menú tiene los siguientes atributos:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;itemLabel: texto que mostrara dicho elemento en el menú.&lt;/li&gt;&lt;li&gt;key: identificador del elemento (trataremos que este sea único)&lt;/li&gt;&lt;li&gt;icon: icono del elemento. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;La primera clase que crearemos será &lt;i&gt;ImageUtils.java&lt;/i&gt; dicha clase tendrá un método estático el cual nos retornara una imagen re dimensionada para poder incluirla en el elemento del menú.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;package CustomJMenuXML.source;&lt;br /&gt;&lt;br /&gt;import java.awt.Image;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class ImageUtils {&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     *&lt;br /&gt;     * @param URL direccion de la imagen dentro del proyecto&lt;br /&gt;     * @return una Imagen redimensionada a 16 x 16&lt;br /&gt;     */&lt;br /&gt;    public static ImageIcon getScaledImage(String URL){&lt;br /&gt;        ImageIcon sourceIcon = new ImageIcon(URL);&lt;br /&gt;        ImageIcon scaledIcon = new ImageIcon(sourceIcon.getImage().getScaledInstance(16, 16, Image.SCALE_DEFAULT));&lt;br /&gt;        return scaledIcon;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;ahora crearemos una clase que extienda de &lt;i&gt;javax.swing.JMenu&lt;/i&gt; y la nombraremos &lt;b&gt;CustomJMenu.java&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;package CustomJMenuXML.source;&lt;br /&gt;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class CustomJMenu extends javax.swing.JMenu{&lt;br /&gt;&lt;br /&gt;    private String label;&lt;br /&gt;    private ImageIcon icon;&lt;br /&gt;&lt;br /&gt;    public CustomJMenu(String label, ImageIcon icon) {&lt;br /&gt;        super(label);&lt;br /&gt;        this.label = label;&lt;br /&gt;        this.icon = icon;&lt;br /&gt;        setIcon(this.icon);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;En realidad no era necesario crear esta clase, el único motivo por el cual la he creado es para crearle un constructor al JMenu en el cual reciba como parámetro el icono del elemento y no tener que estar llamando al método &lt;i&gt;setIcon(ImageIcon)&lt;/i&gt; cada vez que se crea un nuevo elemento de menú. pero bueno, ustedes valoraran si como se les sea mas útil ^^&lt;br /&gt;&lt;br /&gt;Ahora, no estoy del todo seguro que esta sea la mejor forma de agregarle los &lt;i&gt;ActionListener&lt;/i&gt; a cada uno de los elementos del menú, así que cualquier observación o sugerencia para realizar esta tarea de una forma mas efectiva, lo agradecería. igual encontré formas que eran menos ... no se, estéticas o eficientes x) así que mejor he decidido implementar la forma que se me ocurrió x).&lt;br /&gt;Crearemos una clase que extienda de &lt;i&gt;javax.swing.JMenuItem &lt;/i&gt;y que implemente &lt;i&gt;java.awt.event.ActionListener&lt;/i&gt; esa clase la llamaremos &lt;b&gt;CustomJMenuItem.java&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;package CustomJMenuXML.source;&lt;br /&gt;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class CustomJMenuItem extends javax.swing.JMenuItem implements java.awt.event.ActionListener {&lt;br /&gt;&lt;br /&gt;    private String key;&lt;br /&gt;&lt;br /&gt;    public CustomJMenuItem(String label, ImageIcon icon, String key) {&lt;br /&gt;        super(label, icon);&lt;br /&gt;        this.key = key;&lt;br /&gt;        addActionListener(getActionListener());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private ActionListener getActionListener() {&lt;br /&gt;        return this;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void actionPerformed(java.awt.event.ActionEvent e) {&lt;br /&gt;        if (key.equals(&quot;os.app.chrome&quot;)) {&lt;br /&gt;            System.out.println(&quot;os.app.chrome&quot;);&lt;br /&gt;        }&lt;br /&gt;        /*&lt;br /&gt;         * aqui todos los IF para cada una de las opciones del menu, por eso&lt;br /&gt;         * digo que no es muy eficiente este metodo, muchos IF, pero ni modo xD&lt;br /&gt;         */&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;y por ultimo, creamos lo que será la barra de menú de nuestra aplicación. extendemos una clase de &lt;i&gt;javax.swing.JMenuBar&lt;/i&gt; y la llamamos &lt;b&gt;CustomXMLMenu.java&lt;/b&gt;. dicha clase deberá quedarnos así:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;package CustomJMenuXML.source;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import javax.swing.JMenuBar;&lt;br /&gt;import javax.xml.parsers.DocumentBuilder;&lt;br /&gt;import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;import org.w3c.dom.Document;&lt;br /&gt;import org.w3c.dom.Element;&lt;br /&gt;import org.w3c.dom.Node;&lt;br /&gt;import org.w3c.dom.NodeList;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; * @version 0.5.1&lt;br /&gt; */&lt;br /&gt;public class CustomXMLMenu extends JMenuBar {&lt;br /&gt;&lt;br /&gt;    private Document document;&lt;br /&gt;&lt;br /&gt;    public CustomXMLMenu() {&lt;br /&gt;        try {&lt;br /&gt;            Document doc = null;&lt;br /&gt;            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();&lt;br /&gt;            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();&lt;br /&gt;            doc = docBuilder.parse(getClass().getResourceAsStream(&quot;menuDefinition.xml&quot;));&lt;br /&gt;            doc.normalize();&lt;br /&gt;            this.document = doc;&lt;br /&gt;            Element root = getRoot();&lt;br /&gt;            for (Element element : getChildList(root)) {&lt;br /&gt;                CustomJMenu customJMenu = new CustomJMenu(element.getAttribute(&quot;itemLabel&quot;), ImageUtils.getScaledImage(element.getAttribute(&quot;icon&quot;)));&lt;br /&gt;                addChildsToNode(customJMenu, getChildList(element));&lt;br /&gt;                add(customJMenu);&lt;br /&gt;            }&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;            System.out.println(ex.toString());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void addChildsToNode(CustomJMenu menu, List&amp;lt;element&amp;gt; childList) {&lt;br /&gt;        for (Element element : childList) {&lt;br /&gt;            if (!getChildList(element).isEmpty()) {&lt;br /&gt;                CustomJMenu customJMenu = new CustomJMenu(element.getAttribute(&quot;itemLabel&quot;), ImageUtils.getScaledImage(element.getAttribute(&quot;icon&quot;)));&lt;br /&gt;                addChildsToNode(customJMenu, getChildList(element));&lt;br /&gt;                menu.add(customJMenu);&lt;br /&gt;            } else {&lt;br /&gt;                String label = element.getAttribute(&quot;itemLabel&quot;);&lt;br /&gt;                String key = element.getAttribute(&quot;key&quot;);&lt;br /&gt;                CustomJMenuItem jMenuItem = new CustomJMenuItem(label, ImageUtils.getScaledImage(element.getAttribute(&quot;icon&quot;)), key);&lt;br /&gt;                menu.add(jMenuItem);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private Element getRoot() {&lt;br /&gt;        if (document == null) {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;        List&amp;lt;element&amp;gt; list = getChildList(document);&lt;br /&gt;        if (list.size() &amp;gt; 0) {&lt;br /&gt;            return list.get(0);&lt;br /&gt;        }&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private List&amp;lt;element&amp;gt; getChildList(Node node) {&lt;br /&gt;        List&amp;lt;element&amp;gt; list = new ArrayList&amp;lt;element&amp;gt;();&lt;br /&gt;        NodeList nodeList = node.getChildNodes();&lt;br /&gt;        for (int i = 0; i &amp;lt; nodeList.getLength(); i++) {&lt;br /&gt;            if (nodeList.item(i).getNodeType() == Node.ELEMENT_NODE) {&lt;br /&gt;                list.add((Element) nodeList.item(i));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return list;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;eso seria todo para crear nuestra barra de menú. ahora simplemente la agregamos a nuestra aplicación, creando una instancia de esta y agregándola al contenedor. asii:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;package CustomJMenuXML.source;&lt;br /&gt;&lt;br /&gt;import java.awt.BorderLayout;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; * @version 0.7.6&lt;br /&gt; */&lt;br /&gt;public class JMenuXMLMain extends javax.swing.JFrame {&lt;br /&gt;&lt;br /&gt;    private CustomXMLMenu menu = new CustomXMLMenu();&lt;br /&gt;&lt;br /&gt;    public JMenuXMLMain() {&lt;br /&gt;        initComponents();&lt;br /&gt;        setVisible(true);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void initComponents() {&lt;br /&gt;        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;        setLayout(new BorderLayout());&lt;br /&gt;        setSize(new Dimension(300, 350));&lt;br /&gt;        getContentPane().add(menu, BorderLayout.NORTH);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        new JMenuXMLMain();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Como podemos ver, el código &lt;i&gt;Java&lt;/i&gt; permanece mas legible que si creáramos el menú desde este archivo.&lt;br /&gt;&lt;br /&gt;Espero que te sirva, puedas compartir con alguien que lo necesite, simplemente aprender del código y, porque no, mejorarlo y mandármelo ya corregido xD (no, no es broma).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.mediafire.com/?1luy45x2r182u80&quot; style=&quot;background-color: #fff2cc;&quot;&gt;Link de descarga de la aplicacion completa&lt;/a&gt;&lt;br /&gt;Nos vemos a la próxima, y saludos!&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/5776536023833889118/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/10/how-to-crear-menu-desde-xml-en-java.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/5776536023833889118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/5776536023833889118'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/10/how-to-crear-menu-desde-xml-en-java.html' title='How To: Create Dinamic menu from XML file Java // Crear menu dinamico desde XML en Java'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-0YxAG3BF6IU/TpWdJHQy3lI/AAAAAAAAAQg/MFOm6WQAidk/s72-c/jXmlMenu2.png" height="72" width="72"/><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-1299783474701940194</id><published>2011-10-11T07:06:00.000-07:00</published><updated>2011-10-11T07:07:44.291-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="debian"/><category scheme="http://www.blogger.com/atom/ns#" term="eyecandy"/><category scheme="http://www.blogger.com/atom/ns#" term="Gnu/linux"/><category scheme="http://www.blogger.com/atom/ns#" term="kde"/><title type='text'>Debian tambien es atractivo para el usuario final</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;mmm Hola :D, pues después de algún tiempo de no publicar algo relacionado directamente con el O.S Gnu/Linux, pues quiero volver a darle continuidad a compartir y hacer ver las ventajas que un sistema operativo de ideología libre te puede ofrecer, pues la foto de ahora, quiero dar a demostrar que Gnu/Linux no es esto:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-mm2eG-SCoNE/TpO87Ztx75I/AAAAAAAAAQA/WctRGkm2JOU/s1600/terminator-consola-gnome.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;380&quot; src=&quot;http://4.bp.blogspot.com/-mm2eG-SCoNE/TpO87Ztx75I/AAAAAAAAAQA/WctRGkm2JOU/s640/terminator-consola-gnome.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;sino que puede ser esto (siempre que el usuario lo desee):&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-qdrKxTZfUko/TpPBF9wSckI/AAAAAAAAAQY/jKvT868eEeo/s1600/debianOct1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;374&quot; src=&quot;http://4.bp.blogspot.com/-qdrKxTZfUko/TpPBF9wSckI/AAAAAAAAAQY/jKvT868eEeo/s640/debianOct1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-302lIS3Ujg8/TpPBFeo9vYI/AAAAAAAAAQQ/rVnBFG26KjA/s1600/debianOct2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;374&quot; src=&quot;http://4.bp.blogspot.com/-302lIS3Ujg8/TpPBFeo9vYI/AAAAAAAAAQQ/rVnBFG26KjA/s640/debianOct2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;(y siempre con el apoyo de la poderosa terminal para tareas básicas, configuraciones, instalación o algún otro trabajito)&lt;br /&gt;&lt;br /&gt;y con la cuestión de los controladores, wireless, vídeo, audio, cámara web integrada, lectores de tarjetas SD, puertos USB, etc. de todo eso lo unico que tuve que buscar información (alrededor de 15 minutos) fue para la tarjeta de red inalámbrica, que gracias a que la corporación que fabrica los chip ha liberado los drivers, instalar los drivers fue mas facil que decir &quot;tres tristes tigres comían trigo entres tristes platos&quot;... bueno eso es un poco difícil la verdad xD pero instalar los drivers no lo fue tanto, se los aseguro.&lt;br /&gt;Los demás dispositivos Debian los instalo perfecta mente desde un inicio. Bonito Debian no? :D&lt;br /&gt;&lt;br /&gt;Con eso lo que quiero decir es que cuando el software libre recibe apoyo de las grandes corporaciones de Hardware. cada vez Debian y las otras distribuciones basadas en Gnu/Linux serán mas faciles de usar/configurar :D.&lt;br /&gt;&lt;br /&gt;y con lo de la estabilidad rendimiento, mmm pues no me quejo, corre rapido y fluido con unas pocas aplicaciones ejecutandose (tampoco se puede hacer milagros con una mini-laptop con recursos super limitados)... aunque pensandolo bien, instalando un gestor de escritorio mas liviano; como fluxbox (que tambien es bonito), esta pequeña maquina no tendria que envidiar a ninguna dual Core :D...pero me gusta KDE x) asi que sacrificare un poco el rendimiento por el buen estilo que brinda este maravilloso entorno :D&lt;br /&gt;&lt;br /&gt;Bueno con este pequeño aporte espero que mas de alguno se anime a instalar Debian (no en VirtualBox o VMWare ) en cualquiera de sus ramas (Stable. Testing o SID) dependera &amp;nbsp;tus gustos; tutoriales hay infinidad en la red, por lo tanto no saturare la red con otro mas indicando como instalar o que paquetes son equivalentes a otros en sistemas windows.&lt;br /&gt;&lt;br /&gt;Ahora bien, espero aportar algunos tips/trucos desde consola y por el momento eso es todo :D espero animarlo y a comprender que el software libre es mas que software que no requiere del pago de una licencia para poder usarlo, sino mas bien, el software libre es todo un mundo de libertad en el cual tus conocimentos pueden ampliarse enormemente con la ayuda de la comunidad de usuarios que sin animos de lucro brindan ayuda a todos nosotros que nos vamos iniciando en este gran sistema.&lt;br /&gt;Llevo alrederor de 3 o 4 años usando Gnu/Linux Debian, para diferentes propositos,pero para cada uno de los propositos me ha funcionado mas que perfecto. no me canso de invitarte a probarlo y que le des tiempo para que se pueda encariñar x). y cuando eso pase :D ya no necesitaras un Dual Boot para tener windows.&lt;br /&gt;&lt;br /&gt;Saludos a todos aquellos que leen esto desde un S.O Libre :D y para aquellos que se animaran a tenerlo en sus Pc&#39;s. Saludos y que la pasen genial :D&lt;br /&gt;hasta el proximo post. :D&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/1299783474701940194/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/10/debian-tambien-es-atractivo-para-el.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/1299783474701940194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/1299783474701940194'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/10/debian-tambien-es-atractivo-para-el.html' title='Debian tambien es atractivo para el usuario final'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-mm2eG-SCoNE/TpO87Ztx75I/AAAAAAAAAQA/WctRGkm2JOU/s72-c/terminator-consola-gnome.png" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-6687215614337973135</id><published>2011-10-07T14:23:00.000-07:00</published><updated>2011-12-25T10:06:32.010-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="Jtree"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><category scheme="http://www.blogger.com/atom/ns#" term="xml"/><title type='text'>HOW TO: Llenar Swing Jtree con archivo XML</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Hola a todos :). espero la estén pasando genial; y si no es así, almenos que no la estén pasando mal x).&lt;br /&gt;Ahora pienso compartir algo que a mi parecer es muy útil (almenos en su debido momento me sirvió mucho) y es llenar un un Jtree desde un archivo xml. bueno, iniciemos entonces :D&lt;br /&gt;&lt;br /&gt;Para empezar vamos a crear una sencilla clase que se llamará &lt;b&gt;XMLTreeNode.java&lt;/b&gt;, dicha clase solo poseerá una propiedad &lt;i&gt;Element&lt;/i&gt; (dicho tipo (interface que extiende de &lt;i&gt;&lt;b&gt;Node&lt;/b&gt;&lt;/i&gt;) representa un elemento &lt;strike&gt;un poco obvio no?&lt;/strike&gt; &lt;strike&gt;xD&lt;/strike&gt; en un documento HTML o XML, para nuestro caso un xml), un método &lt;b&gt;getElement()&lt;/b&gt; que nos devuelve la propiedad, el método &lt;b&gt;toString()&lt;/b&gt; (obviamente sobre escrito) y un método &lt;b&gt;getKey()&lt;/b&gt;, entenderemos su uso a medida avancemos con la lectura. Quedando el código de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package CustomJtreeXML;&lt;br /&gt;&lt;br /&gt;import org.w3c.dom.Element;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; * @version 0.9&lt;br /&gt; */&lt;br /&gt;public class XMLTreeNode {&lt;br /&gt;&lt;br /&gt;    private Element element;&lt;br /&gt;&lt;br /&gt;    public XMLTreeNode(Element element) {&lt;br /&gt;        this.element = element;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String toString() {&lt;br /&gt;        return element.getAttribute(&quot;NodeLabel&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Element getElement() {&lt;br /&gt;        return element;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getKey() {&lt;br /&gt;        return element.getAttribute(&quot;key&quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Ahora crearemos otra clase, la cual llamaremos &lt;b&gt;XMLTreeModel.java&lt;/b&gt;, la cual implementará la interface &lt;b&gt;TreeModel&lt;/b&gt;, una vez hecho esto, implementamos los métodos de dicha interface y nuestras clase se deberia ver algo asi:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package CustomJtreeXML;&lt;br /&gt;&lt;br /&gt;import javax.swing.event.TreeModelListener;&lt;br /&gt;import javax.swing.tree.TreeModel;&lt;br /&gt;import javax.swing.tree.TreePath;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class XMLTreeModel implements TreeModel{&lt;br /&gt;&lt;br /&gt;    public Object getRoot() {&lt;br /&gt;        throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Object getChild(Object parent, int index) {&lt;br /&gt;        throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getChildCount(Object parent) {&lt;br /&gt;        throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isLeaf(Object node) {&lt;br /&gt;        throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void valueForPathChanged(TreePath path, Object newValue) {&lt;br /&gt;        throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getIndexOfChild(Object parent, Object child) {&lt;br /&gt;        throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void addTreeModelListener(TreeModelListener l) {&lt;br /&gt;        throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void removeTreeModelListener(TreeModelListener l) {&lt;br /&gt;        throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Por el momento nada del otro mundo todo ese código, simplemente la implementación de los métodos que proporciona la interface.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Implementamos los métodos&amp;nbsp;la interface (y claro esta) agregamos métodos propios para darle mayor funcionamiento a la clase, y nuestra clase debería de verse de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;package CustomJtreeXML;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.logging.Level;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;import javax.swing.event.TreeModelEvent;&lt;br /&gt;import javax.swing.event.TreeModelListener;&lt;br /&gt;import javax.swing.tree.TreeModel;&lt;br /&gt;import javax.swing.tree.TreePath;&lt;br /&gt;import javax.xml.parsers.DocumentBuilder;&lt;br /&gt;import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;import javax.xml.parsers.ParserConfigurationException;&lt;br /&gt;import org.w3c.dom.Document;&lt;br /&gt;import org.w3c.dom.Element;&lt;br /&gt;import org.w3c.dom.Node;&lt;br /&gt;import org.w3c.dom.NodeList;&lt;br /&gt;import org.xml.sax.SAXException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class XMLTreeModel implements TreeModel {&lt;br /&gt;&lt;br /&gt;    private Document document;&lt;br /&gt;    private List&amp;lt;TreeModelListener&amp;gt; listeners = new ArrayList&amp;lt;TreeModelListener&amp;gt;();&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     *&lt;br /&gt;     * @param xmlDoc nombre del documento xml a leer&lt;br /&gt;     */&lt;br /&gt;    public void readDocument(String xmlDoc) {&lt;br /&gt;        Document doc = null;&lt;br /&gt;        try {&lt;br /&gt;            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();&lt;br /&gt;            DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();&lt;br /&gt;            doc = docBuilder.parse(getClass().getResourceAsStream(xmlDoc));&lt;br /&gt;            doc.normalize();&lt;br /&gt;            this.document = doc;&lt;br /&gt;            TreeModelEvent evt = new TreeModelEvent(this, new TreePath(getRoot()));&lt;br /&gt;            for (TreeModelListener listener : listeners) {&lt;br /&gt;                listener.treeStructureChanged(evt);&lt;br /&gt;            }&lt;br /&gt;        } catch (ParserConfigurationException ex) {&lt;br /&gt;            Logger.getLogger(XMLTreeMain.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        } catch (SAXException ex) {&lt;br /&gt;            Logger.getLogger(XMLTreeMain.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        } catch (IOException ex) {&lt;br /&gt;            Logger.getLogger(XMLTreeMain.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    public void addTreeModelListener(TreeModelListener listener) {&lt;br /&gt;        if (!listeners.contains(listener)) {&lt;br /&gt;            listeners.add(listener);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void removeTreeModelListener(TreeModelListener listener) {&lt;br /&gt;        listeners.remove(listener);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Object getChild(Object parent, int index) {&lt;br /&gt;        if (parent instanceof XMLTreeNode) {&lt;br /&gt;            List&amp;lt;Element&amp;gt; elements = getChildElements(((XMLTreeNode) parent).getElement());&lt;br /&gt;            return new XMLTreeNode(elements.get(index));&lt;br /&gt;        } else {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getChildCount(Object parent) {&lt;br /&gt;        if (parent instanceof XMLTreeNode) {&lt;br /&gt;            List&amp;lt;Element&amp;gt; elements = getChildElements(((XMLTreeNode) parent).getElement());&lt;br /&gt;            return elements.size();&lt;br /&gt;        }&lt;br /&gt;        return 0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getIndexOfChild(Object parent, Object child) {&lt;br /&gt;        if (parent instanceof XMLTreeNode &amp;amp;&amp;amp; child instanceof XMLTreeNode) {&lt;br /&gt;            Element pElement = ((XMLTreeNode) parent).getElement();&lt;br /&gt;            Element cElement = ((XMLTreeNode) child).getElement();&lt;br /&gt;            if (cElement.getParentNode() != pElement) {&lt;br /&gt;                return -1;&lt;br /&gt;            }&lt;br /&gt;            List&amp;lt;Element&amp;gt; elements = getChildElements(pElement);&lt;br /&gt;            return elements.indexOf(cElement);&lt;br /&gt;        }&lt;br /&gt;        return -1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Object getRoot() {&lt;br /&gt;        if (document == null) {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;        List&amp;lt;Element&amp;gt; elements = getChildElements(document);&lt;br /&gt;        if (elements.size() &amp;gt; 0) {&lt;br /&gt;            return new XMLTreeNode(elements.get(0));&lt;br /&gt;        } else {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isLeaf(Object node) {&lt;br /&gt;        if (node instanceof XMLTreeNode) {&lt;br /&gt;            Element element = ((XMLTreeNode) node).getElement();&lt;br /&gt;            List&amp;lt;Element&amp;gt; elements = getChildElements(element);&lt;br /&gt;            return elements.isEmpty();&lt;br /&gt;        } else {&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void valueForPathChanged(TreePath path, Object newValue) {&lt;br /&gt;        //not used&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     *&lt;br /&gt;     * @param node Elemento del cual necesitamos obtener sus elementos hijos&lt;br /&gt;     * @return Lista de elementos hijos del nodo especificado&lt;br /&gt;     */&lt;br /&gt;    private List&amp;lt;Element&amp;gt; getChildElements(Node node) {&lt;br /&gt;        List&amp;lt;Element&amp;gt; elements = new ArrayList&amp;lt;Element&amp;gt;();&lt;br /&gt;        NodeList list = node.getChildNodes();&lt;br /&gt;        for (int i = 0; i &amp;lt; list.getLength(); i++) {&lt;br /&gt;            if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {&lt;br /&gt;                elements.add((Element) list.item(i));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return elements;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Por ultimo solo tenemos que crear una clase que extienda de &lt;i&gt;javax.swing.Jtree. &lt;/i&gt;Esa clase la llamaremos XMLTree y su codigo seria algo asi:&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;package CustomJtreeXML;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class XMLTree extends javax.swing.JTree {&lt;br /&gt;&lt;br /&gt;    private XMLTreeModel xMLTreeModel;&lt;br /&gt;&lt;br /&gt;    public XMLTree() {&lt;br /&gt;        super();&lt;br /&gt;        xMLTreeModel = new XMLTreeModel();&lt;br /&gt;        setModel(xMLTreeModel);&lt;br /&gt;        setEditable(false);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public XMLTreeNode getSelectedNode() {&lt;br /&gt;        if (getSelectionPath() != null) {&lt;br /&gt;            return (XMLTreeNode) getSelectionPath().getLastPathComponent();&lt;br /&gt;        }&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     *&lt;br /&gt;     * @return Lista de Nodos los cuales tienen el foco&lt;br /&gt;     */&lt;br /&gt;    public List&amp;lt;XMLTreeNode&amp;gt; getSelectedNodes() {&lt;br /&gt;        List&amp;lt;XMLTreeNode&amp;gt; selectedNodes = new ArrayList&amp;lt;XMLTreeNode&amp;gt;();&lt;br /&gt;        TreePath[] selectionPaths = getSelectionPaths();&lt;br /&gt;        for (TreePath treePath : selectionPaths) {&lt;br /&gt;            if (treePath.getLastPathComponent() instanceof XMLTreeNode) {&lt;br /&gt;                XMLTreeNode node = (XMLTreeNode) treePath.getLastPathComponent();&lt;br /&gt;                selectedNodes.add(node);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return selectedNodes;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void addTreeListener(javax.swing.event.TreeSelectionListener aListener) {&lt;br /&gt;        addTreeSelectionListener(aListener);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public XMLTreeModel getModel() {&lt;br /&gt;        return xMLTreeModel;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Ahora, si usas &lt;a href=&quot;http://netbeans.org/&quot;&gt;NetBeans&lt;/a&gt;, compila el proyecto y agregalo(XMLTree) a la paleta de componentes y ya :D. pero como me falta como 2 horas para salir del trabajo, vamos a crear un ejemplo sencillo de como implementarlo. para esto crearemos una clase llamada &lt;b&gt;XMLTreeMain.java. &lt;/b&gt;La cual nos quedara asi:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : java&quot;&gt;package CustomJtreeXML;&lt;br /&gt;&lt;br /&gt;import java.awt.BorderLayout;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import javax.swing.JButton;&lt;br /&gt;import javax.swing.event.TreeSelectionEvent;&lt;br /&gt;import javax.swing.event.TreeSelectionListener;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class XMLTreeMain extends javax.swing.JFrame {&lt;br /&gt;&lt;br /&gt;    private XMLTree xMLTree;&lt;br /&gt;    private JButton button = new JButton(&quot;getValue&quot;);&lt;br /&gt;&lt;br /&gt;    public XMLTreeMain() {&lt;br /&gt;        super(&quot;TreeXML&quot;);&lt;br /&gt;        initComponents();&lt;br /&gt;        setVisible(true);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void initComponents() {&lt;br /&gt;        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;        setLayout(new BorderLayout());&lt;br /&gt;        setSize(new Dimension(300, 250));&lt;br /&gt;        xMLTree = new XMLTree();&lt;br /&gt;        xMLTree.getModel().readDocument(&quot;demo.xml&quot;);&lt;br /&gt;        xMLTree.addTreeListener(treeListener());&lt;br /&gt;        button.addActionListener(buttonListener());&lt;br /&gt;        getContentPane().add(xMLTree, BorderLayout.CENTER);&lt;br /&gt;        getContentPane().add(button, BorderLayout.SOUTH);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private ActionListener buttonListener() {&lt;br /&gt;        return new ActionListener() {&lt;br /&gt;&lt;br /&gt;            public void actionPerformed(ActionEvent e) {&lt;br /&gt;                System.out.println(xMLTree.getSelectedNode().getKey());&lt;br /&gt;                for (XMLTreeNode xMLTreeNode : xMLTree.getSelectedNodes()) {&lt;br /&gt;                    System.out.println(xMLTreeNode.getKey());&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private TreeSelectionListener treeListener() {&lt;br /&gt;        return new TreeSelectionListener() {&lt;br /&gt;&lt;br /&gt;            public void valueChanged(TreeSelectionEvent e) {&lt;br /&gt;                Object lastPathComponent = e.getPath().getLastPathComponent();&lt;br /&gt;                if (lastPathComponent instanceof XMLTreeNode) {&lt;br /&gt;                    XMLTreeNode selectedNode = (XMLTreeNode) lastPathComponent;&lt;br /&gt;                    System.out.println(&quot;node selected = &quot; + selectedNode.getKey());&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        new XMLTreeMain();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;ahhh y por ultimo la estructura del archivo xml (demo.xml) en mi caso es asi: &lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush : xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&lt;br /&gt;&amp;lt;root NodeLabel=&quot;root&quot; key=&quot;&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;node NodeLabel=&quot;A&quot; key=&quot;&quot;&amp;gt;&lt;br /&gt;  	&amp;lt;node NodeLabel=&quot;AA&quot; key=&quot;1NodeChild.A&quot;&amp;gt;&lt;br /&gt;		&amp;lt;entry NodeLabel=&quot;AAA&quot; key=&quot;1NodeChild.Aa&quot; /&amp;gt;&lt;br /&gt;	&amp;lt;/node&amp;gt;&lt;br /&gt;  	&amp;lt;entry NodeLabel=&quot;AB&quot; key=&quot;2NodeChild.A&quot; /&amp;gt;&lt;br /&gt;	&amp;lt;entry NodeLabel=&quot;AC&quot; key=&quot;3NodeChild.A&quot; /&amp;gt;&lt;br /&gt;	&amp;lt;entry NodeLabel=&quot;AD&quot; key=&quot;4NodeChild.A&quot; /&amp;gt;&lt;br /&gt;  &amp;lt;/node&amp;gt;&lt;br /&gt;   &amp;lt;node NodeLabel=&quot;B&quot; key=&quot;&quot;&amp;gt;&lt;br /&gt;  	&amp;lt;entry NodeLabel=&quot;BA&quot; key=&quot;1NodeChild.B&quot; /&amp;gt;&lt;br /&gt;  	&amp;lt;entry NodeLabel=&quot;BB&quot; key=&quot;2NodeChild.B&quot; /&amp;gt;&lt;br /&gt;	&amp;lt;entry NodeLabel=&quot;BC&quot; key=&quot;3NodeChild.B&quot; /&amp;gt;&lt;br /&gt;	&amp;lt;entry NodeLabel=&quot;BD&quot; key=&quot;4NodeChild.B&quot; /&amp;gt;&lt;br /&gt;  &amp;lt;/node&amp;gt;&lt;br /&gt;  &amp;lt;node NodeLabel=&quot;C&quot; key=&quot;&quot;&amp;gt;&lt;br /&gt;  	&amp;lt;entry NodeLabel=&quot;CA&quot; key=&quot;1NodeChild.C&quot; /&amp;gt;&lt;br /&gt;  	&amp;lt;entry NodeLabel=&quot;CB&quot; key=&quot;2NodeChild.C&quot; /&amp;gt;&lt;br /&gt;	&amp;lt;entry NodeLabel=&quot;CC&quot; key=&quot;3NodeChild.C&quot; /&amp;gt;&lt;br /&gt;	&amp;lt;entry NodeLabel=&quot;CD&quot; key=&quot;4NodeChild.C&quot; /&amp;gt;&lt;br /&gt;  &amp;lt;/node&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Bueno eso es todo por este post :D. espero al alguien en algun universo paralelo le sirva xD. solo una cuestion mas, el .xml debe estar en la misma carpeta y mismo nivel o inferior al que el TreeModel. dejo un enlace de descarga del projecto por alguna duda... sin mas que agregar.. nos vemos :-)&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.mediafire.com/?21boo74c2i49xjc&quot;&gt;&lt;span style=&quot;background-color: #fff2cc;&quot;&gt;Enlace de Descarga&lt;/span&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/6687215614337973135/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/10/how-to-jtree-xml.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/6687215614337973135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/6687215614337973135'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/10/how-to-jtree-xml.html' title='HOW TO: Llenar Swing Jtree con archivo XML'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-5760362481357968838</id><published>2011-09-06T14:48:00.000-07:00</published><updated>2011-12-25T10:06:32.004-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eyecandy"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jinternalframe"/><category scheme="http://www.blogger.com/atom/ns#" term="MDI"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>HOW TO: JDesktopPane Background Image, JInternalFrame Transparent Title Bar</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Hey hola a todos :) mas de alguna vez hemos querido darle un aspecto un poco mas vistoso a nuestras aplicaciones Swing en Java, ademas de eso, como todos sabemos algunos Look and Feel nos ayudan bastante (como el caso de Nimbus), pero aun asi, no estamos conforme con el resultado final.&lt;br /&gt;Entonces supongamos que nuestra aplicacion se mira asi:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-PxgDxaaLUJk/TmaK6Qse2SI/AAAAAAAAAO0/4t2-hZra4tY/s1600/transparent_before.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;385&quot; src=&quot;http://2.bp.blogspot.com/-PxgDxaaLUJk/TmaK6Qse2SI/AAAAAAAAAO0/4t2-hZra4tY/s640/transparent_before.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ummmm... la verdad, por muy bueno que sea el funcionamiento de la aplicacion no deja de ser un poco &quot;aburrida&quot; para el usuario final (al cual casi siempre le gusta ver que las pantallas tengas fuegos artificiales).&lt;br /&gt;Obviamente no puedo hacer que las pantallas tengas dichos efectos x) pero almenos vamos a mejorar su aspecto haciendo la barra de titulo transparentes y una imagen de fondo a la pantalla principal. quedando el resultado final:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-CHhCU8Huv9o/TmaMdnfBWiI/AAAAAAAAAO4/J_Y52Z6caHY/s1600/transparent_after.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;433&quot; src=&quot;http://3.bp.blogspot.com/-CHhCU8Huv9o/TmaMdnfBWiI/AAAAAAAAAO4/J_Y52Z6caHY/s640/transparent_after.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Bueno ahora es el momento indicado para decir: &quot;&lt;i&gt;No es lo que estoy buscando!!! esto no me sirve&lt;/i&gt;&quot; y hacer clic en el icono de la flecha de &quot;&lt;i&gt;go back&lt;/i&gt;&quot; de tu navegador x).&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok, si aun estas leyendo significa que tu piensas que el siguiente código puede ser de utilidad en alguna aplicación que estes desarrollando, asi que empecemos.&lt;br /&gt;&lt;br /&gt;Voy empezar explicando como se logra la transparencia en los JInternalFrame. en verdad es muy sencillo y simple como crear una subclase de JInternalFrame y sobre-escribir el método &lt;i&gt;&lt;b&gt;paintComponent.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Entonces&lt;i&gt;&lt;b&gt; &lt;/b&gt;&lt;/i&gt;nuestras clase queda de la siguiente manera: &lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package NEW.newpackage;&lt;br /&gt;&lt;br /&gt;import java.awt.Color;&lt;br /&gt;import java.awt.Graphics;&lt;br /&gt;import javax.swing.Icon;&lt;br /&gt;import javax.swing.JInternalFrame;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; * @version 1.0&lt;br /&gt; * @website http://www.gnuteam.blogspot.com&lt;br /&gt; */&lt;br /&gt;public class CustomInternalFrame extends JInternalFrame{&lt;br /&gt;&lt;br /&gt;    public CustomInternalFrame(String title) {&lt;br /&gt;        super(title, true, true, true, true);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setIcon(Icon anIcon){&lt;br /&gt;        setFrameIcon(anIcon);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @Override&lt;br /&gt;    protected void paintComponent(Graphics g) {&lt;br /&gt;        g.setColor(new Color(100, 0, 4, 85));&lt;br /&gt;        g.fillRoundRect(0, 0, getWidth(), getHeight(), 15, 15);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Como dije anteriormente, bastante sencillo, ahora lo único que debemos hacer es crear clases que extiendan de &lt;i&gt;CustomInternalFrame&lt;/i&gt; y agregarlas el JDesktopPane de nuestra aplicación ^^.&lt;br /&gt;&lt;br /&gt;Ahora crearemos una clase que implemente la interfaz &lt;i&gt;Border&lt;/i&gt;, dicha clase le indicamos la ruta del archivo a cargar como fondo e implementamos los metodos que la interfaz requiere. quedando dicha clase de la siguente manera:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package NEW.newpackage;&lt;br /&gt;&lt;br /&gt;import java.awt.Component;&lt;br /&gt;import java.awt.Graphics;&lt;br /&gt;import java.awt.Insets;&lt;br /&gt;import java.awt.image.BufferedImage;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import javax.imageio.ImageIO;&lt;br /&gt;import javax.swing.border.Border;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class BackgroundImage implements Border{&lt;br /&gt;    public BufferedImage back;&lt;br /&gt;&lt;br /&gt;    public BackgroundImage(){&lt;br /&gt;        try {&lt;br /&gt;            URL imagePath = new URL(getClass().getResource(&quot;../resources/logo_backup.png&quot;).toString());&lt;br /&gt;            back = ImageIO.read(imagePath);&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {&lt;br /&gt;        g.drawImage(back, (x + (width - back.getWidth())/2),(y + (height - back.getHeight())/2), null);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Insets getBorderInsets(Component c) {&lt;br /&gt;        return new Insets(0,0,0,0);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isBorderOpaque() {&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Ahora un ejemplo de la clase principal podria ser:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package NEW.newpackage;&lt;br /&gt;&lt;br /&gt;import java.awt.BorderLayout;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;import javax.swing.JDesktopPane;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.UIManager;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; * @version 1.0&lt;br /&gt; * @website http://www.gnuteam.blogspot.com&lt;br /&gt; */&lt;br /&gt;public class MainFrame extends JFrame {&lt;br /&gt;&lt;br /&gt;    private JDesktopPane jdesktopPane = new JDesktopPane();&lt;br /&gt;&lt;br /&gt;    public MainFrame() {&lt;br /&gt;        try {&lt;br /&gt;            UIManager.setLookAndFeel(&quot;com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel&quot;);&lt;br /&gt;            setSize(new Dimension(500, 300));&lt;br /&gt;            setIconImage(new ImageIcon(&quot;src/NEW/newpackage/icon.png&quot;).getImage());&lt;br /&gt;            setLayout(new BorderLayout());&lt;br /&gt;            CustomJInternalFrame1 customInternalFrame = new CustomJInternalFrame1();&lt;br /&gt;            jdesktopPane.add(customInternalFrame);&lt;br /&gt;            CustomJInternalFrame1 customInternalFrame1 = new CustomJInternalFrame1();&lt;br /&gt;            jdesktopPane.add(customInternalFrame1);            &lt;br /&gt;            add(jdesktopPane, BorderLayout.CENTER);&lt;br /&gt;            customInternalFrame1.setVisible(true);&lt;br /&gt;            customInternalFrame.setVisible(true);&lt;br /&gt;            //Aca indicamos la clase con la imagen de fondo&lt;br /&gt;            jdesktopPane.setBorder(new BackgroundImage());&lt;br /&gt;            setVisible(true);&lt;br /&gt;            setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;            System.out.println(ex);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        new MainFrame();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Implementando esas clases el resultado final seria parecido al de la segunda imagen de esta entrada.&lt;br /&gt;Solamente unos puntos que debo aclarar: la barra transparente solo la he probado con el Look and Feel de Nimbus y con el de Java de defecto, y resulta todo bien con Nimbus :D.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background-color: #fff2cc; color: black;&quot;&gt;&lt;i&gt;Por alguna duda en el código, dejo el proyecto completo en este enlace&lt;/i&gt;:&lt;a href=&quot;http://www.mediafire.com/?4s8k5v3d515f9ry&quot;&gt; Descargar Proyecto&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Espero te sirva aunque sea una linea de todo el código acá presentado, no olvides de suscribirte o hacerte seguidor del blog/twitter para saber cuando se publiquen nuevas entradas.&lt;br /&gt;Hasta la próxima, Saludos!!!&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/5760362481357968838/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/09/how-to-jinternalframe-barra-de-titulo.html#comment-form' title='26 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/5760362481357968838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/5760362481357968838'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/09/how-to-jinternalframe-barra-de-titulo.html' title='HOW TO: JDesktopPane Background Image, JInternalFrame Transparent Title Bar'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-PxgDxaaLUJk/TmaK6Qse2SI/AAAAAAAAAO0/4t2-hZra4tY/s72-c/transparent_before.png" height="72" width="72"/><thr:total>26</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-7623173530801226591</id><published>2011-09-02T11:12:00.000-07:00</published><updated>2011-12-30T16:33:54.407-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jcombobox"/><category scheme="http://www.blogger.com/atom/ns#" term="listeners"/><category scheme="http://www.blogger.com/atom/ns#" term="popup"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>HOW TO: resize jcombobox popup // redimensionar popup de un JCombobox</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div&gt;Hola a todos. si sueles programar en java, o al menos lo intentas (como es mi caso xD),&amp;nbsp; mas de alguna ocasión has creado una aplicación de escritorio usando las &lt;a href=&quot;http://es.wikipedia.org/wiki/Java_Foundation_Classes&quot;&gt;JFC &lt;/a&gt;para crear tu &lt;a href=&quot;http://es.wikipedia.org/wiki/Interfaz_gr%C3%A1fica_de_usuario&quot;&gt;GUI&lt;/a&gt;. si es así, quizá es bastante posible que hallas usado un JCombobox que se llena desde la base de datos (con información la cual no sabemos la longitud que posee).&lt;br /&gt;&lt;br /&gt;cuando este caso se presenta pueden ocurrir los siguientes problemas o complicaciones del diseño:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt; El objecto no muestra su texto completo, dejando incompleta la información que necesitamos mostrar en el JCombobox&lt;/li&gt;&lt;li&gt;El componente (JCombobox) se auto-re dimensiona al ancho del objeto con el texto mas extenso... cuando esto sucede, es bastante común que el componente desordene otros componentes que están ubicados cerca de el, obligándonos a re diseñar o re ubicar algunos componentes en dicha pantalla; lo cual implica tiempo, tiempo que lo podríamos estar usando para avanzar en otras pantallas del sistema o... simplemente para navegar por Internet ^^&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;un ejemplo ilustrado del terrible problema:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-7Z-L-An1Nco/TmEax9YLzRI/AAAAAAAAAOs/_z5iTAePCbI/s1600/popupcombo1.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;184&quot; src=&quot;http://4.bp.blogspot.com/-7Z-L-An1Nco/TmEax9YLzRI/AAAAAAAAAOs/_z5iTAePCbI/s320/popupcombo1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b style=&quot;background-color: #fff2cc;&quot;&gt;EDITO: debido a un problema con algunas versiones de jdk lanza un Null Pointer; al final de la entrada agrego un metodo alternativo para lograr el mismo objetivo.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Bueno para solucionar dichos problemas vamos a crear una clase que implemente la interfaz &lt;i&gt;PopupMenuListener&lt;/i&gt; la cual va a &lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;hps&quot;&gt; cambiar&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;los límites (ancho) del&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;menú&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;emergente&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;para proveer al &lt;/span&gt;&lt;span class=&quot;hps&quot;&gt;JComboBox&lt;/span&gt;&lt;span class=&quot;hps&quot;&gt; algunas funcionalidades diferentes. entre las cuales:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;hps&quot;&gt;la ventana emergente&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;puede&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;ser más amplio que&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;el JCombobox&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;hps&quot;&gt;la ventana emergente&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;se&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;muestra&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;por encima del JCombobox (&lt;i&gt;útil cuando el componente esta ubicado al fondo de la pantalla y las opciones que desplegara son bastantes, evitando así que las opciones ultimas de la lista no sean visibles&lt;/i&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;hps&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;hps&quot;&gt;La clase la llamaremos CustomPopupMenuListener.java, así que empecemos :D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;hps&quot;&gt;&lt;b&gt;primero lo primero: crear la clase, implementar la interfaz y sus métodos (comentamos el codigo de los metodos -&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;i&gt;throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;/i&gt;-&lt;br /&gt;&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;hps&quot;&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;es&quot;&gt;&lt;span class=&quot;hps&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package resources.test;&lt;br /&gt;&lt;br /&gt;import javax.swing.event.PopupMenuEvent;&lt;br /&gt;import javax.swing.event.PopupMenuListener;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class CustomPopupMenuListener implements PopupMenuListener{&lt;br /&gt;&lt;br /&gt;    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {&lt;br /&gt;        //throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {&lt;br /&gt;        //throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void popupMenuCanceled(PopupMenuEvent e) {&lt;br /&gt;        //throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;} &lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Luego creamos las propiedades de la clase: dos tipo boolean , un constructor el cual reciba como parámetros esas propiedades y los respectivos getters y setters de las dos propiedades&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package resources.test;&lt;br /&gt;&lt;br /&gt;import javax.swing.event.PopupMenuEvent;&lt;br /&gt;import javax.swing.event.PopupMenuListener;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class CustomPopupMenuListener implements PopupMenuListener{&lt;br /&gt;&lt;br /&gt;    private boolean popupWider;&lt;br /&gt;    private boolean popupAbove;&lt;br /&gt;&lt;br /&gt;    public CustomPopupMenuListener(boolean popupWider, boolean popupAbove) {&lt;br /&gt;        this.popupWider = popupWider;&lt;br /&gt;        this.popupAbove = popupAbove;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isPopupAbove() {&lt;br /&gt;        return popupAbove;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setPopupAbove(boolean popupAbove) {&lt;br /&gt;        this.popupAbove = popupAbove;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isPopupWider() {&lt;br /&gt;        return popupWider;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setPopupWider(boolean popupWider) {&lt;br /&gt;        this.popupWider = popupWider;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {&lt;br /&gt;        //throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {&lt;br /&gt;        //throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void popupMenuCanceled(PopupMenuEvent e) {&lt;br /&gt;       //throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Ahora la parte que nos interesa mas, dando funcionalidad al método&lt;i&gt; popupMenuWillBecomeVisible, &lt;/i&gt;método el cual es invocado justo en el momento antes que se va a desplegar la lista de elementos del JCombobox, quedando el codigo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package resources.test;&lt;br /&gt;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;import java.awt.Point;&lt;br /&gt;import javax.swing.JComboBox;&lt;br /&gt;import javax.swing.JList;&lt;br /&gt;import javax.swing.JScrollBar;&lt;br /&gt;import javax.swing.JScrollPane;&lt;br /&gt;import javax.swing.SwingUtilities;&lt;br /&gt;import javax.swing.event.PopupMenuEvent;&lt;br /&gt;import javax.swing.event.PopupMenuListener;&lt;br /&gt;import javax.swing.plaf.basic.BasicComboPopup;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author McCubo&lt;br /&gt; */&lt;br /&gt;public class CustomPopupMenuListener implements PopupMenuListener {&lt;br /&gt;&lt;br /&gt;    private boolean popupWider;&lt;br /&gt;    private boolean popupAbove;&lt;br /&gt;&lt;br /&gt;    public CustomPopupMenuListener(boolean popupWider, boolean popupAbove) {&lt;br /&gt;        this.popupWider = popupWider;&lt;br /&gt;        this.popupAbove = popupAbove;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isPopupAbove() {&lt;br /&gt;        return popupAbove;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setPopupAbove(boolean popupAbove) {&lt;br /&gt;        this.popupAbove = popupAbove;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isPopupWider() {&lt;br /&gt;        return popupWider;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setPopupWider(boolean popupWider) {&lt;br /&gt;        this.popupWider = popupWider;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {&lt;br /&gt;        JComboBox comboBox = (JComboBox) e.getSource();&lt;br /&gt;        if (comboBox.getItemCount() == 0) {&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;        Object child = comboBox.getAccessibleContext().getAccessibleChild(0);&lt;br /&gt;        if (child instanceof BasicComboPopup) {&lt;br /&gt;            if (popupAbove) {&lt;br /&gt;                popupAbove((BasicComboPopup) child);&lt;br /&gt;            }&lt;br /&gt;            if (popupWider) {&lt;br /&gt;                popupWider((BasicComboPopup) child);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void popupAbove(BasicComboPopup popup) {&lt;br /&gt;        Point parent = popup.getInvoker().getLocationOnScreen();&lt;br /&gt;        int height = popup.getPreferredSize().height;&lt;br /&gt;        popup.setLocation(parent.x, parent.y - height);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void popupWider(BasicComboPopup popup) {&lt;br /&gt;        JList list = popup.getList();&lt;br /&gt;        JScrollPane scrollPane = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, list);&lt;br /&gt;        // se suma el valor de la barra de desplazamiento vertical al ancho que tomara el popup, de lo contrario, la barra vertical oculta&lt;br /&gt;        // una porcion del item mas largo&lt;br /&gt;        int popupWidth = list.getPreferredSize().width + 5 + getScrollBarWidth(popup, scrollPane);&lt;br /&gt;        Dimension scrollPaneSize = scrollPane.getPreferredSize();&lt;br /&gt;        popupWidth = Math.max(popupWidth, scrollPaneSize.width);&lt;br /&gt;        scrollPaneSize.width = popupWidth;&lt;br /&gt;        scrollPane.setPreferredSize(scrollPaneSize);&lt;br /&gt;        scrollPane.setMaximumSize(scrollPaneSize);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @return el valor de la barra de desplazamiento vertical (si es que esta es visible)&lt;br /&gt;     */&lt;br /&gt;    private int getScrollBarWidth(BasicComboPopup popup, JScrollPane scrollPane) {&lt;br /&gt;        int scrollBarWidth = 0;&lt;br /&gt;        JComboBox comboBox = (JComboBox) popup.getInvoker();&lt;br /&gt;        if (comboBox.getItemCount() &amp;gt; comboBox.getMaximumRowCount()) {&lt;br /&gt;            JScrollBar vertical = scrollPane.getVerticalScrollBar();&lt;br /&gt;            scrollBarWidth = vertical.getPreferredSize().width;&lt;br /&gt;        }&lt;br /&gt;        return scrollBarWidth;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {&lt;br /&gt;        //throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void popupMenuCanceled(PopupMenuEvent e) {&lt;br /&gt;        //throw new UnsupportedOperationException(&quot;Not supported yet.&quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;El código es un poco sencillo, pero el resultado que obtenemos ayuda bastante. para aplicarlo a un combobox en nuestra aplicacion, seria de la siguente manera:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;       jComboBox1.addPopupMenuListener(new CustomPopupMenuListener(true, true));&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Opcion #2. (si el método anterior arroja un Null Pointer Exception)&lt;br /&gt;Creamos una clase que descienda de JCombobox y sobreescribimos 2 metodos. el codigo deberia quedar asi: &lt;br /&gt;&lt;div&gt;&lt;pre class=&quot;brush: java&quot;&gt;import javax.swing.*; &lt;br /&gt;import java.awt.*; &lt;br /&gt;import java.util.Vector; &lt;br /&gt; &lt;br /&gt;public class CustomJCombobox extends JComboBox{ &lt;br /&gt; &lt;br /&gt;    public CustomJCombobox() { &lt;br /&gt;    } &lt;br /&gt; &lt;br /&gt;    private boolean layingOut = false; &lt;br /&gt;    // Sobreescribimos este Metodo :)&lt;br /&gt;    public void doLayout(){ &lt;br /&gt;        try{ &lt;br /&gt;            layingOut = true; &lt;br /&gt;            super.doLayout(); &lt;br /&gt;        }finally{ &lt;br /&gt;            layingOut = false; &lt;br /&gt;        } &lt;br /&gt;    } &lt;br /&gt;    // Tambien sobreescribimos este otro metodo :D&lt;br /&gt;    public Dimension getSize(){ &lt;br /&gt;        Dimension dim = super.getSize(); &lt;br /&gt;        if(!layingOut) &lt;br /&gt;            dim.width = Math.max(dim.width, getPreferredSize().width); &lt;br /&gt;        return dim; &lt;br /&gt;    } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;y el resultado seria algo asi usando cualquiera de las dos opciones:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-oua9tZnsAuM/TmEayLlZKGI/AAAAAAAAAOw/dg0R5DuPnLU/s1600/popupcombo2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;153&quot; src=&quot;http://1.bp.blogspot.com/-oua9tZnsAuM/TmEayLlZKGI/AAAAAAAAAOw/dg0R5DuPnLU/s320/popupcombo2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;el popup se mustra sobre el combo por el segundo boolean que se le pasa al constructor, de lo contrario se mostraria bajo el combo ;)&lt;br /&gt;Espero este pequeño aporte les pueda servir :D&lt;br /&gt;Saludos!&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/7623173530801226591/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/09/change-width-of-jcombobox-dropdown-list.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/7623173530801226591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/7623173530801226591'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/09/change-width-of-jcombobox-dropdown-list.html' title='HOW TO: resize jcombobox popup // redimensionar popup de un JCombobox'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-7Z-L-An1Nco/TmEax9YLzRI/AAAAAAAAAOs/_z5iTAePCbI/s72-c/popupcombo1.png" height="72" width="72"/><thr:total>7</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-904406680686828430</id><published>2011-08-12T13:45:00.000-07:00</published><updated>2011-12-25T10:06:32.016-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jinternalframe"/><category scheme="http://www.blogger.com/atom/ns#" term="MDI"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>Abrir solo un JinternalFrame por instancia en una Aplicación MDI // Allow only one JinternalFrame per Instance in a MDI app.</title><content type='html'>&lt;script src=&quot;http://java.com/js/deployJava.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Para lograr este objetivo existen muchas maneras (como toda cosa en la vida) de lograrlo, pero como mi conocimiento es muy limitado no conozco todas esas maneras x). asi que solamente alcanzaremos ese objetivo mediante 3 formas:&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt; &lt;/span&gt;Patron Singleton&lt;/li&gt; &lt;li&gt;&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&lt;/span&gt;Utilizando HashMap y una clase de utilidad&lt;/li&gt; &lt;li&gt;&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&lt;/span&gt;Haciendo modal el JinternalFrame &lt;/li&gt; &lt;/ol&gt;&lt;div class=&quot;MsoNormal&quot;&gt;A mi parecer la mas eficiente y eficaz (Nose cual es la diferencia entre esas dos palabras pero suena como que si en verdad se lo que estoy hablando xD) de las opciones es la #2. Pero mi intencion no es obligar a nadie a usar &amp;nbsp;simplemente las opciones que a mi me gustan, sino mas bien, ampliar el conocimiento de cómo podemos alcanzar el mismo objetivo mediante diferentes medios. &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;La estructura de estos ejercicios (para mayor claridad) sera: un solo proyecto, el cual tendra 3 Opciones en la barra de menu, en cada opcion se desarrollara cada una de las formas.&amp;nbsp;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;mainFrame.java&lt;/div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package Clases;&lt;br /&gt;&lt;br /&gt;import java.awt.BorderLayout;&lt;br /&gt;import java.awt.Color;&lt;br /&gt;import java.awt.Dimension;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import java.beans.PropertyVetoException;&lt;br /&gt;import java.lang.reflect.Constructor;&lt;br /&gt;import java.util.logging.Level;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;import javax.swing.JDesktopPane;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;import javax.swing.JInternalFrame;&lt;br /&gt;import javax.swing.JMenu;&lt;br /&gt;import javax.swing.JMenuBar;&lt;br /&gt;import javax.swing.JMenuItem;&lt;br /&gt;&lt;br /&gt;// author McCubo&lt;br /&gt;public class mainFrame extends JFrame{&lt;br /&gt;&lt;br /&gt;    private JDesktopPane desktopPane;&lt;br /&gt;    private JMenuBar menuBar;&lt;br /&gt;    private JMenu menuSingleton;&lt;br /&gt;    private JMenu menuHashMap;&lt;br /&gt;    private JMenu menuModal;&lt;br /&gt;    private JMenuItem optionSingleton;&lt;br /&gt;    private JMenuItem optionHashMap;&lt;br /&gt;    private JMenuItem optionModal;&lt;br /&gt;&lt;br /&gt;    public mainFrame() {&lt;br /&gt;        super(&quot;SingletonPack&quot;);&lt;br /&gt;        initComponents();&lt;br /&gt;        initMenuListeners();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void initComponents(){&lt;br /&gt;        setDefaultCloseOperation(EXIT_ON_CLOSE);        &lt;br /&gt;        setSize(new Dimension(800, 500));&lt;br /&gt;        setLocationRelativeTo(null);&lt;br /&gt;        setBackground(Color.WHITE);&lt;br /&gt;        setLayout(new BorderLayout());&lt;br /&gt;        desktopPane = new JDesktopPane();&lt;br /&gt;        // setDragMode sirve para indicarle en que forma se visualizaran los JInternalFrames dentro del Componente&lt;br /&gt;        // OUTLINE_DRAG_MODE: solo se visualiza el borde de los JInternalFrame&lt;br /&gt;        desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);&lt;br /&gt;        menuBar = new JMenuBar();&lt;br /&gt;        menuSingleton = new JMenu(&quot;Singleton&quot;);&lt;br /&gt;        menuHashMap = new JMenu(&quot;HashMap&quot;);&lt;br /&gt;        menuModal = new JMenu(&quot;Modal&quot;);&lt;br /&gt;        //Creando los Item de los Menu&lt;br /&gt;        optionSingleton = new JMenuItem(&quot;Abrir&quot;, new ImageIcon(&quot;recursos/gamepad.png&quot;));&lt;br /&gt;        optionHashMap = new JMenuItem(&quot;Abrir&quot;, new ImageIcon(&quot;recursos/img.jpg&quot;));&lt;br /&gt;        optionModal = new JMenuItem(&quot;Abrir&quot;, new ImageIcon(&quot;recursos/default.png&quot;));&lt;br /&gt;        // añadimos esos Items a su correspondiente Menu&lt;br /&gt;        menuSingleton.add(optionSingleton);&lt;br /&gt;        menuHashMap.add(optionHashMap);&lt;br /&gt;        menuModal.add(optionModal);&lt;br /&gt;        // añadimos los menus al MenuBar&lt;br /&gt;        menuBar.add(menuSingleton);&lt;br /&gt;        menuBar.add(menuHashMap);&lt;br /&gt;        menuBar.add(menuModal);&lt;br /&gt;        // El JMenuBar y JDesktopPane son agregados al JFrame&lt;br /&gt;        this.add(menuBar, BorderLayout.NORTH);&lt;br /&gt;        this.add(desktopPane, BorderLayout.CENTER);&lt;br /&gt;        setVisible(true);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void initMenuListeners(){&lt;br /&gt;        optionSingleton.addActionListener(new ActionListener() {&lt;br /&gt;&lt;br /&gt;            public void actionPerformed(ActionEvent e) {&lt;br /&gt;                try {&lt;br /&gt;                    // Obtenemos una instancia (Nueva o la que ya tenemos) de la clase OpcionSingleton&lt;br /&gt;                    OpcionSingleton instance = OpcionSingleton.getInstance();&lt;br /&gt;                    if(!instance.isVisible() &amp;amp;&amp;amp; !instance.isIcon()){&lt;br /&gt;                        // Si la instancia No esta visible y No esta Minimizada (osea que no existe dentro del MDI)&lt;br /&gt;                        // la agregamos al JDesktopPane&lt;br /&gt;                        desktopPane.add(instance);                        &lt;br /&gt;                    }&lt;br /&gt;                    instance.setVisible(true);&lt;br /&gt;                    instance.setIcon(false);&lt;br /&gt;                } catch (PropertyVetoException ex) {&lt;br /&gt;                    Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        optionHashMap.addActionListener(new ActionListener() {&lt;br /&gt;&lt;br /&gt;            public void actionPerformed(ActionEvent e) {&lt;br /&gt;                try {&lt;br /&gt;                     // Obtenemos el JInternalFrame que deseamos abrir, Null si no existe&lt;br /&gt;                    JInternalFrame jInternal = Util.getJInternal(OpcionHashMap.class.getName());&lt;br /&gt;                    if (jInternal == null || jInternal.isClosed()) {&lt;br /&gt;                         // Class.forName(OpcionHashMap.class.getName()) = Creamos una Nueva clase partiendo del Nombre, y de esa Clase&lt;br /&gt;                         // obtenemos el contructor .getConstructor() y le indicamos a que clase pertenece el parametro enviado, nuestro&lt;br /&gt;                         // caso un String.class&lt;br /&gt;                        Constructor constructor = (Class.forName(OpcionHashMap.class.getName())).getConstructor(String.class);&lt;br /&gt;                         // dado que nuestro constructor recibe como parametro un String, dicho parametro es enviado en&lt;br /&gt;                         // constructor.newInstance(&quot;Opcion del HashMap&quot;);&lt;br /&gt;                         // y hacemos el respectivo Cast al objecto que nos es retornado (JInternalFrame)&lt;br /&gt;                         //&lt;br /&gt;                        jInternal = (JInternalFrame) constructor.newInstance(&quot;Titulo del Opcion del HashMap desde mainFrame :O&quot;);&lt;br /&gt;                        desktopPane.add(jInternal);&lt;br /&gt;                         // agregamos el recien creado JInternalframe al HashMap de la clase Util&lt;br /&gt;                        Util.addJInternal(OpcionHashMap.class.getName(), jInternal);&lt;br /&gt;                    }&lt;br /&gt;                    jInternal.setVisible(true);&lt;br /&gt;                    jInternal.setIcon(false);                    &lt;br /&gt;                } catch (Exception ex) {&lt;br /&gt;                    Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        optionModal.addActionListener(new ActionListener() {&lt;br /&gt;&lt;br /&gt;            public void actionPerformed(ActionEvent e) {&lt;br /&gt;                OpcionModal opcionModal = new OpcionModal(mainFrame.this);&lt;br /&gt;                opcionModal.setVisible(true);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String ... args){&lt;br /&gt;        new mainFrame();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&amp;nbsp;&lt;/pre&gt;&lt;div&gt;Clase Util.java (necesaria para los el menu de HashMap)&lt;/div&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java&quot;&gt;package Clases;&lt;br /&gt;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import javax.swing.JInternalFrame;&lt;br /&gt;&lt;br /&gt; // @author McCubo&lt;br /&gt;public class Util {&lt;br /&gt;&lt;br /&gt;     // HashMap el cual almacenara el nombre de la clase y la ventana correspondiente a dicha clase&lt;br /&gt;    private static HashMap&amp;lt;String , JInternalFrame&amp;gt; JInternalMap = new HashMap&amp;lt;String , JInternalFrame&amp;gt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     // @param className Nombre de la clase que queremos Obtener&lt;br /&gt;     // @return si la className se encuentra en el set de Llaves del HashMap, entonces retorna&lt;br /&gt;     // el objeto correpondiente, de lo contrario retorna null&lt;br /&gt;&lt;br /&gt;    public static JInternalFrame getJInternal(String className){&lt;br /&gt;        return JInternalMap.get(className);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;     // @param className Nombre de la clase&lt;br /&gt;     // @param JInternal Objeto Correspondiente a esa clase    &lt;br /&gt;    public static void addJInternal(String className, JInternalFrame JInternal){&lt;br /&gt;        JInternalMap.put(className, JInternal);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Ahora la clase con patron Singleton&lt;br /&gt;Nota: &lt;small&gt;el diseño de los siguentes JInternalFrame lo hice con el &lt;a href=&quot;http://netbeans.org/&quot;&gt;IDE Netbeans&lt;/a&gt;, asi que el metodo &lt;b&gt;&lt;i&gt;initComponents&lt;/i&gt;&lt;/b&gt; y la declaracion de campos (JLabel, JTextFields, etc) no los presentos, debido a que es muy extenso. pero no importa mucho, ya que el proyecto esta en un zip al final de la entrada, so dont worry ;)&lt;/small&gt;&lt;/div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package Clases;&lt;br /&gt;&lt;br /&gt;// @author McCubo&lt;br /&gt;&lt;br /&gt;public class OpcionSingleton extends javax.swing.JInternalFrame {&lt;br /&gt;&lt;br /&gt;    private static OpcionSingleton frameOpcion1;&lt;br /&gt;&lt;br /&gt;     // si no se tiene ninguna instancia de esta clase O la instancia que poseemos&lt;br /&gt;     // el JInternalFrame esta cerrado, siendo asi retornamos una nueva instancia;&lt;br /&gt;     // caso contrario, retornamos la instancia que ya tenemos&lt;br /&gt;&lt;br /&gt;    public static OpcionSingleton getInstance() {&lt;br /&gt;        if (frameOpcion1 == null || frameOpcion1.isClosed) {&lt;br /&gt;            frameOpcion1 = new OpcionSingleton();&lt;br /&gt;        }&lt;br /&gt;        return frameOpcion1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Creates new form OpcionSingleton&lt;br /&gt;&lt;br /&gt;     // El Constructor debe ser privado para que ninguna clase pueda crear&lt;br /&gt;     // nuevas instancias directamente&lt;br /&gt;    private OpcionSingleton() {&lt;br /&gt;        initComponents();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void initComponents(){&lt;br /&gt;       // Codigo Generado por Netbeans&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   // Variables declaration - do not modify &lt;br /&gt;   // Mas Codigo Generado por NetBeans&lt;br /&gt;}// Fin de la Clase&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Ahora la Clase OpcionHashMap.java&lt;/div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package Clases;&lt;br /&gt;&lt;br /&gt;// @author McCubo&lt;br /&gt;&lt;br /&gt;public class OpcionHashMap extends javax.swing.JInternalFrame {&lt;br /&gt;&lt;br /&gt;    // Creates new form Opcion2&lt;br /&gt;    public OpcionHashMap(String tituloDelJinternal) {&lt;br /&gt;        initComponents();&lt;br /&gt;        setTitle(tituloDelJinternal);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void initComponents(){&lt;br /&gt;       // Codigo Generado por Netbeans&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   // Variables declaration - do not modify &lt;br /&gt;   // Mas Codigo Generado por NetBeans&lt;br /&gt;}// Fin de la Clase&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;y por ultimo (lo que dicen &quot;y por ultimo pero no menos importante es mentira&quot;)&lt;br /&gt;OpcionModal.java&lt;/div&gt;&lt;pre class=&quot;brush: java&quot;&gt;package Clases;&lt;br /&gt;&lt;br /&gt;import javax.swing.JDialog;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;&lt;br /&gt;// @author mcubias&lt;br /&gt;&lt;br /&gt;public class OpcionModal extends JDialog {&lt;br /&gt;&lt;br /&gt;    // Creates new form OpcionModal&lt;br /&gt;    public OpcionModal(JFrame mainFrame) {&lt;br /&gt;        super(mainFrame, &quot;Soy modal!!!&quot;, true);&lt;br /&gt;        initComponents();&lt;br /&gt;        setLocationRelativeTo(null);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void initComponents(){&lt;br /&gt;       // Codigo Generado por Netbeans&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   // Variables declaration - do not modify &lt;br /&gt;   // Mas Codigo Generado por NetBeans&lt;br /&gt;}// Fin de la Clase&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;Finalmente mi opinion &lt;strike&gt;Noooo Noo no dejes de leer por favor!!!!!&lt;/strike&gt; es que el patron singleton es bastante sencillo, muy comprensible y facil de implementar pero a todas las clases deberiamos agregarle el metodo &lt;i&gt;static&lt;/i&gt; que nos retorna la instancia de la clase... con el tiempo y entre mas grande sea la aplicacion, esas cuantas lineas se pueden llegar a convertir en muuuchas lineas extras de codigo.&lt;br /&gt;Mientras (como dije arriba) el HashMap me parece ideal, quiza un poco mas complejidad en el codigo pero, las clases que se llaman no se toca su estructura en ningun momento, asi que me parece bastante bueno usarlo, por muchas razones, la cantidad y tipo de parametro pueden variar entre cada clase que mandamos a llamar, y con ese metodo podemos facilmente adaptarlo para dicho funcionamiento (recibir distinto tipos y cantidad de parametros por constructor).&lt;br /&gt;&lt;br /&gt;Y Por ultimo: hacer modal la ventana. lo que debemos hacer es simplemente darle un extends de JDialog, enviarle el frame principal y en el parametro del constructor enviarle true para que sea modal... pros: facil de usar. (solo ese creo). contras: aveces necesitamos que la clase descienda de una clase que No se JDialog, y como bien sabemos, una clase solo puede extender de una clase a lo mucho, asi que ahi veriamos problemas, otro contra, en toda la aplicacion solo vas a poder tener una ventana abierta... poco funcinal creo. pero bueno ahi esta si la quieres implementar :D&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.mediafire.com/?j27odco7co6psoz&quot;&gt;Enlace descarga&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;Espero a alguien en el universo le sirva este ejemplo. Obviamente hay formas mucho mejores para la generacion de Menus en Java, generarlo desde un xml, tener una clase ListenerMenuXxx en lugar de tener todos los Listener en la misma clase, nose pueden haber infinitas mejores formas de hacerlo, pero mi objetivo ahora simplemente era mostrar y compartir algunas formas con las cuales es posible la implementar solo un JInternalFrame por instancia.&lt;br /&gt;asi que sin mucho mas que decir, Saludos!!!&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/904406680686828430/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/08/abrir-solo-un-jinternalframe-por.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/904406680686828430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/904406680686828430'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/08/abrir-solo-un-jinternalframe-por.html' title='Abrir solo un JinternalFrame por instancia en una Aplicación MDI // Allow only one JinternalFrame per Instance in a MDI app.'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><thr:total>4</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-2482938768792701404</id><published>2011-07-04T16:00:00.000-07:00</published><updated>2011-12-25T10:06:31.999-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jcombobox"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>Deshabilitar Opciones en JCombobox y de paso ponerle imagenes. parte II. // Disabling options on JComboBox</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bueno, como siempre trato de cumplir con lo que prometo, aca vamos a ver (basandonos en el articulo anterior) como terminar de codificar nuestro Jcombobox con imágenes y opciones deshabilitadas (la ultima quedo cubierta en el post anterior). Asi que lo que queda practicamente es setearle al combo un HashMap&lt;comboconimagenesyopciones, imageicon=&quot;&quot;&gt;, que quiere decir eso, que para cada opcion del combo solo tendra una imagen, y si por alguna razon la opcion se repite solo quedara con una imagen (un combo solamente puede tener una imagen asociada) vease &lt;a href=&quot;http://download.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.html&quot;&gt;http://download.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.html&lt;/a&gt; para mayor entendimiento :D&lt;/comboconimagenesyopciones,&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;bueno como dije al final del post anterior lo unico que haremos sera agregar un metodo AgregarImagenesAlCombo, y en el setRenderer al Componente (nuestro caso un Jlable) setearle el icon para el correspondiente Opcion del combo, al final el resultado de nuestras clases sera:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-AR1rwZ8y7Dk/ThJEXDlhFFI/AAAAAAAAAIg/rngGus1gk0w/s1600/combo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;175&quot; src=&quot;http://1.bp.blogspot.com/-AR1rwZ8y7Dk/ThJEXDlhFFI/AAAAAAAAAIg/rngGus1gk0w/s320/combo.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;he tratado de comentar lo mas posible el codigo para que sea, hasta cierto punto, autoexplicable (ya que me esta dando problemas el script de la sintaxis de java, me agrega codigo [parentesis, signos de igual, etc]), pero de tener alguna duda enviame un email o comenta en el blog y pues veremos como superamos las barreras. Anexo las tres clases en un .rar para que lo puedan correr….bueno eso es todo amigos!!!&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Espero que de una forma u otra te halla servido este pequeño ejemplo. Obviamente el correcto funcionamiento u optimizacion del mismo depende como tengas tu codigo :D&lt;br /&gt;&lt;br /&gt;Codigo Fuente:&lt;br /&gt;&lt;a href=&quot;http://www.mediafire.com/?81dqoa7t4dwbk9z&quot;&gt;http://www.mediafire.com/?81dqoa7t4dwbk9z&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Un pdf en el que trato de explicar con mayor profundidad algunos aspectos (incluye el codigo fuente en imagenes)&lt;br /&gt;&lt;a href=&quot;http://www.mediafire.com/?0q2pbq1joepm1z3&quot;&gt;http://www.mediafire.com/?0q2pbq1joepm1z3&lt;/a&gt;&lt;br /&gt;PD1: el pdf esta de lado x) pero solo rotenlo con el adobe reader o cualquier lector de pdf que utilicen&lt;br /&gt;PD2. Si tienen alguna duda referente al codigo seria bueno que se documenten un poco acerca de:&amp;nbsp; &lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/ListCellRenderer.html&quot;&gt;ListCellRenderer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://download.oracle.com/javase/1.4.2/docs/api/java/util/HashSet.html&quot;&gt;HashSet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://download.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.html&quot;&gt;HashMap&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://blog.hexacta.com/hat/iteradores-en-java/&quot;&gt;Iteradores&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/2482938768792701404/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/07/deshabilitar-opciones-en-jcombobox-y-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/2482938768792701404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/2482938768792701404'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/07/deshabilitar-opciones-en-jcombobox-y-de.html' title='Deshabilitar Opciones en JCombobox y de paso ponerle imagenes. parte II. // Disabling options on JComboBox'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-AR1rwZ8y7Dk/ThJEXDlhFFI/AAAAAAAAAIg/rngGus1gk0w/s72-c/combo.png" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-396118444630434604</id><published>2011-07-01T14:59:00.000-07:00</published><updated>2011-12-25T10:06:32.002-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jcombobox"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="swing"/><title type='text'>How to: Disable Options JCombobox // JComboBox con opciones deshabilitadas e imagenes // Disabling Options on JComboBox</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Woow mañana será un año desde mi última publicación en el post… Qué vergüenza x) pero por motivos de estudio y trabajo descontinué la publicación de artículos; No estoy seguro de cuantas personas son lectores frecuentes del blog, aunque espero que no sea el único *_* Bueno aunque si fuera el único si llego a sufrir de una amnesia profunda al menos voy a recordar que solía gustarme (eso si me recuerdo de la url del blog O.o) jajaja. También espero que de ahora en adelante pueda postear al menos un articulo cada semana o cada mes… pero no cada año como es el caso de este post x).&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bueno pues últimamente he estado un poco aprendiendo (o al menos tratando) un poco del extenso mundo de Java Swing, cosas como Objetos, Componente y Listeners, entre algunos mas. Pues en una de esas tardes que vas buscando el significado de la vida por internet (y obvio no lo encontré xD) mejor busque como hacer que un JcomboBox pueda mostrar un texto en la Ventana pero como Variable de ese texto tener otro valor. Explicándome mejor: Supongamos que tenemos una lista de paises —Paises[todos los países del Mundo], &lt;span lang=&quot;ES-MX&quot;&gt;pero&lt;/span&gt; al usuario le queremos mostrar ex: Luxemburgo, y en la Base de Datos queremos guardar ese valor con el código ISO, ósea: LUX. En HTML el problema mencionando anteriormente se resolvería (si me memoria no me deja mal) fácilmente con un:&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;brush: html&quot;&gt;&amp;lt;select&amp;gt;&lt;br /&gt;   &amp;lt;option value=&#39;LUX&#39;&amp;gt;Luxemburgo&amp;lt;/option&amp;gt;&lt;br /&gt;  &amp;lt;/select&amp;gt;&amp;nbsp;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/pre&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Pero en Java cuando estamos ingresando el valor del JcomboBox, podemos hacerlo de muchas formas, pasarle un vector con todos los item que deseamos que ese combo tenga o bien pasarle un Objeto a la vez &amp;nbsp;con los cuales se cargara el susodicho JcomboBox, en el ejemplo usaremos el ultimo método(uno por uno) y quedaría así: &lt;/div&gt;&lt;pre class=&quot;brush: java&quot;&gt;JComboBox combo1 = new JComboBox();&lt;br /&gt;  combo1.addItem(&quot;texto que mostrara el JcomboBox&quot;);&lt;/pre&gt;&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;span style=&quot;font-family: Calibri,sans-serif; font-size: 11pt; line-height: 115%;&quot;&gt;Pero haciéndolo de esa forma nos alejamos de nuestro objetivo, el cual era mostrar un texto en la ventana y que el valor de ese Item del Combo fuera otro. Para Poder lograr eso haremos una Clase que llamaremos &lt;i&gt;ObjectoEnComboBox, &lt;/i&gt;dicha Clase tendrá un constructor el cual recibirá dos parámetros de tipo String los cuales serán: Texto a Mostrar en el ComboBox, Texto que queremos recibir del combo), cuando escriba el código omitiré los imports para hacer un poco más corto el código ok ;):&lt;/span&gt;&lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;&lt;pre class=&quot;brush: java&quot;&gt;public class ObjectoEnComboBox{&lt;br /&gt;  private String textoMostrado;&lt;br /&gt;  private String valorCombo;&lt;br /&gt;  &lt;br /&gt;  public ObjectoEnComboBox(String textoMostrado, String valorCombo){&lt;br /&gt;   this.textoMostrado = textoMostrado;&lt;br /&gt;   this.valorCombo = valorCombo;&lt;br /&gt;  }&lt;br /&gt;  /**&lt;br /&gt;  * Sobreescribiendo el metodo toString()&lt;br /&gt;  */&lt;br /&gt;   @Override&lt;br /&gt;   public String toString() {&lt;br /&gt;     return this.textoMostrado;&lt;br /&gt;   }&lt;br /&gt;  /**&lt;br /&gt;   * Creando los getter&lt;br /&gt;   */&lt;br /&gt;  public String getTextoMostrado(){&lt;br /&gt;    return textoMostrado;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getValorCombo(){&lt;br /&gt;    return valorCombo;&lt;br /&gt;  }&lt;br /&gt; }&lt;/pre&gt;Como dije anteriormente el constructor de la clase recibe dos parametros, los metodos getter de las dos propiedades entenderemos su uso cuando estemos aplicando el objeto. pero adelantando un poco: serviran para recuperar tanto el texto como el valor del combo ;).&lt;br /&gt;Nota: es necesario sobreescribir el metodo toString() porque de lo contrario el texto que mostrara el combo sera la ubicacion en memoria del objecto. algo como&lt;br /&gt;&lt;b&gt;Project.Componente.ObjetoEnCombo@65765&lt;/b&gt;, y obviamente no queremos eso... pero si es lo que quieren no lo sobreescriban x)&lt;br /&gt;bien ahora veremos como aplicar eso en codigo&lt;br /&gt;&lt;pre class=&quot;brush: java&quot;&gt;public class ComboPrueba extends javax.swing.JFrame{&lt;br /&gt;&lt;br /&gt;    private JComboBox combo;&lt;br /&gt;    public ComboPrueba() {&lt;br /&gt;        combo = new JComboBox();&lt;br /&gt;        getContentPane().setLayout(new FlowLayout());&lt;br /&gt;        /**&lt;br /&gt;         * Creamos los item que tendra el combo&lt;br /&gt;         */&lt;br /&gt;        ObjetoEnCombo item1 = new ObjetoEnCombo(&quot;the Wonder woman&quot;, &quot;F&quot;);&lt;br /&gt;        ObjetoEnCombo item2 = new ObjetoEnCombo(&quot;Super Man&quot;, &quot;M&quot;);&lt;br /&gt;        combo.addItem(item1);&lt;br /&gt;        combo.addItem(item2);&lt;br /&gt;        combo.addActionListener(comboListener());&lt;br /&gt;        add(combo);&lt;br /&gt;        &lt;br /&gt;        setVisible(true);&lt;br /&gt;        setSize(new Dimension(150, 100));&lt;br /&gt;        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private ActionListener comboListener(){&lt;br /&gt;        return new ActionListener() {&lt;br /&gt;            public void actionPerformed(ActionEvent e) {&lt;br /&gt;                System.out.println(((ObjetoEnCombo)combo.getSelectedItem()).getValorCombo());&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String ... args){&lt;br /&gt;        new ComboPrueba();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;El ejemplo consiste en tener un combobox con dos item con valores predeterminados,&amp;nbsp;como podemos ver al constructor de la clase le enviamos los dos valores que necesita y ademas le agregamos un listener al combo para imprimir en consola el valor (no el texto)del item seleccionado, para esto debemos hacer un &lt;i&gt;cast&lt;/i&gt; al al Objecto que nos devuelve el combo con su metodo &lt;i&gt;combo.getSelectedItem&lt;/i&gt;. ya teniendo el objecto simplemente accedemos a la propiedad de valor con &lt;i&gt;getValor.&lt;/i&gt; que es el valor que queremos guardar en la base de datos x). Esto mas que todo sirve cuando tenemos en una tabla una llave foranea, obviamente no podemos mostrar la llave en pantalla, eso seria muy inseguro y ademas un usuario normal solo podria decir &lt;i&gt;&quot;wth???!! que es esto???&quot;&lt;/i&gt;&lt;br /&gt;pero yo se que ustedes han llegado aqui esperando poder hacer un combo con opciones deshabilitadas y con una imagen por cada item del combo pero... al momento ni una ni la otra x) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Deshabilitar items del Combo&lt;/b&gt;&lt;br /&gt;Bien, este ejemplo pueda que te sirva/interese si quieres deshabilitar algunas opciones del combo en tiempo de ejecucion, mas claro con un ejemplo: &lt;i&gt;Si tenes un sistema de ingreso de usuario (un usuario pertenece a un departamento) pero por cada departamento hay un limite de asistentes (usuarios) entonces no puedes deshabilitarlos definidamente desde el codigo de la clase porque aun no sabes o mas bien, esos valores puede que cambien con el tiempo, entonces ...&lt;/i&gt;&lt;br /&gt;para esta opcion necesitamos crear una clase (ComboConImagenYOpciones.java) que extienda de JCombobox, sobreescribiremos algunos metodos del jcombo para darle funcionabilidades especiales a nustros combito ^^; funcionalidades como coloear el item de gris indicando que esta deshabilitado para la seleccion, si el item que se quiere elegir es una opcion deshabilitada no cerrar el menu del combobox y que este permanezca abierto para proceder a seleccionar una opcion valida. Tambien le asignaremos un ListCellRenderer, el cual nos ayudara a darle un mejor aspecto visual.&lt;br /&gt;La explicacion del codigo a continuacion del mismo&lt;/div&gt;&lt;pre class=&quot;brush: java&quot;&gt;public class ComboConImagenYOpciones extends JComboBox {&lt;br /&gt;&lt;br /&gt;    private boolean estaHabilitado = true;&lt;br /&gt;    private final HashSet&lt;string&gt; opcionesDeshabilitadas = new HashSet&lt;string&gt;();&lt;br /&gt;&lt;br /&gt;    public ComboConImagenYOpciones() {&lt;br /&gt;        setRenderer(new ListCellRenderer() {&lt;br /&gt;            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {&lt;br /&gt;                JLabel labelOpcion = new JLabel();&lt;br /&gt;                if(value instanceof ObjetoEnCombo){&lt;br /&gt;                    ObjetoEnCombo miOpcion = (ObjetoEnCombo) value;&lt;br /&gt;                    labelOpcion.setText(miOpcion.getTextoMostrado());&lt;br /&gt;                    if(opcionesDeshabilitadas.contains(miOpcion.getValorCombo())){&lt;br /&gt;                        labelOpcion.setEnabled(false);&lt;br /&gt;                        labelOpcion.setBackground(Color.LIGHT_GRAY);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                return labelOpcion;&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     *&lt;br /&gt;     * @param opcionesExcluidas Llaves de todas las opciones que quiero deshabilitar&lt;br /&gt;     */&lt;br /&gt;    public void setOpcionesDeshabilitadas(HashSet&lt;string&gt; opcionesExcluidas) {&lt;br /&gt;        this.opcionesDeshabilitadas.clear();&lt;br /&gt;        for (String opcion : opcionesExcluidas) {&lt;br /&gt;            this.opcionesDeshabilitadas.add(opcion);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void setSelectedIndex(int anIndex) {&lt;br /&gt;        String selected = ((ObjetoEnCombo)getModel().getElementAt(anIndex)).getValorCombo();&lt;br /&gt;        if(opcionesDeshabilitadas.contains(selected)){&lt;br /&gt;            estaHabilitado = false;&lt;br /&gt;        }else{&lt;br /&gt;            super.setSelectedIndex(anIndex);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void setPopupVisible(boolean v) {&lt;br /&gt;        if (!estaHabilitado) {&lt;br /&gt;            estaHabilitado = true;&lt;br /&gt;        } else {&lt;br /&gt;            super.setPopupVisible(v);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;bueno ya por ultimo estoy viendo que la entrada se hizo un poco larga.... :s y un amigo me acaba de decir literalmente: &quot;Las entradas largas aburren&quot; asi que he decidido dejar la parte de las imagenes para un segundo post. pero adelantando un poco, para poner imagenes necesitaremos un HashMap&lt;objetoencombo, imageicon=&quot;&quot;&gt; para que cada opcion del combo tenga su propia imagen, el ComboConImagenYOpciones.java tendra un metodo en el cual le setearemos dicho valores,&lt;/objetoencombo,&gt;&lt;br /&gt;Bueno ahora si ya no sigo porque sino mejor lo termino en esta entrada x) Nos vemos mañana, almenos eso espero para commemorar el 1 año de NO post en este blog... que verguenza&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://gnuteam.blogspot.com/2011/07/deshabilitar-opciones-en-jcombobox-y-de.html&quot; style=&quot;background-color: #fff2cc;&quot;&gt;Codigo del JCombobox Completo Aca :D&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-LGEWFrbW9Z4/Tg5B1AXE6KI/AAAAAAAAAIc/1qQ5gnIO2Vk/s1600/view.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;142&quot; src=&quot;http://3.bp.blogspot.com/-LGEWFrbW9Z4/Tg5B1AXE6KI/AAAAAAAAAIc/1qQ5gnIO2Vk/s320/view.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/396118444630434604/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2011/07/jcombobox-con-opciones-deshabilitadas-e.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/396118444630434604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/396118444630434604'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2011/07/jcombobox-con-opciones-deshabilitadas-e.html' title='How to: Disable Options JCombobox // JComboBox con opciones deshabilitadas e imagenes // Disabling Options on JComboBox'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-LGEWFrbW9Z4/Tg5B1AXE6KI/AAAAAAAAAIc/1qQ5gnIO2Vk/s72-c/view.png" height="72" width="72"/><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-3447613411095305814</id><published>2010-07-02T07:59:00.000-07:00</published><updated>2010-07-02T08:00:17.403-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="Gnu/linux"/><title type='text'>Saber cuanto Software NO libre tienes en tu Gnu/Linux</title><content type='html'>Hola denuevo a todos, ahora vamos a ver una cuestion &amp;nbsp;bastante sencilla y un poco curiosa a mi parecer, es saber que ten Libre tenemos nuestro OS GNU.&lt;br /&gt;Bueno iniciamos instalando un paquete llamado vrms (Virtual Richard Mathew Stallman).&lt;br /&gt;como todos sabemos Richard Stallman es bastante riguroso acerca de la libertad que posee los sistemas basados en GNU, asi que basicamente el nos dira que tanto hemos seguido los principios de la libertad xD.&lt;br /&gt;bueno, empecemos&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;aptitude install vrms&lt;/code&gt;&lt;br /&gt;Luego solo basta ejecutarlo y nos aparecera en pantalla todos los paquetes NO libres instalados en nuestro sistema&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;vrms&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Non-free packages installed on debian&lt;br /&gt;&lt;br /&gt;assaultcube &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realistic first-person-shooter&lt;br /&gt;assaultcube-data &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;data files for Assault Cube&lt;br /&gt;bcm5700-source &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;module source for Broadcom&#39;s bcm5700 ethernet driver&lt;br /&gt;opera &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; The Opera Web Browser&lt;br /&gt;skype &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Skype&lt;br /&gt;sun-java6-bin &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Sun Java(TM) Runtime Environment (JRE) 6 (architecture&lt;br /&gt;sun-java6-jre &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Sun Java(TM) Runtime Environment (JRE) 6 (architecture&lt;br /&gt;tremulous-data &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Tremulous datas&lt;br /&gt;unrar &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Unarchiver for .rar files (non-free version)&lt;br /&gt;warsow-data &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Game data for Warsow&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Non-free packages with status other than installed on debian&lt;br /&gt;&lt;br /&gt;virtualbox-3.1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( dei) &amp;nbsp;Sun VirtualBox&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Contrib packages installed on debian&lt;br /&gt;&lt;br /&gt;limewire-basic &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LimeWire is a p2p filesharing program that offers the&lt;br /&gt;playonlinux &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; front-end for Wine&lt;br /&gt;tremulous &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Aliens vs Humans, team based FPS game with elements of&lt;br /&gt;warsow &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fast paced 3D first person shooter&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;12 non-free packages, 0.6% of 1940 installed packages.&lt;br /&gt;&amp;nbsp;&amp;nbsp;4 contrib packages, 0.2% of 1940 installed packages.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;que pena... pero asi es la vida como pueden ver mi sistema no esta del todo libre :c. mas que todo por algunos jueguitos, pero igual, una salida similar es la que tienen que obtener.&lt;br /&gt;&lt;br /&gt;Espero de alguna u otr forma les sirva, y nos vemos</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/3447613411095305814/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/07/saber-cuanto-software-no-libre-tienes.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/3447613411095305814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/3447613411095305814'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/07/saber-cuanto-software-no-libre-tienes.html' title='Saber cuanto Software NO libre tienes en tu Gnu/Linux'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-4883691047622386794</id><published>2010-07-02T07:49:00.000-07:00</published><updated>2010-07-02T07:49:14.441-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="Gnu/linux"/><title type='text'>Activar sensores en Gnu/Linux Debian</title><content type='html'>&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: verdana, sans-serif; font-size: small; line-height: 16px;&quot;&gt;Pues bueno... Hola a todos, seguramente mas de alguno en mas de una ocasion(almenos a mi me paso &amp;nbsp;&lt;img alt=&quot;Sonreir&quot; border=&quot;0&quot; src=&quot;http://www.gnulinuxonline.com/foro/Smileys/default/grin.gif&quot; /&gt;) se ha descargado algund Gadget para superkaramba o algun otro gestor de gadgets y nos damos cuenta que algunas caracteristicas como la temperatura del cpu, las rpm del fan, entre otras no indican nada, pues al principio pensaba que los creadores de los gadgets no lo hacian bien y me decia a mi mismo:&lt;br /&gt;&quot;Cuando sea grande hare unos gadgets que si sirvan... pero cuando sea grande&quot;&lt;br /&gt;pues estaba equivocado pues para que esas opciones funcionen tienen que activar los sensores primero, y pues aqui mostrare como&amp;nbsp;&lt;img alt=&quot;Sonrisa&quot; border=&quot;0&quot; src=&quot;http://www.gnulinuxonline.com/foro/Smileys/default/smiley.gif&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: verdana, sans-serif; font-size: small; line-height: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: verdana, sans-serif; font-size: small; line-height: 16px;&quot;&gt;1. Instalar lm-sensors&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div class=&quot;codeheader&quot; style=&quot;color: black; font-size: x-small; font-style: normal; font-weight: bold; line-height: 1.2em; text-decoration: none;&quot;&gt;Código:&lt;/div&gt;&lt;div class=&quot;code&quot; style=&quot;background-color: #dddddd; border-bottom-color: rgb(0, 0, 0); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(0, 0, 0); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(0, 0, 0); border-top-style: solid; border-top-width: 1px; color: black; font-family: &#39;courier new&#39;, &#39;times new roman&#39;, monospace; font-size: x-small; height: 37px; line-height: 1.3em; margin-bottom: 1px; margin-left: auto; margin-right: auto; margin-top: 1px; max-height: 24em; overflow-x: auto; overflow-y: auto; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; white-space: nowrap; width: 773px;&quot;&gt;apt-get install lm-sensors&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2.Ejecutamos el asistente para que reconozca los dispositivos y si estos tienen sensores disponibles, esto con:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;div class=&quot;codeheader&quot; style=&quot;color: black; font-size: x-small; font-style: normal; font-weight: bold; line-height: 1.2em; text-decoration: none;&quot;&gt;Código:&lt;/div&gt;&lt;div class=&quot;code&quot; style=&quot;background-color: #dddddd; border-bottom-color: rgb(0, 0, 0); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(0, 0, 0); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(0, 0, 0); border-top-style: solid; border-top-width: 1px; color: black; font-family: &#39;courier new&#39;, &#39;times new roman&#39;, monospace; font-size: x-small; height: 37px; line-height: 1.3em; margin-bottom: 1px; margin-left: auto; margin-right: auto; margin-top: 1px; max-height: 24em; overflow-x: auto; overflow-y: auto; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; white-space: nowrap; width: 773px;&quot;&gt;sensors-detect&lt;/div&gt;&lt;br /&gt;Como nos indica el mismo asistente, digitar yes para todas las opciones que se iran presentando, almenos que tú sepas hacerlo manualmente lo que te pedirá (aunque es recomendable leer un poco &amp;nbsp;&lt;img alt=&quot;Guiñar&quot; border=&quot;0&quot; src=&quot;http://www.gnulinuxonline.com/foro/Smileys/default/wink.gif&quot; /&gt;)&lt;br /&gt;Al final del asistente te mostrara los modulos necesarios para cargar los sensores. en mi caso fueron:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;codeheader&quot; style=&quot;color: black; font-size: x-small; font-style: normal; font-weight: bold; line-height: 1.2em; text-decoration: none;&quot;&gt;Código:&lt;/div&gt;&lt;div class=&quot;code&quot; style=&quot;background-color: #dddddd; border-bottom-color: rgb(0, 0, 0); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(0, 0, 0); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(0, 0, 0); border-top-style: solid; border-top-width: 1px; color: black; font-family: &#39;courier new&#39;, &#39;times new roman&#39;, monospace; font-size: x-small; line-height: 1.3em; margin-bottom: 1px; margin-left: auto; margin-right: auto; margin-top: 1px; max-height: 24em; overflow-x: auto; overflow-y: auto; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; white-space: nowrap; width: 773px;&quot;&gt;#----cut here----&lt;br /&gt;# Chip drivers&lt;br /&gt;coretemp&lt;br /&gt;w83627ehf&lt;br /&gt;#----cut here----&lt;/div&gt;una salida igual o parecida tendrias que obtener si tienen algun dispositivo con sensores&lt;br /&gt;Al finalizar el asistente tendras que cargar cada uno de los modulos que sensor-detect te dio&lt;br /&gt;quedando algo asi en mi caso:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;codeheader&quot; style=&quot;color: black; font-size: x-small; font-style: normal; font-weight: bold; line-height: 1.2em; text-decoration: none;&quot;&gt;Código:&lt;/div&gt;&lt;div class=&quot;code&quot; style=&quot;background-color: #dddddd; border-bottom-color: rgb(0, 0, 0); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(0, 0, 0); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(0, 0, 0); border-top-style: solid; border-top-width: 1px; color: black; font-family: &#39;courier new&#39;, &#39;times new roman&#39;, monospace; font-size: x-small; height: 37px; line-height: 1.3em; margin-bottom: 1px; margin-left: auto; margin-right: auto; margin-top: 1px; max-height: 24em; overflow-x: auto; overflow-y: auto; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; white-space: nowrap; width: 773px;&quot;&gt;modprobe coretemp&lt;/div&gt;&lt;div class=&quot;codeheader&quot; style=&quot;color: black; font-size: x-small; font-style: normal; font-weight: bold; line-height: 1.2em; text-decoration: none;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;codeheader&quot; style=&quot;color: black; font-size: x-small; font-style: normal; font-weight: bold; line-height: 1.2em; text-decoration: none;&quot;&gt;Código:&lt;/div&gt;&lt;div class=&quot;code&quot; style=&quot;background-color: #dddddd; border-bottom-color: rgb(0, 0, 0); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(0, 0, 0); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(0, 0, 0); border-top-style: solid; border-top-width: 1px; color: black; font-family: &#39;courier new&#39;, &#39;times new roman&#39;, monospace; font-size: x-small; height: 37px; line-height: 1.3em; margin-bottom: 1px; margin-left: auto; margin-right: auto; margin-top: 1px; max-height: 24em; overflow-x: auto; overflow-y: auto; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; white-space: nowrap; width: 773px;&quot;&gt;modprobe w83627ehf&lt;/div&gt;&lt;br /&gt;&lt;i&gt;me parece que es necesario el paquete modconf para ejecutar modprobe, si es asi instalarlo con aptitude&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;luego de cargar los modulos:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;codeheader&quot; style=&quot;color: black; font-size: x-small; font-style: normal; font-weight: bold; line-height: 1.2em; text-decoration: none;&quot;&gt;Código:&lt;/div&gt;&lt;div class=&quot;code&quot; style=&quot;background-color: #dddddd; border-bottom-color: rgb(0, 0, 0); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(0, 0, 0); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(0, 0, 0); border-top-style: solid; border-top-width: 1px; color: black; font-family: &#39;courier new&#39;, &#39;times new roman&#39;, monospace; font-size: x-small; height: 37px; line-height: 1.3em; margin-bottom: 1px; margin-left: auto; margin-right: auto; margin-top: 1px; max-height: 24em; overflow-x: auto; overflow-y: auto; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; white-space: nowrap; width: 773px;&quot;&gt;/etc/init.d/module-init-tools&lt;/div&gt;&lt;br /&gt;para iniciar el servicio de sensores y los modulos cargados en&amp;nbsp;&lt;i&gt;/etc/modules&lt;/i&gt;&amp;nbsp;(eh aqui donde se configuran los modulos, claro si respondiste YES a todo, el&amp;nbsp;&lt;i&gt;sensor-detect&lt;/i&gt;&amp;nbsp;lo ha hecho por ti... que bonito es Gnu/Linux verdad&amp;nbsp;&lt;img alt=&quot;Reir&quot; border=&quot;0&quot; src=&quot;http://www.gnulinuxonline.com/foro/Smileys/default/cheesy.gif&quot; /&gt;)&lt;br /&gt;&lt;br /&gt;para probar si esta todo bien ejecutamos:&lt;br /&gt;&lt;div class=&quot;codeheader&quot; style=&quot;color: black; font-size: x-small; font-style: normal; font-weight: bold; line-height: 1.2em; text-decoration: none;&quot;&gt;Código:&lt;/div&gt;&lt;div class=&quot;code&quot; style=&quot;background-color: #dddddd; border-bottom-color: rgb(0, 0, 0); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(0, 0, 0); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(0, 0, 0); border-top-style: solid; border-top-width: 1px; color: black; font-family: &#39;courier new&#39;, &#39;times new roman&#39;, monospace; font-size: x-small; height: 37px; line-height: 1.3em; margin-bottom: 1px; margin-left: auto; margin-right: auto; margin-top: 1px; max-height: 24em; overflow-x: auto; overflow-y: auto; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; white-space: nowrap; width: 773px;&quot;&gt;sensors&lt;/div&gt;&lt;br /&gt;dará una salida parecida a esta:&lt;br /&gt;&lt;div class=&quot;codeheader&quot; style=&quot;color: black; font-size: x-small; font-style: normal; font-weight: bold; line-height: 1.2em; text-decoration: none;&quot;&gt;Código:&lt;/div&gt;&lt;div class=&quot;code&quot; style=&quot;background-color: #dddddd; border-bottom-color: rgb(0, 0, 0); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(0, 0, 0); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(0, 0, 0); border-top-style: solid; border-top-width: 1px; color: black; font-family: &#39;courier new&#39;, &#39;times new roman&#39;, monospace; font-size: x-small; line-height: 1.3em; margin-bottom: 1px; margin-left: auto; margin-right: auto; margin-top: 1px; max-height: 24em; overflow-x: auto; overflow-y: auto; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; white-space: nowrap; width: 758px;&quot;&gt;coretemp-isa-0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;Adapter: ISA adapter &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;Core 0: &amp;nbsp; &amp;nbsp; &amp;nbsp;+31.0°C &amp;nbsp;(high = +76.0°C, crit = +100.0°C) &lt;br /&gt;&lt;br /&gt;coretemp-isa-0001&lt;br /&gt;Adapter: ISA adapter&lt;br /&gt;Core 1: &amp;nbsp; &amp;nbsp; &amp;nbsp;+34.0°C &amp;nbsp;(high = +76.0°C, crit = +100.0°C) &lt;br /&gt;&lt;br /&gt;w83627dhg-isa-0290&lt;br /&gt;Adapter: ISA adapter&lt;br /&gt;Vcore: &amp;nbsp; &amp;nbsp; &amp;nbsp; +1.27 V &amp;nbsp;(min = &amp;nbsp;+0.00 V, max = &amp;nbsp;+1.74 V)&lt;br /&gt;in1: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +0.93 V &amp;nbsp;(min = &amp;nbsp;+0.14 V, max = &amp;nbsp;+0.97 V)&lt;br /&gt;AVCC: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+3.41 V &amp;nbsp;(min = &amp;nbsp;+2.98 V, max = &amp;nbsp;+3.63 V)&lt;br /&gt;VCC: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +3.41 V &amp;nbsp;(min = &amp;nbsp;+2.98 V, max = &amp;nbsp;+3.63 V)&lt;br /&gt;in4: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +1.70 V &amp;nbsp;(min = &amp;nbsp;+0.46 V, max = &amp;nbsp;+1.18 V) &amp;nbsp; ALARM&lt;br /&gt;in5: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +1.71 V &amp;nbsp;(min = &amp;nbsp;+0.49 V, max = &amp;nbsp;+0.02 V) &amp;nbsp; ALARM&lt;br /&gt;in6: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; +1.85 V &amp;nbsp;(min = &amp;nbsp;+1.53 V, max = &amp;nbsp;+1.91 V)&lt;br /&gt;3VSB: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+3.47 V &amp;nbsp;(min = &amp;nbsp;+2.98 V, max = &amp;nbsp;+3.63 V)&lt;br /&gt;Vbat: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+3.30 V &amp;nbsp;(min = &amp;nbsp;+2.70 V, max = &amp;nbsp;+3.30 V)&lt;br /&gt;fan1: &amp;nbsp; &amp;nbsp; &amp;nbsp; 2163 RPM &amp;nbsp;(min = 2518 RPM, div = 8) &amp;nbsp;ALARM&lt;br /&gt;fan2: &amp;nbsp; &amp;nbsp; &amp;nbsp; 2445 RPM &amp;nbsp;(min = 21093 RPM, div = 8) &amp;nbsp;ALARM&lt;br /&gt;fan3: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 RPM &amp;nbsp;(min = 10546 RPM, div = 128) &amp;nbsp;ALARM&lt;br /&gt;fan4: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 RPM &amp;nbsp;(min = 1054 RPM, div = 128) &amp;nbsp;ALARM&lt;br /&gt;fan5: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 RPM &amp;nbsp;(min = &amp;nbsp;958 RPM, div = 128) &amp;nbsp;ALARM&lt;br /&gt;temp1: &amp;nbsp; &amp;nbsp; &amp;nbsp; +37.0°C &amp;nbsp;(high = -105.0°C, hyst = +91.0°C) &amp;nbsp;sensor = thermistor&lt;br /&gt;temp2: &amp;nbsp; &amp;nbsp; &amp;nbsp; +34.5°C &amp;nbsp;(high = +80.0°C, hyst = +75.0°C) &amp;nbsp;sensor = thermistor&lt;br /&gt;temp3: &amp;nbsp; &amp;nbsp; &amp;nbsp; +45.5°C &amp;nbsp;(high = +80.0°C, hyst = +75.0°C) &amp;nbsp;sensor = thermistor&lt;br /&gt;cpu0_vid: &amp;nbsp; +0.000 V&lt;/div&gt;&lt;br /&gt;ahora ya puedes cargar tus gadgets favoritos y te mostraran la info de tu sistema&amp;nbsp;&lt;img alt=&quot;Reir&quot; border=&quot;0&quot; src=&quot;http://www.gnulinuxonline.com/foro/Smileys/default/cheesy.gif&quot; /&gt;&lt;br /&gt;&lt;br /&gt;PD1.: hacer todo esto como usuario root&lt;br /&gt;PD2.: creo que en Ubunto tambien funciona&lt;br /&gt;PD3.: lo probe y funciono en sobre debian 6.0 Squeeze&lt;br /&gt;&lt;br /&gt;Espero les sirva y cualquier problema, que no sea muy astral ni cosmico xD, comenten y tratamos de resolverlo Ok&amp;nbsp;&lt;img alt=&quot;Reir&quot; border=&quot;0&quot; src=&quot;http://www.gnulinuxonline.com/foro/Smileys/default/cheesy.gif&quot; /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/4883691047622386794/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/07/activar-sensores-en-gnulinux-debian.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/4883691047622386794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/4883691047622386794'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/07/activar-sensores-en-gnulinux-debian.html' title='Activar sensores en Gnu/Linux Debian'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-8441746094332758946</id><published>2010-05-09T19:32:00.000-07:00</published><updated>2010-06-09T21:28:41.472-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="boot"/><category scheme="http://www.blogger.com/atom/ns#" term="burg"/><category scheme="http://www.blogger.com/atom/ns#" term="debian"/><category scheme="http://www.blogger.com/atom/ns#" term="splashy"/><category scheme="http://www.blogger.com/atom/ns#" term="temas"/><title type='text'>Animando el Selector de OS!!</title><content type='html'>Buenas a todos  esta vez compartire con ustedes algo que me parece interesente a mi y actractivo en cuanto a interfas grafica !! lo concidero algo importante para llamar la atencion de las personas a que usen Linux! Si es feo quien le prestaria interes! ? Oo!?  si hay gente que le gusta lo simple pero hay muchas que le gusta lo grafico por algo mejoran la interface grafica a windows no!Oo? (windows 7), bueno para esto tenemos que tener grub2 antes ya instalado.&lt;br /&gt;&lt;br /&gt;Ahora al grano !! Burg es una aplicacion que permite tener un menú de arranque mucho más vistoso esta basado en GRUB 2 ya que se espera que este se su sucesor !! la distro que lo esta utilizando mas ahorita es ubuntu! (pienso que es el raton de laboratorio xD ), ya que es probado en ubuntu solo encontre repositorios para ubuntu pero que solo contiene este maravilloso paquete.&lt;br /&gt;&lt;br /&gt;agregamos a nuestro sources.list&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;deb http://ppa.launchpad.net/bean123ch/burg/ubuntu  karmic main&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;y hacemos&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;apt-get update &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;luego  instalamos  estos paquetes ya sea en synaptic o con apt-get:&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;burg&lt;/li&gt;&lt;li&gt;burg-common&lt;/li&gt;&lt;li&gt;burg-emu&lt;/li&gt;&lt;li&gt;burg-pc&lt;/li&gt;&lt;li&gt;burg-themes&lt;/li&gt;&lt;li&gt;burg-themes-common&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Si nos pide dependencias hay que agregarlas. Durante la instalación nos saldrán algunos cuadros de diálogo que dejaremos tal como están, sólo hay que indicarle en uno de ellos dónde tenemos instalado el Grub. (revisar antes en que partcion tienen instalado el grub... si tienen duda consultar).&lt;br /&gt;&lt;br /&gt;una ves instalado tenemos que editar este archivo para algo que instalaremos depsues de hacer este chunche!&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;/etc/default/burg  (lo editan como root con el editor de texto que gusten)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet&quot;&lt;br /&gt;GRUB_CMDLINE_LINUX=&quot;splash vga=0x0318&quot; (el valor vga ya les digo como saber cual es el que les corresponde)&lt;br /&gt;GRUB_TERMINAL=console&lt;br /&gt;GRUB_GFXMODE=1024x768 &quot;y le ponemos la resolución que vayamos a poner en el valor de vga pero no exadecima si no asi como esta aqui puesto&quot;&lt;br /&gt;GRUB_DISABLE_LINUX_UUID=true&lt;br /&gt;GRUB_THEME=sora_clean éste lo cambiamos y le ponemos el que acá pongo&lt;br /&gt;GRUB_FOLD=saved&lt;br /&gt;&lt;br /&gt;Ahora con este comando sabremos que valor aplicar en vga y en la resolucion que soporta nuestro framebuffer:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;hwinfo --framebuffer&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;mostrara algo asi:&lt;br /&gt;&lt;br /&gt;02: None 00.0: 11001 VESA Framebuffer                         &lt;br /&gt;[Created at bios.464]&lt;br /&gt;Unique ID: rdCR.il6towt04X5&lt;br /&gt;Hardware Class: framebuffer&lt;br /&gt;Model: &quot;Intel(r) 82945GM Chipset Family Graphics Controller&quot;&lt;br /&gt;Vendor: &quot;Intel Corporation&quot;&lt;br /&gt;Device: &quot;Intel(r) 82945GM Chipset Family Graphics Controller&quot;&lt;br /&gt;SubVendor: &quot;Intel(r) 82945GM Chipset Family Graphics Chip Accelerated VGA BIOS&quot;&lt;br /&gt;SubDevice:&lt;br /&gt;Revision: &quot;Hardware Version 0.0&quot;&lt;br /&gt;Memory Size: 7 MB + 704 kB&lt;br /&gt;Memory Range: 0xc0000000-0xc07affff (rw)&lt;br /&gt;Mode 0x0305: 1024x768 (+1024), 8 bits&lt;br /&gt;Mode 0x0317: 1024x768 (+2048), 16 bits&lt;br /&gt;Mode 0x0318: 1024x768 (+4096), 24 bits&lt;br /&gt;Mode 0x0312: 640x480 (+2560), 24 bits&lt;br /&gt;Mode 0x0314: 800x600 (+1600), 16 bits&lt;br /&gt;Mode 0x0315: 800x600 (+3200), 24 bits&lt;br /&gt;Mode 0x0301: 640x480 (+640), 8 bits&lt;br /&gt;Mode 0x0303: 800x600 (+832), 8 bits&lt;br /&gt;Mode 0x0311: 640x480 (+1280), 16 bits&lt;br /&gt;Config Status: cfg=new, avail=yes, need=no, active=unknown&lt;br /&gt;&lt;br /&gt;(si no les da este comando obviamente tenemos que instalarlo &amp;gt;.&amp;gt; )&lt;br /&gt;&lt;br /&gt;ahora usamos este comando para actualizar la configuracion de burg&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;update-burg (es el equivalente a update-grub)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;usamos este comando para ver como queda el gestor de arranque sin reiniciar:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;burg-emu -r host&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;PD. En caso de que no les muestre el menú, hay que volver a comentar&lt;br /&gt;&lt;br /&gt;GRUB_TERMINAL=console ( y repetir la actualizacion con update-burg)&lt;br /&gt;&lt;br /&gt;Con esto ya tenemos nuestro gestor de arraque configurado graficamente y con animaciones!&lt;br /&gt;&lt;br /&gt;Pero no termina aqui este post! ya te aburristes de ver las letras que parecen al iniciar debian?...Agregarle una barra de progreso y imagen de fondo en este paso?... hay personas que les gusta ver lo que pasa en su sistema que falla y que no, alguno estamos seguros de que nuestros sistemas estan bien&lt;br /&gt;&lt;br /&gt;lo que hay que acer simplemente es&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;aptitude install splashy &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;que instale las dependencias  y listo ya que cuando configuramos burg lo hicimos para que iniciara con splashy! Para configurar splashy lo puedes acer desde consola  ya que con burg no creo que funcione el startupmanager aun ! solo editamos este archivo que es muy simple :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;nano /etc/splashy/config.xml &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;donde dice &lt;current_theme&gt;default&lt;/current_theme&gt;  cambiar el default por algun otro temas que tengan en /usr/share/splashy/themes y guardan nada mas&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;y realizan esta operacion&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;update-initramfs -u&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;(nose si hay que usar este comando cada vez que cambiemos de tema no eh probado)&lt;br /&gt;&lt;br /&gt;y para corroborar todo reiniciamos ..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;espero que les sea de ayuda este mini-tutorial, si tienen consulta porfavor hacerlas y tambien comenten !! (siento no aver puesto imagenes esta vez)</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/8441746094332758946/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/05/animando-el-selector-de-os.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8441746094332758946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8441746094332758946'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/05/animando-el-selector-de-os.html' title='Animando el Selector de OS!!'/><author><name>xmelvinx</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-1774500477678953338</id><published>2010-05-05T20:53:00.000-07:00</published><updated>2010-06-09T21:30:54.389-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="compiz"/><category scheme="http://www.blogger.com/atom/ns#" term="debian"/><category scheme="http://www.blogger.com/atom/ns#" term="docky"/><category scheme="http://www.blogger.com/atom/ns#" term="gnome"/><category scheme="http://www.blogger.com/atom/ns#" term="nautilus-elementary"/><category scheme="http://www.blogger.com/atom/ns#" term="skins"/><category scheme="http://www.blogger.com/atom/ns#" term="temas"/><title type='text'>Haciendo atractivo nuestro Debian !!</title><content type='html'>&lt;div style=&quot;color: red; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 180%;&quot;&gt;&amp;gt;&amp;gt;LOS REPOSITORIOS YA ESTAN ARRIBA &amp;lt;&amp;lt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;En este primer post que realizo en el blog de mi amigo dejare como podemos hacer mas atractivo nuestro querido &lt;i&gt;Debian &lt;/i&gt; no importa si es Lenny o Sqeeze. (aunque no he probado los programas de gloobus y nautilus-elementary en lenny, yo digo, no creo que hayan dependencias por versiones actuales de paquetes). &lt;br /&gt;&lt;br /&gt;## Nautilus Elementary . ## &lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_izBTXgKldiY/S-JAZ2SPDjI/AAAAAAAAAAk/08-BRhLbcJM/s1600/nautilu-elementary.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5468003710394109490&quot; src=&quot;http://3.bp.blogspot.com/_izBTXgKldiY/S-JAZ2SPDjI/AAAAAAAAAAk/08-BRhLbcJM/s320/nautilu-elementary.png&quot; style=&quot;cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 320px;&quot; /&gt;&lt;/a&gt; &lt;br /&gt;es la nueva versión de nautilus que se espera para la salida de Gnome 3.0 pero de todas maneras existe una versión de desarrollo, bastante estable, que se puede instalar fácilmente. Básicamente es un cambio de interfase que mejorara la usabilidad de nautilus en muchos aspectos. &lt;br /&gt;para poder instalarlo es agregar repositorios y actualizar lo que es nautilus para eso agregaremos estos repositorios: &lt;br /&gt;&lt;br /&gt;(como usuarios root) &lt;br /&gt;nano /etc/apt/sources.list &lt;br /&gt;&lt;br /&gt;deb http://hadret.rootnode.net/debian/ unstable main &lt;br /&gt;deb-src http://hadret.rootnode.net/debian/ unstable main &lt;br /&gt;&lt;br /&gt;(comentamos los demás repositorios por el momento  para que sea mas segura la actualización de nautilus) &lt;br /&gt;guardamos y cerramos nano o el editor de textos que hayamos usado. &lt;br /&gt;ahora usamos: &lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;apt-get update &lt;br /&gt;apt-get upgrade &lt;br /&gt;&lt;br /&gt;seguimos indicaciones y esperamos a que termine de actualizar nautilus. &lt;br /&gt;una vez finalizada la actualización, descomentamos los demás repositorios y dejamos el que agregamos también y luego solo hacemos : apt-get update &lt;br /&gt;podemos cerrar ya la consola y ya enfocarnos en lo visual. &lt;br /&gt;Abrimos una carpeta cualquiera solo para ir a Editar-Preferencias-tweaks  ,de ahí marcamos las siguientes cosas. &lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_izBTXgKldiY/S-JBDqe2buI/AAAAAAAAAAs/Qa5S0Pij184/s1600/nautilus-tweaks.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5468004428780302050&quot; src=&quot;http://1.bp.blogspot.com/_izBTXgKldiY/S-JBDqe2buI/AAAAAAAAAAs/Qa5S0Pij184/s320/nautilus-tweaks.png&quot; style=&quot;cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 320px;&quot; /&gt;&lt;/a&gt; &lt;br /&gt;ya con esto hecho cerramos sesión y entramos de nuevo  ya verán el cambio a simple vista pero faltan dos cosas un tema &quot;X&quot; cualquiera y uno que es indispensable para que la barra de lugar se vea bien siempre : &lt;br /&gt;&lt;a href=&quot;http://www.mediafire.com/?tnl4wyjzywk&quot;&gt;tema indispensable para elementary&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;http://www.mediafire.com/?jzzm0mtjznk&quot;&gt;tema - wasp &lt;/a&gt; &lt;br /&gt;ambos los descomprimen en la carpeta .themes que se encuentra en la carpeta del usuario o arrastran los archivos a la aplicación apariencias (Sistema-Preferencia-Apariencias) &lt;br /&gt;con esto ya tenemos nuestro nautilus  modificado, simple y grandioso. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;## Gloobus-Preview ## &lt;br /&gt;es una extensión de Nautilus, el navegador de archivos de GNOME, que muestra una previsualización de cualquier tipo de fichero. Su funcionamiento es bien sencillo: seleccionando un archivo en Nautilus y pulsando la tecla espacio, se abrirá una ventana auxiliar que mostrará el contenido del fichero.Actualmente Gloobus soporta los siguientes tipos de ficheros: TXT, PDF, JPG, BMP, GIF, PNG, PSD, MP3, OGG, MPG, WMV, XCF. &lt;br /&gt;para esto ya tenemos el repositorio adentro de nuestro sources &lt;br /&gt;aptitude install gloobus-preview &lt;br /&gt;para usarlo seleccionamos un archivo con extensión soportada y presionamos barra espaciadora (space) y ya!! =D.(si no funciona tenemos que reiniciar nautilus o simplemente cerrar sesión y entrar de nuevo) &lt;br /&gt;&lt;br /&gt;Dependencias:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;apt-get install libgtk2.0-dev libgvfscommon-dev libgstreamer-plugins-base0.10-dev libcairomm-1.0-dev libtag1-dev libpoppler-glib-dev libgnomeui-dev unoconv libgtksourceview2.0-dev build-essential libswfdec-0.8-dev automake libtool bzr libbz2-dev libdjvulibre-dev libspectre-dev&lt;/li&gt;&lt;/ul&gt;(libgvfscommon-dev depende de libgvfscommon0 estos ya no estan en sqeeze asi que nose como reemplazarlo con los que se usa actualmente q son gvfs y gvfsbackports, por esa razon no pude compilar el sources pero aun sin este funciona el gloobus-preview)&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_izBTXgKldiY/S-JDzi3QEVI/AAAAAAAAABE/Mh4XbDCGcB8/s1600/gloobus-privew%28imagen%29.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5468007450392138066&quot; src=&quot;http://3.bp.blogspot.com/_izBTXgKldiY/S-JDzi3QEVI/AAAAAAAAABE/Mh4XbDCGcB8/s320/gloobus-privew%28imagen%29.png&quot; style=&quot;cursor: pointer; float: right; height: 200px; margin: 0pt 0pt 10px 10px; width: 320px;&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_izBTXgKldiY/S-JDKQbioTI/AAAAAAAAAA8/2CXPue5PnpM/s1600/gloobus-preview%28video%29.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5468006741069439282&quot; src=&quot;http://4.bp.blogspot.com/_izBTXgKldiY/S-JDKQbioTI/AAAAAAAAAA8/2CXPue5PnpM/s320/gloobus-preview%28video%29.png&quot; style=&quot;cursor: pointer; float: left; height: 200px; margin: 0pt 10px 10px 0pt; width: 320px;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: black;&quot;&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;## Compiz ##&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: white;&quot;&gt;es uno de los primeros getstores de ventanas&lt;/span&gt;&lt;span style=&quot;color: white;&quot;&gt; de composicion&lt;/span&gt;&lt;span style=&quot;color: white;&quot;&gt; para el sis&lt;/span&gt;&lt;span style=&quot;color: white;&quot;&gt;tema de ventanas X Windows&lt;/span&gt;&lt;span style=&quot;color: white;&quot;&gt; que es capaz de aprovechar la aceleración&lt;/span&gt;&lt;span style=&quot;color: white;&quot;&gt; OpenGl.&lt;/span&gt; &lt;br /&gt;&lt;div style=&quot;color: white;&quot;&gt;También presenta algunas de las características que tienen otros competidores, como Expose en Mac OS X de Apple. Compiz está construido sobre la extensión de composición de X y la extensión &lt;tt&gt;GLX_EXT_texture_from_pixmap&lt;/tt&gt; de OpenGL. &lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_izBTXgKldiY/S-LRUrFG_FI/AAAAAAAAABM/7RB96B7IuO8/s1600/compiz.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5468163050672946258&quot; src=&quot;http://1.bp.blogspot.com/_izBTXgKldiY/S-LRUrFG_FI/AAAAAAAAABM/7RB96B7IuO8/s320/compiz.png&quot; style=&quot;cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 320px;&quot; /&gt;&lt;/a&gt;para instalarlo : &lt;br /&gt;(como root) &lt;br /&gt;aptitude install compiz-gnome compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-unsuported fusion-icon compiz-plugins &lt;br /&gt;&lt;br /&gt;los demas se instalan por dependencias estos son los que le dan un extra toque a compiz, aclaro todos estos paquetes ya estan en los repositorios de debia. &lt;br /&gt;&lt;br /&gt;Bueno ahora la configuracion de Xorg &lt;br /&gt;(como root) &lt;br /&gt;&lt;ul&gt;&lt;li&gt;nano /etc/X11/xorg.conf (usar cualquier editor de texto)&lt;/li&gt;&lt;/ul&gt;agregamos estas opciones en la seccion device: &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Option &quot;AllowGLXWithComposite&quot; &quot;true&quot;&lt;/li&gt;&lt;li&gt;Option &quot;RenderAccel&quot; &quot;true&quot;&lt;/li&gt;&lt;li&gt;Option &quot;XAANoOffscreenPixmaps&quot; &quot;True&quot;&lt;/li&gt;&lt;li&gt;Option &quot;UseFBDev&quot; &quot;true&quot;&lt;/li&gt;&lt;li&gt;Option &quot;AccelMethod&quot; &quot;XAA&quot;&lt;/li&gt;&lt;li&gt;Option &quot;DRI&quot; &quot;true&quot;&lt;/li&gt;&lt;li&gt;Option &quot;AddARGBGLXVisuals&quot; &quot;True&quot;&lt;/li&gt;&lt;/ul&gt;Muchos dicen que solo con una basta que es  Option &quot;XAANoOffscreenPixmaps&quot; &quot;True&quot; pero yo siento mas comodo asi en mi integrada intel i850 tambien en las Nvidias &lt;br /&gt;&lt;br /&gt;luego agregamos esta seccion: &lt;br /&gt;&lt;br /&gt;Section &quot;Extensions&quot; &lt;br /&gt;Option &quot;Composite&quot; &quot;Enable&quot; &lt;br /&gt;EndSection &lt;br /&gt;&lt;br /&gt;la podemos agregar de ultimo guardamos y cerramos, y reiniciamos el  gestor grafico /etc/init.d/gdm restart &lt;br /&gt;&lt;br /&gt;logueamos y abrimos fusion-icon (Aplicaciones-Herramientas de sistema- Compiz Fusion Icon), configuramos a nuestro gusto. !! para que inicie siempre solo basta con agregar fusion-icon en sesiones o en sqeeze que es programas al inicio &lt;br /&gt;&lt;br /&gt;## Docky ## &lt;br /&gt;&lt;br /&gt;es una barra lanzadora de aplicaciones, visora de aplets tipo la barra de Mac! este se puede instalar de dos formas porque docky se a separado de gnome-do y se puede instalar solamente ella. &lt;br /&gt;&lt;br /&gt;Instalacion: &lt;br /&gt;(como root) &lt;br /&gt;&lt;ul&gt;&lt;li&gt;aptitude install docky&lt;/li&gt;&lt;/ul&gt;o &lt;br /&gt;&lt;ul&gt;&lt;li&gt;aptitude install gnome-do &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_izBTXgKldiY/S-LWcy92VhI/AAAAAAAAABU/KEBe1YOVgJM/s1600/docky.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5468168687787070994&quot; src=&quot;http://2.bp.blogspot.com/_izBTXgKldiY/S-LWcy92VhI/AAAAAAAAABU/KEBe1YOVgJM/s320/docky.png&quot; style=&quot;cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 320px;&quot; /&gt;&lt;/a&gt; &lt;br /&gt;yo creo que con esto basta para tener atractivo nuestro escritori gnome (para usuarios de gnome) pero esto se puede hacer en kde tambien menos lo de nautilus-elementary obviamente =D !! espero que les ayude este mini-manual y si tienen alguna duda no duden en preguntar aunque sea tarde se les contestara. [No olviden comentar]</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/1774500477678953338/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/05/haciendo-atractivo-nuestro-debian-en.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/1774500477678953338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/1774500477678953338'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/05/haciendo-atractivo-nuestro-debian-en.html' title='Haciendo atractivo nuestro Debian !!'/><author><name>xmelvinx</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_izBTXgKldiY/S-JAZ2SPDjI/AAAAAAAAAAk/08-BRhLbcJM/s72-c/nautilu-elementary.png" height="72" width="72"/><thr:total>3</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-8501625671902649848</id><published>2010-04-20T21:12:00.000-07:00</published><updated>2010-04-21T08:10:13.796-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="Gnu/linux"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><title type='text'>Usar Twitter desde la consola de Gnu/Linux</title><content type='html'>hola, hoy vamos a ver y aprender como usar el twitter desde consola.&lt;br /&gt;bueno en lo personal no hago un uso excesivo del twitter. pero si lo puedo usar desde consola, pero si lo puedo usar desde una terminal le voy a dar un uso, ademas, se mira bastante geek. x)&lt;br /&gt;pues bueno primero instalaremos el paquete necesario, para eso nos logeamos como root&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&lt;code&gt;su&lt;/code&gt;&lt;/blockquote&gt;ingresamos nuestra password super secreta y presionamos ENTER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&lt;code&gt;apt-get install python-simplejson python-twyt&lt;/code&gt;&lt;/blockquote&gt;&amp;nbsp;nos pedira confirmacion y digitamos S y luegoun ENTER&lt;br /&gt;&lt;br /&gt;ahora veremos como usarlo:&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;bueno el comando en cuestion con el cual vamos a trabajar es&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&lt;code&gt;twyt&lt;/code&gt;&lt;/blockquote&gt;&amp;nbsp;lo primero que vamos hacer (para un futuro mas comodo) es introducir nuestro usuario para no tener que ingresar la password de twitter cada vez que lo usemos, para ello usaremos la opcion &lt;b&gt;user set -u miUsuarioTwitter&lt;/b&gt;, de la siguente manera&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&lt;code&gt;twyt user set -u McCubo&lt;/code&gt;&lt;/blockquote&gt;&amp;nbsp;Luego presionamos &lt;i&gt; enter&lt;/i&gt; y nos pedira la password de nuestra cuenta de twitter, la ingresamos, y &lt;i&gt;enter&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;si queremos verificar que nuestro usuario se almaceno&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&lt;code&gt;twyt user -l&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&amp;nbsp;si hicimos el paso anterior para postear una nueva entrada, hacemos&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&lt;code&gt;twyt tweet &quot;probando un tweet desde la consola de Gnu/Debian&quot; &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&amp;nbsp;&amp;nbsp;pero si omitimos el primer paso el comando deberá ser:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;code&gt;twyt tweet &quot;probando un tweet desde la consola de Gnu/Debian&quot; -u McCubo -p MiPasswordTwitter&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&amp;nbsp;y cada nuevo tweet que hagamos deberiamos agregar la opcion -u con nuestro usuario twitter y -p seguido de la password de la cuenta, por eso recomiendo el &lt;b&gt;user set&lt;/b&gt;, pero bueno, gustos de cada quien.&lt;br /&gt;el resultado del comando anterior, ya en la pagina de twitter:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_PoCfcjrrnHk/S851yICtp-I/AAAAAAAAADo/sVRMrV6GBo4/s1600/twit1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;62&quot; src=&quot;http://2.bp.blogspot.com/_PoCfcjrrnHk/S851yICtp-I/AAAAAAAAADo/sVRMrV6GBo4/s400/twit1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;bonito verdad???&lt;br /&gt;pero eso no es todo, si queremos que nuestro tweet salga encerrado entre unos simbolos de musica, cambiamos la opcion &lt;b&gt;tweet&lt;/b&gt; por la opcion &lt;b&gt;sing&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&lt;code&gt;twyt sing &quot;let it be, probando... otra vez, twitter desde consola, a ver que sale&quot; &lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_PoCfcjrrnHk/S852oUkE_0I/AAAAAAAAADw/2FVX5g-BEfs/s1600/twit3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;57&quot; src=&quot;http://2.bp.blogspot.com/_PoCfcjrrnHk/S852oUkE_0I/AAAAAAAAADw/2FVX5g-BEfs/s400/twit3.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;si queremos enviarle un tweet directo aun amigo del twitter, lo hacemos que la opcion &lt;b&gt;direct&lt;/b&gt;, del a sigente manera&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&lt;code&gt;twyt direct PersonaQueSigo &quot;mensage directo a el&quot;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&amp;nbsp;  &lt;br /&gt;si nuestra intencion es ver los tweets de las personas que sigo, para eso esta la opcion &lt;b&gt;friendstl&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;nbsp;&lt;code&gt;twyt friendstl&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&amp;nbsp;mostrando asi hasta un maximo de 20 nuevos tweets.&lt;br /&gt;&lt;br /&gt;bueno esos son los usos mas comunes que se le dan al twitter, almenos solo esas opciones me parecen relevantes, para mi, pero como ustedes saben cada comando instala con el, un manual&lt;br /&gt;para mas info pueden digitar&lt;br /&gt;&lt;code&gt;man twyt&lt;/code&gt;&lt;br /&gt;apareciendo estas y otras mas opciones con las cuales podran usar el twitter&lt;br /&gt;bueno, con esto me despido y hasta la proxima entrada.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;no olvides que si quieres seguir un poco mas de cerca a este blog, puedes dar click en el enlace que dice &lt;big&gt;suscribe via email&lt;/big&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/8501625671902649848/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/04/usar-twitter-desde-la-consola-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8501625671902649848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8501625671902649848'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/04/usar-twitter-desde-la-consola-de.html' title='Usar Twitter desde la consola de Gnu/Linux'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_PoCfcjrrnHk/S851yICtp-I/AAAAAAAAADo/sVRMrV6GBo4/s72-c/twit1.png" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-5793383708590584898</id><published>2010-04-08T20:20:00.000-07:00</published><updated>2010-04-08T20:27:13.786-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="Gnu/linux"/><title type='text'>hacer que la consola hable!!!</title><content type='html'>Hola de nuevo, antes que nada gracias por seguir visitando el blog.&lt;br /&gt;bueno y como el titulo de la entrada dice ahora veremos como hacer que nuestra consola hable, obviamente no va a entablar una conversacion con el usuario, sino mas bien va a leer las palabras en la misma consola, o en su defecto leer un archivo de texto.&lt;br /&gt;&lt;br /&gt;este proceso es posible gracias a el paquete &lt;i&gt;&lt;b&gt;espeak&lt;/b&gt;&lt;/i&gt;, para instalarlo, abrimos una terminal y ejecutamos:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;su&lt;/blockquote&gt;Nos pedira la contraseña del administrador, la digitamos (aunque parezca que no escribe nada pero en realidad si lo hace, es solo por cuestion de seguridad)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;apt-get install espeak&lt;/blockquote&gt;Nos pedira confirmacion, digitamos S y luego un Enter&lt;br /&gt;y el programa deberia instalarse sin mayor problema.&lt;br /&gt;&lt;br /&gt;COMO USARLO:&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;primero que todo tenemos que salir de la cuenta de root (administrador) y luego:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;echo&lt;/b&gt; &quot;texto que queremos escuchar&quot; | espeak &lt;/blockquote&gt;Sin olvidar encerrar el texto deseado entre comillas.&lt;br /&gt;por defecto la lectura del texto es para palabras en ingles, para que pueda leer palabras en español con la opcion -v&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;echo&lt;/b&gt; &quot;texto que queremos escuchar&quot; | espeak -v spanish &lt;/blockquote&gt;&amp;nbsp;y si queremos que hable mas rapido o despacio con la opcion -s&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;echo&lt;/b&gt; &quot;texto que queremos escuchar&quot; | espeak -v spanish -s 200&lt;/blockquote&gt;por defecto el valor de la opcion -s es 160, por consiguente un valor mas alto producira una que el texto sea &lt;i&gt;leido&lt;/i&gt; mas rapido, al igual un valor mas bajo sera una salida mas despacio&lt;br /&gt;&lt;br /&gt;pero eso no es todo, los desarrolladores de este paquete en verdad se mandaron, si tenemos un archivo de texto plano (osea no .doc, .odt, .pdf) y queremos que lo lea, entonces:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;espeak -v spanish -f archivo_Texto&lt;/blockquote&gt;&lt;br /&gt;y si queremos almacenar la salida del audio, podemos agregarle la opcion -w, de la siguente manera&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;espeak -v spanish -f archivo_Texto -w archivo.wav&lt;/blockquote&gt;con esta ultima opcion no escucharemos el texto del archivo, porque la salida fue redirigida a &lt;b&gt;archivo.wav&lt;/b&gt; (le pueden poner otro nombre que les guste, pero siempre recordando la extension &lt;b&gt;.wav&lt;/b&gt;)&lt;br /&gt;&lt;br /&gt;para escucharla podrian&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; mplayer archivo.wav&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;bueno espero esta entrada les agrade y les sirva en algun momento.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/5793383708590584898/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/04/hacer-la-consola-hable.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/5793383708590584898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/5793383708590584898'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/04/hacer-la-consola-hable.html' title='hacer que la consola hable!!!'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-8081132825522496837</id><published>2010-04-04T20:15:00.000-07:00</published><updated>2010-04-04T20:18:24.578-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="Gnu/linux"/><title type='text'>usar la consola y no morir en el intento-- parte 1</title><content type='html'>Bueno colegas, llego la hora de meternos un poco con las consolas (tambien llamadas terminales) de gnu/linux.&lt;br /&gt;para empezar hagamos esta pregunta &lt;i&gt;¿Que es una consola?&lt;/i&gt;, bueno segun &lt;a href=&quot;http://www.wikipedia.org/&quot;&gt;wikipedia&lt;/a&gt; es:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;(Command Line Interface &lt;/i&gt;&lt;i&gt;(CLI))&lt;/i&gt;&lt;i&gt; es un metodo que permite a las personas dar instrucciones a algún programa informatico por medio de una línea de texto simple. &lt;/i&gt;&lt;/blockquote&gt;para una informacion mas detallada acerca de que son los CLI; visita &lt;a href=&quot;http://es.wikipedia.org/wiki/Consola_de_sistema&quot;&gt;este enlace&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;bueno nose si notaron, en la definicion que nos da wikipedia, el termino &lt;i&gt;simple&lt;/i&gt;, eso quiere decir que son comandos pequeños los que introducimos en la terminal, sin meternos a cosas tan profundas de programacion tales como bucles, condiciones, funciones,etc; ya que si queremos hacer algo asi, un poco mas grande tendriamos que iniciarnos en programacion bash, que eso espero poder aportar un poco mas adelante.&lt;br /&gt;&lt;br /&gt;bueno, una cosa que me gustaria tomaran en cuenta es que con el siguente manual, sientanse libre (de eso trata la cuestion no?) de modificarlo y reproducirlo. tambien que trataremos de seguir publicando mas entradas como esta, todo con el fin de ayudar y demostrar que usar un sistema operativo gnu/linux no es nada del otro mundo, y mucho menos solo para programadores&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.mediafire.com/?wdzjkzttjok&quot;&gt;Enlace de descarga para el Manual&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PD. todo (almenos que yo sepa)&amp;nbsp; lo que se puede hacer en modo consola se puede hacer en modo grafico, claro es mas geek en modo consola x)</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/8081132825522496837/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/04/usar-la-consola-y-no-morir-en-el.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8081132825522496837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/8081132825522496837'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/04/usar-la-consola-y-no-morir-en-el.html' title='usar la consola y no morir en el intento-- parte 1'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-6710165329440930177</id><published>2010-04-01T20:33:00.000-07:00</published><updated>2010-05-01T16:04:48.836-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="xhtml"/><title type='text'>validar campos con javascript... 2do metodo</title><content type='html'>Bueno, si han seguido un poco el progreso del blog, anteriormente publique una entrada para validar campos con javascript, en dicho ejemplo teniamos que crear una funcion para validar cada caja de texto, y eso en lo personal no me gustó, pero bueno hoy les traigo un codigo javascript con el cual &lt;b&gt;una sola funcion&lt;/b&gt; puede validar todos los campos que queramos sean solamente &lt;i&gt;string&lt;/i&gt;. bueno aca el codigo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;validar con Javascript, metodo2&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script language=&#39;javascript&#39;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;function val(valor){&lt;br /&gt;&amp;nbsp;&amp;nbsp; lon=document.getElementById(valor).value.length;&lt;br /&gt;&amp;nbsp;&amp;nbsp; campo=document.getElementById(valor).value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; for(i=0;i&lt;lon;i++){&gt;&amp;lt;lon;i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag=isNaN(campo[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (flag==false){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //alert(&#39;este campo solo admite letras&#39;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.getElementById(valor).value=&quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.getElementById(valor).setfocus;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (lon==0){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //alert(&#39;este campo es obligatorio&#39;);&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;form name=&#39;formu&#39;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;table border=&#39;1&#39;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;Nombre&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type=&#39;text&#39; name=&#39;nom&#39; id=&#39;nombre&#39; onblur=&#39;val(this.id)&#39; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;Apellido&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;input type=&#39;text&#39; name=&#39;ape&#39; id=&#39;apellido&#39; onblur=&#39;val(this.id)&#39; /&amp;gt;&lt;/lon;i++){&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td colspan=&#39;2&#39; align=&#39;center&#39;&amp;gt;&amp;lt;input type=&#39;submit&#39;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Para que la longitud y el nombre del campo pueda ser reutilizado para cada textbox, cada uno de ellos tienen que poseer el atributo &lt;i&gt;ID&lt;/i&gt;, ya que con &lt;i&gt;getElementById()&lt;/i&gt; es necesario dicho atributo para poder evaluar el texto.&lt;br /&gt;como pueden ver los dos textbox llaman a la misma funcion, asi sucesivamente se tendria que hacer si se quisiera validar mas campos &lt;i&gt;string&lt;/i&gt;, para validar campos &lt;i&gt;integer&lt;/i&gt; solo se tendria que realizar una pequeña varianza en la funcion &lt;b&gt;val()&lt;/b&gt;, especificamente en la condicional de &lt;i&gt;flag&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;espero este pequeño tutorial pueda serles util, ya que esa es su finalidad.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/6710165329440930177/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/04/validar-campos-con-javascript-2do.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/6710165329440930177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/6710165329440930177'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/04/validar-campos-con-javascript-2do.html' title='validar campos con javascript... 2do metodo'/><author><name>Miguel Cubias Caceres</name><uri>https://plus.google.com/112604177143019407720</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-SB8Urs0fj1E/AAAAAAAAAAI/AAAAAAAABn0/ugCMgv3ZkHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-1924671299470379002</id><published>2010-03-31T00:00:00.000-07:00</published><updated>2010-03-31T22:35:42.263-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gnu/linux"/><category scheme="http://www.blogger.com/atom/ns#" term="videos"/><title type='text'>Aprender a usar Gnu/Linux -parte 2</title><content type='html'>Despues de la filosofia e historia (parte 1 de este hilo) vamos a ver/aprender como instalar gnu/linux, en este caso Debian y/o ubunto&lt;br /&gt;Bueno gente de ante mano les queremos pedir disculpas por que no nos concetraremos mucho en la instalación de  Debian (recomendado) o en todo caso Ubuntu así que les dispondremos los links hacia las paginas adonde ustedes pueden descargar Debian,Ubuntu y unos cuantos videos de instalacion;los links de descarga son estos:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Debian:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;-En el siguiente link podras encontrar los enlaces hacia las paginas en las que puedan descargar imágenes de cd/dvd de Debian de la distribución estable o la distribucion de testing (en prueba),la versión &lt;q&gt;estable&lt;/q&gt; actual de Debian GNU/Linux es la 5.0.4,   cuyo nombre en código es &lt;i&gt;lenny&lt;/i&gt; y la de testing &lt;q&gt;en pruebas&lt;/q&gt; es &lt;i&gt;squeeze&lt;/i&gt;.&lt;br /&gt;&amp;nbsp;Pues bueno a la hora de descargar la imagen del cd/dvd de Debian, tienes que  descargar la arquitectura correspondiente a tu maquina, aunque segun he leido en algunos foros el i386 y amd64 van casi igual en rendimiento, casi nula la diferencia, aunque habria que investigar mas; claro.&lt;br /&gt;&lt;a href=&quot;http://www.debian.org/CD/http-ftp/index.es.html&quot;&gt;http://www.debian.org/CD/http-ftp/index.es.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-Otra forma de conseguirlo es a través de los vendedores en el siguiente link encontraran a cierto listado de vendedores en su país,hay países en los que no hay vendedores registrados en la pagina oficial de Debian,también podrán encontrar vendedores internacionales.&lt;br /&gt;&lt;br /&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.debian.org/CD/vendors/&quot;&gt;http://www.debian.org/CD/vendors/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ubuntu:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;-Pueden hacer que les manden los discos de instalación de Ubuntu totalmente gratis desde el siguiente link :&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://shipit.ubuntu.com/&quot;&gt;https://shipit.ubuntu.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-También descargarlo desde aca para quemarlo en 1 cd:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ubuntu.com/GetUbuntu/download&quot;&gt;http://www.ubuntu.com/GetUbuntu/download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-O la ultima opcion comprar ubuntu via&lt;br /&gt;&lt;br /&gt;Ubuntu:&lt;br /&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/3937514775?ie=UTF8&amp;amp;tag=ubuntusearch-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=3937514775&quot;&gt;http://www.amazon.com/gp/product/3937514775?ie=UTF8&amp;amp;tag=ubuntusearch-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=3937514775&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Kubuntu:&lt;br /&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B001L4PQIK?ie=UTF8&amp;amp;tag=ubuntusearch-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B001L4PQIK&quot;&gt;http://www.amazon.com/gp/product/B001L4PQIK?ie=UTF8&amp;amp;tag=ubuntusearch-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B001L4PQIK&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;INSTALACIÓN:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Como lo mensionamos anteriormente no nos detendremos a explicarles mucho de la instalacion de Debian y Ubuntu,aunque la instalacion sea mas que similar les dispondremos de 2 videos uno para Debian y otro para Ubuntu.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Debian:&lt;/span&gt;&lt;br /&gt;&lt;embed allownetworking=&quot;internal&quot; allowscriptaccess=&quot;never&quot; height=&quot;350&quot; quality=&quot;high&quot; src=&quot;http://www.youtube.com/watch?v=Tjg_6ly8A4Q&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;425&quot; wmode=&quot;transparent&quot;&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;link: &lt;a href=&quot;http://www.youtube.com/watch?v=Tjg_6ly8A4Q&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.youtube.com/watch?v=Tjg_6ly8A4Q&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ubuntu:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed allownetworking=&quot;internal&quot; allowscriptaccess=&quot;never&quot; height=&quot;350&quot; quality=&quot;high&quot; src=&quot;http://www.youtube.com/watch?v=KoemuPikgYo&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;425&quot; wmode=&quot;transparent&quot;&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;link: &lt;a href=&quot;http://www.youtube.com/watch?v=KoemuPikgYo&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.youtube.com/watch?v=KoemuPikgYo&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;Mas información:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Debian:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.genbeta.com/actualidad/instalar-debian-gnulinux-50-lenny-screencast&quot;&gt;http://www.genbeta.com/actualidad/instalar-debian-gnulinux-50-lenny-screencast&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ubuntu:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://paraisolinux.com/instalar-ubuntu-9-10-paso-a-paso/&quot;&gt;http://paraisolinux.com/instalar-ubuntu-9-10-paso-a-paso/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;*Think free think Linux*&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/1924671299470379002/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/03/aprender-usar-linux-parte2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/1924671299470379002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/1924671299470379002'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/03/aprender-usar-linux-parte2.html' title='Aprender a usar Gnu/Linux -parte 2'/><author><name>Joker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-399756579626982142.post-5207944181757670116</id><published>2010-03-23T07:44:00.000-07:00</published><updated>2010-03-31T22:19:39.958-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gnu/linux"/><category scheme="http://www.blogger.com/atom/ns#" term="videos"/><title type='text'>Aprender a usar Gnu/linux-Parte 1</title><content type='html'>Bueno para comenzar todo, primero un poco de filosofia e historia del movimiento del &lt;i&gt;free software&lt;/i&gt;,por si ustedes alguna ves se han preguntado ¿Como fue creado Gnu/linux?¿Porque existe Gnu/linux?¿Quien lo desarrolla ?¿Que es Gnu?, bueno como es mas entretenido ver 1 vídeo que leer mucha información aquí les dejo este documental titulado Codigo linux espero que les guste&lt;br /&gt;&lt;br /&gt;&lt;embed allownetworking=&quot;internal&quot; allowscriptaccess=&quot;never&quot; height=&quot;350&quot; quality=&quot;high&quot; src=&quot;http://video.google.com/googleplayer.swf?docId=6729008725344610785&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;425&quot; wmode=&quot;transparent&quot;&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;link: &lt;a href=&quot;http://video.google.com/videoplay?docid=6729008725344610785&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://video.google.com/videoplay?docid=6729008725344610785&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&quot;Res publica non dominetur (lo que es publico no tiene dueño)&quot;</content><link rel='replies' type='application/atom+xml' href='http://gnuteam.blogspot.com/feeds/5207944181757670116/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://gnuteam.blogspot.com/2010/03/aprender-usar-gnulinux.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/5207944181757670116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399756579626982142/posts/default/5207944181757670116'/><link rel='alternate' type='text/html' href='http://gnuteam.blogspot.com/2010/03/aprender-usar-gnulinux.html' title='Aprender a usar Gnu/linux-Parte 1'/><author><name>Joker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry></feed>