miércoles, 15 de octubre de 2025

La IA de grok puede procesar de manera autónoma videos con dibujos

 He quedado asombrado, ya que solo se sube el archivo de imagen y la IA de grok realiza un video que deja alucinando, aquí un ejemplo de un archivo de origen que realice con flipaclip (que por cierto es una aplicación para realizar animaciones).


y ahora el resultado del video que crea IA


Es algo que me asombra, se que son un modelo de miles de imágenes procesados con un algoritmo (no se cual sea), pero no deja de sorprender


martes, 18 de agosto de 2020

NAS - Almacenamiento conectado en red

 ¿Que es un NAS? El NAS (almacenamiento conectado a la red) es un dispositivo de almacenamiento de datos donde puede guardar fotos, videos, música y documentos.


Básicamente un NAS es una tecnología de almacenamiento de red que nos brinda la posibilidad de concentrar y almacenar todo tipo de contenidos en un único dispositivo, para que siempre se encuentren disponibles para quien lo solicite a través de la red, independientemente del estado de las computadoras que la integran. Esto significa que no necesitaremos que ninguna de las PC conectadas a la misma esté encendidas para encontrarnos con el material deseado.

El usuario puede utilizar el NAS de manera exclusiva o bien puede compartirlo con grandes grupos de personas, tales como familiares y amigos o entre colegas. También, es posible acceder al NAS desde dispositivos móviles y computadoras.

Muchos sistemas NAS cuentan con uno o más dispositivos de almacenamiento para incrementar su capacidad total. Frecuentemente, estos dispositivos están dispuestos en RAID (Redundant Arrays of Independent Disks) o contenedores de almacenamiento redundante.

También un NAS puede utilizarse como servidor web, servidor de bases de datos, servidor de impresión, servidor multimedia, servidor de descargas para Torrents y servidor de vigilancia a través de cámaras, entre otros.

Referencias:

https://www.qnap.com/solution/what-is-nas/es-mx/

https://www.tecnologia-informatica.com/que-es-servidor-nas-construir/

jueves, 13 de agosto de 2020

netplwiz herramienta de windows 10 para crear o editar propiedades de usuario e inicio de sesión

 En alguna ocasión al iniciar sesión en un equipo me pidió teclear la combinación ctrl + alt + supr en ese momento pense que era solo exclusivo del sistema operativo windows server, pero resulta que en windows 8 y 10 tambien se puede establecer esta opción en el inicio de sesión.

Ahora despues de lo comentado la forma rápida de hacerlo es usando una herramienta de windows llamada netplwiz que para jecutarlo desde el menu inicio escribimos netplwiz

Se abrirá una ventana con varias herramientas  que nos permitirá gestionar usuarios, contraseñas y opciones de inicio de sesión.



La primera pestaña muestra funciones para gestionar usuarios, que podemos hacer:

1. Agregar usuarios

2. Cambiar nombre de usuarios

3. Establecer o quitar contraseñas

La segunda pestaña opciones avanzadas nos permite gestionar el inicio de sesión

Referencias:

https://www.smythsys.es/5687/cambiar-el-nombre-de-usuario-a-una-cuenta-de-windows-8-netplwiz/

https://www.profesionalreview.com/2018/10/27/crear-usuario-windows-10/

Investigando acerca de una Red Wifi Mesh


Muchos sabemos del problema que representa el tener el módem en una ubicación y que en ciertas zonas del hogar la intensidad de señal es mala o se pierde constantemente por la distancia en que se encuentra el módem. Teniendo esto como antecedente viene el tema del titulo de esta publicación, que es una red wifi Mesh.

Las redes WiFi Mesh o redes inalambricas de malla consiste en un router principal que se conecta directamente a tu módem y en varios módulos satélite (o nodos), repartidos por toda tu casa para conseguir una cobertura WiFi completa.



Las redes WiFi Mesh pueden, por ejemplo, autogestionar el tráfico de datos que las recorre de forma que pueden redirigir nuestra conexión para ofrecer siempre la ruta más corta, eficiente. estable hasta el router principal. Son capaces de calcular a qué satélite debemos conectarnos en cada momento para tener la mejor potencia y calidad de señal, y todo ello de una forma completamente transparente para nosotros. Nos movemos por la casa con nuestro dispositivo móvil, siempre conectados a la misma WiFi.


Referencias: 

https://www.linksys.com/es/r/resource-center/whole-home-mesh-wifi/

https://www.xatakamovil.com/conectividad/sistemas-wifi-mesh-malla-que-que-ventajas-desventajas-tienen-modelos-recomendados

jueves, 6 de agosto de 2020

corregir error 0x00000709 al querer cambiar impresora predeterminada

En ocasiones se producen cambios en el registro de windows que arrojan errores inesperados, y estos por lo regular son un poco difícil entender, este es el caso del error 0x00000709, que sale cuando se elige cambiar de impresora predeterminada.

En cierta forma esto no causaría demasiado problema si la impresora que quedo predeterminada todavía está funcionando, pero que pasa si ya no se esta usando y se tiene otra impresora, por que con este error no permite cambiar de impresora desde los programas cuando se desea imprimir.

La forma de corregir el problema es editando los datos modificados en el registro, aquí se hace la advertencia que antes de realizar cambios en el registro hagan una copia para que en caso de que falle puedan restablecer y poder seguir utilizando su equipo.

Paso 1. Ejecutar regedit como administrador (muy importante para guardar los cambios) para iniciar el editor del registro.

Paso 2. Ya en el editor del registro buscar la siguiente clave: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

Paso 3. Ya en la clave dar clic con botón derecho, se mostrara un menú emergente, aquí seleccionar permisos y dar clic.

Paso 4. Se abrirá una ventana donde se mostraran las opciones de seguridad para los usuarios y grupos, aquí se deberá establecer en el grupo de todos los paquetes de aplicaciones control total o en el usuario de windows que este usando en el equipo, debe quedar mas o menos como se ve en la imagen.
Paso 5. Haga clic en Aceptar y por ultimo reinicie el equipo.

lunes, 3 de agosto de 2020

Doodle de Google para aprender a programar jugando


Recomiendo un Doodle de Google para que jugando conozcan un poco sobre programación, aunque ya tiene tiempo que Google lo publico, recientemente lo vuelve a traer en apoyo a las actividades para las personas y en especial para los niños, que tengan actividades de aprendizaje.

El Doodle se basa en programar los movimientos de un pequeño conejo para desplazarse y conseguir todas las zanahorias ubicadas en el tablero.

Consta de varios niveles de complejidad y obtiene el mejor puntaje si se programa con el menor numero de movimientos para hacer el recorrido.

He intentado varia ocasiones obtener el mejor puntaje, pero a la fecha no consigo programar el menor numero de movimientos en el ultimo nivel, lo recomiendo y feliz aprendizaje!!!

viernes, 31 de julio de 2020

Dibujos animados fácil y rápido con la App FlipaClip

FlipaClip es una aplicación con la que puedes crear animaciones con dibujos hechos a mano desde cero, se comienza con el dibujo de un fotograma, después a este fotograma le aplicas un pequeño cambio y así sucesivamente hasta obtener la animación deseada.

En mi caso la he usado para dibujar, ya que permite copiar por completo el fotograma en uno nuevo y así ir trabajando sobre el dibujo y tener una copia para poder regresar hasta donde iba bien el dibujo.

Los desarrolladores de la aplicación en su descripción nos dicen: Ya sea que estés dibujando, haciendo guiones gráficos, animando o simplemente aprendiendo, la interfaz receptiva de FlipaClip proporciona la mejor experiencia de dibujo y animación. Es simple: los controles intuitivos son fáciles de iniciar pero lo suficientemente dinámicos para tus ideas creativas.

Caracteristicas:

  • Dibuja con herramientas prácticas como Pinceles, Lazo, Relleno, Borrador, formas de Regla, e inserta Texto con múltiples opciones de letras.
  • Uso de Capas
  • Animar cuadro-por-cuadro es súper fácil gracias a la intuitiva línea de tiempo de animación y herramientas prácticas como la piel de Cebolla, el visor de Cuadro, Cuadrículas
  • Anima imágenes que importas o dibujas en la parte superior de tus videos dándole ese sabor de rotoscopio.


Descarga la aplicación para Android en:

https://play.google.com/store/apps/details?id=com.vblast.flipaclip&hl=es_MX

martes, 31 de julio de 2018

Intentando quitar bloqueo a un iphone

En fechas pasadas he logrado desbloquear algunos smartphones con sistema android, y la verdad me sorprende que existan esos pequeños huecos de seguridad, pero hoy he comenzado a practicar quitando el bloqueo a un iphone, aun no lo consigo, pero cabe decir que si tiene huecos de seguridad, no es facil lo admito, aun asi seguire intentando y si se consigue ya explicare un poco del proceso, por el momento es todo por hoy.

viernes, 16 de diciembre de 2016

Pendón 2016 en Chilpancingo

¡Ya estamos listos! Pendón 2016, el H. Ayuntamiento esta dando una amplia promoción al arranque de la feria de navidad y año nuevo de Chilpancingo, por lo que invita a toda la población al pendón 2016, este próximo 18 de diciembre del 2016.


Recorrido:


Más información: https://m.facebook.com/Paseo-del-Pend%C3%B3n-Chilpancingo-509919822418540/

domingo, 4 de septiembre de 2016

De los compromisos con el blog y otras cosas

Pero si este blog pareciera fuera un anuario, he visto lo que escribo y es cada año que vuelvo por aquí, por cosas de la vida cotidiana postergo el compartir cosas nuevas que he aprendido, la tecnología avanza demasiado rápido y en ocasiones es difícil seguirle el paso a los nuevos lenguajes de programación y a los existentes estar al día con las mejoras es desgastante.

Por el momento he trabajado mucho con Javascript y he conseguido aprender cosas nuevas que desconocía se pudieran hacer, tendré que establecer un nivel de compromiso decente para dejar un articulo que sea medianamente de interés y que el indexador de búsquedas de google considere colocarlo en las primeras paginas de resultados.

A lo que escribí arriba esta imagen lo dice todo. Buen día a todos

jueves, 27 de agosto de 2015

Utilizando el emulador DosBox

DosBox es un emulador que recrea un entorno similar al sistema DOS con el objetivo de poder ejecutar programas y videojuegos originalmente escritos para el sistema operativo MS-DOS de Microsoft en ordenadores más modernos. (referencia  wikipedia: https://es.wikipedia.org/wiki/DOSBox)

Pagina oficial: http://www.dosbox.com/

Quizás el uso común que se le ha dado a este emulador es para poder ejecutar videojuegos, pero en mi caso lo he usado para instalar programas que se usaban años atrás.

Aquí dejo una pantallas de como ha quedado con Windows 3.11 y los programas que instale.






He instalado por supuesto el primer entorno de programación que conocí cuando comencé a programar, me refiero al Turbo C de Borland versión 2.01 (Lo admito en aquellos tiempos no instale nada, todo venia en un diskette que me dieron y listo)





Dejo un ejemplo de un programa que escribí, pues la tentación ha sido grande (Algunos programadores comprenderán esa sensación)

Código de un programa que invierte una cadena de caracteres que se escribe por teclado

/* Programa: Invierte cadena de caracteres
    Versión: 1.0
 */

 #include <stdio.h>
 #include <conio.h>

 char *inviertecadena(char *cadena);
 int largocadena(char *cadena);

 void main(void)
 {
   char cadena[60]; /* Para guardar el texto que se escriba */
   clrscr(); /* Borrado de pantalla */
   printf("\n\tEscribe un texto: ");
   gets(cadena); /* Guardamos el texto escrito */
   printf("\n\t***************************************************");
   printf("\n\tCadena original: %s", cadena);
   printf("\n\tCadena invertida: %s", inviertecadena(cadena));
   printf("\n\n\tPulsar cualquier tecla para continuar");
   getch(); /* Funcion que lee la tecla pulsada, se usa para la pausa */
 }

 /* Funcion que retorna una cadena invertida */

 char *inviertecadena(char *cadena)
 {
   char cadenainvertida[60] = "\0"; /* Para guardar la nueva cadena ya invertida */
   int longitud = largocadena(cadena); /* Obtenemos el largo de la cadena */
   int i = 0, j = longitud; /* Asignamos valores a los indices */
   for(i=0;i<longitud;i++) /* Un ciclo para recorrer la cadena */
   {
     j-= 1; /* El indice de la nueva cadena lo decrementamos */
     cadenainvertida[j] = cadena[i]; /* Colocamos al final cada caracter */
   }
   return(cadenainvertida); /* Retornamos la nueva cadena ya invertida */
 }

 /* Funcion que retorna el largo de una de cadena de caracteres */

 int largocadena(char *cadena)
 {
   int largo = 0, i = 0; /*Variables para el indice y el largo de la cadena*/
   while(cadena[i]!='\0') /*Un ciclo mientras no se encuentre un valor nulo*/
   {
    largo += 1; /* Incrementamos el largo */
    i += 1; /* Incrementamos el indice para leer el siguiente caracter*/
   }
   return(largo); /* Retornamos el largo de la cadena */
 }

Resultado de la ejecución



martes, 14 de julio de 2015

Chat básico con Socket.io y Node.js

Ejemplo de una aplicación Chat realizada con Node.js y Socket.io, hago la aclaración que todo el código de esta aplicación es propiedad de Smitha Milli y lo pueden ver en su canal de Youtube, por lo que agrego los datos para quien desee conocer mas información y para la explicación personal de Smitha.

Canal Youtube: https://www.youtube.com/user/smithamilli
Twitter: https://twitter.com/SmithaMilli
Página Oficial: http://smithamilli.com/
Facebook: https://www.facebook.com/thisissmitha

La aplicación consta de 3 archivos y los módulos (dependencias) que serán creados con npm (gestor de paquetes de node.js) como se vera mas adelante.


El primer archivo que se necesita es package.json que en este contendrá el nombre de la aplicación, la versión, las dependencias que vamos a utilizar (express y socket.io)

package.json

{
"name":"chat",
"version":"0.0.1",
"private":"true",
"dependencies":{
"socket.io":"1.3.5",
"express":"4.13.1"
}
}

Para conocer la versión que tenga instalada de socket.io y express ejecute el siguiente comando: npm info socket.io version



npm info express version



Ya con este archivo podemos ejecutar npm y copiar las dependencias en nuestra carpeta de la aplicación, ejecutamos el comando npm install


Y al terminar ya tenemos listo la carpeta con los paquetes necesarios para la aplicación



El segundo archivo es app.js

app.js

var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);

server.listen(3000);

app.get('/', function(req,res){
res.sendFile(__dirname + '/index.html');
});

io.sockets.on('connection',function(socket) {
socket.on('send message',function(data){
io.sockets.emit('new message',data);
});
});

Aquí en app.js lo que se tiene es un servidor que responderá los eventos de entrada y salida (ver video en canal de youtube de Smitha para una explicación mas a detalle)

Por ultimo tenemos el archivo index.html que solo mostrara un cuadro de texto con un botón para enviar lo escrito, en la parte superior se mostrara lo que se vaya escribiendo y recibiendo.

index.html

<html>
<head>
<title>Chat con socket.io y node.js</title>
<style type="text/css">
#chat{
height: 500px;
}
</style>
</head>
<body>
<div id="chat"></div>
<form id="send-message">
<input size="35" id="message"></input>
<input type="submit"></input>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
jQuery(function($){
var socket = io.connect();
var $messageForm = $('#send-message');
var $messageBox = $('#message');
var $chat = $('#chat');

$messageForm.submit(function(e){
e.preventDefault();
socket.emit('send message',$messageBox.val());
$messageBox.val('');
});
socket.on('new message', function(data){
$chat.append(data + "<br/>");
});
});
</script>
</body>
</html>

Ya con esto tenemos un pequeño chat que recibe y envía texto


domingo, 12 de julio de 2015

Ahora vamos con Node.js

Chilpancingo, Gro. a 12 de Julio del 2015.- Pues si, ahora vamos a probar con NODE.JS no soy el mas indicado para explicar que es esta plataforma, pero a grandes rasgos con Node.js ya se puede ejecutar código JavaScript en el servidor, lo que desde hace varios años se ha venido haciendo desde el navegador en el equipo cliente, claro que no solamente en eso radica la gran potencia de Node.js.

Otro beneficio que podemos enumerar de Node.js es la posibilidad de ejecutar muchas operaciones de manera rápida y que en todo momento responda a eventos sin la necesidad de estar sujeto a terminar un proceso.

Existe en la red un cantidad muy extensa de material de apoyo para aprender Node.js, pero dejare aquí unos sitios donde comenzar:


Bueno es todo lo que puedo decir por este momento, aun no tengo códigos que mostrar ya que estoy en fase de aprendizaje.


viernes, 9 de enero de 2015

Feliz 2015

Chilpancingo, Gro. 09 de Enero de 2015, pues bueno ya es 2015 y aquí he regresado a escribir un poco y desear que sea un año de lo mejor para todos, que muchos de los conflictos que se viven en nuestro país México se resuelvan de la mejor manera, y claro que se empiece por Chilpo, ya que van varios meses que esta un poco complicado.



jueves, 15 de mayo de 2014

Proyecto de gestion de contratos con Java y MySQL

En esta ocasión traigo un proyecto de ejemplo para gestionar una tabla con datos de contratos, para ello se utilizara el motor de bases de datos MySQL y para la parte de insertar, editar y borrar se programara una interfaz gráfica con JAVA.

El programa final se vera de la siguiente forma:



Primero se creara la tabla con la siguiente estructura:

CREATE TABLE IF NOT EXISTS `contratos` (
  `Numero` varchar(60) NOT NULL,
  `DescCorta` varchar(180) NOT NULL,
  `DescLarga` text NOT NULL,
  `Importe` decimal(18,2) NOT NULL,
  `FechaIni` date NOT NULL,
  `FechaFin` date NOT NULL,
  PRIMARY KEY (`Numero`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

El programa constara de cuatro clases que serán necesarias para la correcta ejecución:

  • Clase manejadorBD
  • Clase Contrato
  • Clase ventanaGestion
  • Clase GestionContratos
La clase manejadorBD tiene los métodos para manipular la conexión a la base de datos y la acciones de insertar, actualizar y borrar.


La clase Contrato tiene los atributos y métodos necesarios para manipular los datos del contrato como crear uno nuevo, modificar y borrar.

La clase ventanaGestion es necesaria para crear la interfaz gráfica que vera el usuario.

Por ultimo la clase GestionContratos tiene el método main que es donde iniciara el programa.

Aquí dejo el código final, que casi en su totalidad es propio pero no niego que algunas partes han sido tomadas de foros y de las paginas http://docs.oracle.com/ y http://www.chuidiang.com/ 

import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.text.DecimalFormat;
import javax.swing.text.NumberFormatter;
import java.text.SimpleDateFormat;
import java.text.ParseException;

/** * @author http:// dataguerrero.blogspot.mx
*/

class manejadorBD {
    String host = "localhost";
    String bd = "obras";
    String usuario = "root";
    String password = "123456admin";    
    String mensajeCorrecto = "La información se almaceno de forma correcta";
        
    public Connection nuevaConexion() throws Exception
    {
        Class.forName("com.mysql.jdbc.Driver");                            
        return DriverManager.getConnection ("jdbc:mysql://" + host + "/" + bd,usuario, password);
    }
    
    public boolean ejecutaQuery(String strQuery)
    {
    boolean resultado = false;
        Connection conexion = null;
        try            
            {            
                conexion = nuevaConexion();
                Statement st = conexion.createStatement();                
                st.executeUpdate(strQuery, Statement.RETURN_GENERATED_KEYS);
                resultado = true;
                st.close();                
            }
        catch (Exception e)
            {            
                resultado = false;
            }
        finally {
            try
            {
                if(conexion != null)
                    conexion.close();
            }
            catch(Exception e)
            {
                resultado = false;
            }
        }
        return resultado;
    }       
}

class Contrato {
String Numero;
String DescCorta;
String DescLarga;
Double Importe;
String FechaIni;
String FechaFin;

public Contrato()
{
this.Numero = "";
this.DescCorta = "";
this.DescLarga = "";
this.Importe = 0.00;
this.FechaIni = "";
this.FechaFin = "";
}

public Contrato(String Numero, String DescCorta, String DescLarga, Double Importe, String FechaIni, String FechaFin)
{
this.Numero = Numero;
this.DescCorta = DescCorta;
this.DescLarga = DescLarga;
this.Importe = Importe;
this.FechaIni = FechaIni;
this.FechaFin = FechaFin;
}

public boolean insertar()
{
String strQuery = "INSERT INTO contratos VALUES('"
+ this.Numero + "','" + this.DescCorta + "','" + this.DescLarga + "'," + this.Importe + ",'" + this.FechaIni + "','" + this.FechaFin + "');";
manejadorBD conexion = new manejadorBD();
boolean resultado = conexion.ejecutaQuery(strQuery);
return resultado;
}

public boolean modificar()
{
String strQuery = "UPDATE contratos SET Numero='"
+ this.Numero + "',DescCorta='" + this.DescCorta + "',DescLarga='" + this.DescLarga + "',Importe=" + this.Importe + ",FechaIni='" 
+ this.FechaIni + "',FechaFin='" + this.FechaFin + "' WHERE Numero='" + this.Numero + "'";
manejadorBD conexion = new manejadorBD();
boolean resultado = conexion.ejecutaQuery(strQuery);
return resultado;
}

public boolean borrar()
{
manejadorBD conexion = new manejadorBD();
boolean resultado = conexion.ejecutaQuery("DELETE FROM contratos WHERE Numero='" + this.Numero + "'");
return resultado;
}

public String toString()
{
return this.Numero;
}
}

class ventanaGestion {
JFrame ventana = new JFrame("Gestion de Contratos");
JPanel panelFormulario = new JPanel();
JPanel panelBotones = new JPanel();
JLabel lblLista = new JLabel("Lista de Contratos");
JComboBox<Contrato> listaContratos = new JComboBox<>();
    DefaultComboBoxModel<Contrato> modeloContratos = new DefaultComboBoxModel<>();
JLabel lblNumero = new JLabel("Numero de Contrato");
JTextField txtNumero = new JTextField();
JLabel lblDescCorta = new JLabel("Descripcion Corta");
JTextField txtDescCorta = new JTextField();
JLabel lblDescLarga = new JLabel("Desc. Completa");
JTextField txtDescLarga = new JTextField();
JLabel lblImporte = new JLabel("Importe");
JFormattedTextField txtImporte;
JLabel lblFechaIni = new JLabel("Fecha de Inicio");
JFormattedTextField txtFechaIni;
JLabel lblFechaFin = new JLabel("Fecha de Conclusion");
JFormattedTextField txtFechaFin;
JButton btnNuevo = new JButton("Contrato Nuevo");
JButton btnModificar = new JButton("Modificar Contrato");
JButton btnQuitar = new JButton("Quitar Contrato");
JButton btnGuardar = new JButton("Guardar");
JButton btnCancelar = new JButton("Cancelar");    
int ancho;
int alto;
int opcion;

ventanaGestion()
{
ancho = 640;
alto = 300;
opcion = 0;
ventana.setSize(ancho,alto);
Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize();        
        ventana.setLocation((pantalla.width/2-(ancho/2)),pantalla.height/2-(alto/2));
ventana.setLayout(null);
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void interfazGestion()
{
panelFormulario.setLayout(null);
lblLista.setBounds(5,5,120,30);
listaContratos.setBounds(130,5,280,30);
listaContratos.setModel(modeloContratos);
lblNumero.setBounds(5,40,120,30);
txtNumero.setBounds(130,40,280,30);
lblDescCorta.setBounds(5,75,120,30);
txtDescCorta.setBounds(130,75,(ancho - 160),30);
lblDescLarga.setBounds(5,110,120,30);
txtDescLarga.setBounds(130,110,(ancho - 160),30);
lblImporte.setBounds(5,145,120,30);
DecimalFormat NumeroDecimal = new DecimalFormat("0.00");
NumberFormatter formatoImporte = new NumberFormatter(NumeroDecimal);
formatoImporte.setValueClass(Double.class);
formatoImporte.setAllowsInvalid(false);
txtImporte = new JFormattedTextField(formatoImporte);
txtImporte.setBounds(130,145,140,30);
lblFechaIni.setBounds(5,180,120,30);
txtFechaIni = new JFormattedTextField(new SimpleDateFormat("yyyy-MM-dd"));
txtFechaIni.setValue(new java.util.Date());
txtFechaIni.setBounds(130,180,140,30);
lblFechaFin.setBounds(320,180,120,30);
txtFechaFin = new JFormattedTextField(new SimpleDateFormat("yyyy-MM-dd"));
txtFechaFin.setValue(new java.util.Date());
txtFechaFin.setBounds(470,180,140,30);
habilitarGuardadoCancelar(false);
panelFormulario.add(lblLista);
panelFormulario.add(listaContratos);
panelFormulario.add(lblNumero);
panelFormulario.add(txtNumero);
panelFormulario.add(lblDescCorta);
panelFormulario.add(txtDescCorta);
panelFormulario.add(lblDescLarga);
panelFormulario.add(txtDescLarga);
panelFormulario.add(lblImporte);
panelFormulario.add(txtImporte);
panelFormulario.add(lblFechaIni);
panelFormulario.add(txtFechaIni);
panelFormulario.add(lblFechaFin);
panelFormulario.add(txtFechaFin);
panelBotones.add(btnNuevo);
panelBotones.add(btnModificar);
panelBotones.add(btnQuitar);
panelBotones.add(btnGuardar);
panelBotones.add(btnCancelar);
panelFormulario.setBounds(0,0,ancho,215);
panelBotones.setBounds(0,215,ancho,60);
ventana.add(panelFormulario);
ventana.add(panelBotones);
}

public void show()
{
interfazGestion();
btnNuevo.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
nuevo();

});

btnModificar.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
modificar();

});

btnQuitar.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e){
quitar();
}
});

btnGuardar.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
guardar();

});

btnCancelar.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
if(listaContratos.getSelectedIndex()>-1)
listaContratos.setSelectedIndex(listaContratos.getSelectedIndex());
opcion = 0;
habilitarGuardadoCancelar(false);

});

listaContratos.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(listaContratos.getSelectedIndex()>-1){
                    Contrato RegSeleccionado = modeloContratos.getElementAt(listaContratos.getSelectedIndex());                    
                    llenaCampos(RegSeleccionado);                  
                }
            }
});
llenarTablaContratos();
ventana.setVisible(true);
}

    public void llenarTablaContratos()
    {
        manejadorBD losContratos = new manejadorBD();
        Connection con = null;
        try
        {
            con = losContratos.nuevaConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM contratos");                        
            while (rs.next())
            {                
                Contrato objeto = new Contrato(
                        rs.getObject("Numero").toString(),
                        rs.getObject("DescCorta").toString(),
                        rs.getObject("DescLarga").toString(),
                        Double.parseDouble(rs.getObject("Importe").toString()),
                        rs.getObject("FechaIni").toString(),
                        rs.getObject("FechaFin").toString());
                modeloContratos.addElement(objeto);
            }
            rs.close();    
        }
        catch (Exception e)
            {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ocurrio un Error", JOptionPane.ERROR_MESSAGE);
            }
        finally 
        {
            try
            {
                if(con != null)
                    con.close();
            }
            catch(Exception e)
            {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ocurrio un Error", JOptionPane.ERROR_MESSAGE);            
            }
        }
    }

public void nuevo()
{
txtNumero.setText("");
txtDescCorta.setText("");
txtDescLarga.setText("");
txtImporte.setText("0.00");
txtFechaIni.setValue(new java.util.Date());
txtFechaFin.setValue(new java.util.Date());
habilitarGuardadoCancelar(true);
txtNumero.requestFocus(true);
opcion = 1;
}

public void modificar()
{
habilitarGuardadoCancelar(true);
opcion = 2;
}

public void quitar()
{
if(JOptionPane.showConfirmDialog(null, "Realmente desea borrar el contrato?", "Advertencia", JOptionPane.OK_OPTION)==JOptionPane.OK_OPTION)
{
Contrato registro = new Contrato(txtNumero.getText(), txtDescCorta.getText(),
txtDescLarga.getText(), Double.parseDouble(txtImporte.getText()),
txtFechaIni.getText(), txtFechaFin.getText());
boolean resultado = registro.borrar();
if(resultado)
JOptionPane.showMessageDialog(null, "Se quito el contrato con numero: " + registro,"Aviso", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(null, "Error no se quito el contrato", "Aviso de Error", JOptionPane.ERROR_MESSAGE);

}
}

public void guardar()
{
boolean resultado = false;
String strMensaje = "";
Contrato registro = new Contrato(txtNumero.getText(), txtDescCorta.getText(),
txtDescLarga.getText(), Double.parseDouble(txtImporte.getText()),
txtFechaIni.getText(), txtFechaFin.getText());
switch(opcion)
{
case 1:
resultado = registro.insertar();
if(resultado)
{
strMensaje = "Se agrego el contrato con numero: " + registro;
int fila = listaContratos.getItemCount();
modeloContratos.insertElementAt(registro,fila);
listaContratos.setSelectedIndex(fila);
}
else
strMensaje = "Error con el guardado del contrato";
break;
case 2:
resultado = registro.modificar();
if(resultado)
{
int fila = listaContratos.getSelectedIndex();                                        
strMensaje = "Se actualizo el contrato con numero: " + registro;
modeloContratos.removeElementAt(fila);
modeloContratos.insertElementAt(registro,fila);
listaContratos.setSelectedIndex(fila);
}
else
strMensaje = "Error no se actualizo el contrato";
break;
}
if(resultado)
JOptionPane.showMessageDialog(null, strMensaje,"Aviso", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(null, strMensaje, "Aviso de Error", JOptionPane.ERROR_MESSAGE);
opcion = 0;
habilitarGuardadoCancelar(false);
}

public void habilitarGuardadoCancelar(boolean opcion)
{
listaContratos.setEnabled(!opcion);
txtNumero.setEnabled(opcion);
txtDescCorta.setEnabled(opcion);
txtDescLarga.setEnabled(opcion);
txtImporte.setEnabled(opcion);
txtFechaIni.setEnabled(opcion);
txtFechaFin.setEnabled(opcion);
btnCancelar.setEnabled(opcion);
btnGuardar.setEnabled(opcion);
btnNuevo.setEnabled(!opcion);
btnModificar.setEnabled(!opcion);
btnQuitar.setEnabled(!opcion);
}

public void llenaCampos(Contrato RegSeleccionado)
{
SimpleDateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd");
txtNumero.setText(RegSeleccionado.Numero);
txtDescCorta.setText(RegSeleccionado.DescCorta);
txtDescLarga.setText(RegSeleccionado.DescLarga);
txtImporte.setText(String.valueOf(RegSeleccionado.Importe));
java.util.Date fechaInicio = null;
try {
fechaInicio = formatoFecha.parse(RegSeleccionado.FechaIni); 
txtFechaIni.setValue(fechaInicio);
}
catch (ParseException ex) { 
txtFechaIni.setValue(new java.util.Date());
}        
txtFechaFin.setText(RegSeleccionado.FechaFin);
}
}

public class GestionContratos { 
public static void main(String[] args) {
ventanaGestion ventana = new ventanaGestion();
ventana.show();
}
}

Como nota final debo mencionar que el programa no esta terminado, ya que requiere de validación de datos que se capturan, manejos de excepciones y otros ajustes, pero la intención es de mostrar un poco del uso de MySQL y JAVA.