He encontrado esta página donde puedes descargarte un fuente... un dolor de cabeza menos, no hace falta reinventar la rueda.
http://jdbm.sourceforge.net/
jueves, 24 de marzo de 2011
miércoles, 23 de marzo de 2011
Highlight casero: fase 1
Pues ya tengo mi código de resaltado de código en fase 1!!!
Para este primer caso, únicamente buscamos una cadena "bu" la cual resaltar.
String n = evt.getKeyChar()+"";
if (n.equals(" ") || n.equals("\n"))
{
if (((s.substring(ini, txtEdicion.getCaretPosition()).trim()).equals("bu")))
{
color = sc.addStyle("ConstantWidth",null);
StyleConstants.setForeground(color, Color.red);
doc.setCharacterAttributes(ini, txtEdicion.getCaretPosition(), color, false);
}
else
{
color = sc.addStyle("ConstantWidth",null);
StyleConstants.setForeground(color, Color.black);
doc.setCharacterAttributes(ini, txtEdicion.getCaretPosition(), color, false);
}
ini = txtEdicion.getCaretPosition();
}
Buscamos carácter de inicio, carácter de final, si coincide con "bu" lo marcamos de rojo.
Esto, en la fase 2, será en lugar de una simple cadena, un array de ellas con algún tipo de datos que se ajuste a su fin... estoy pensando en árboles...
Veremos qué tal :)
EDITO: refinando el código
String s = txtEdicion.getText();
String n = evt.getKeyChar()+"";
color = sc.addStyle("ConstantWidth",null);
StyleConstants.setForeground(color, Color.black);
if (n.equals(" ") || n.equals("\n"))
{
if ((a.contains((s.substring(ini, txtEdicion.getCaretPosition()).trim()))))
{
color = sc.addStyle("ConstantWidth",null);
StyleConstants.setForeground(color, Color.blue);
doc.setCharacterAttributes(ini, txtEdicion.getCaretPosition(), color, false);
}
ini = txtEdicion.getCaretPosition();
}
De vez en cuando devuelve alguna excepción que tengo que terminar de controlar, y ahora ya está buscando en un arraylist. Es un principio.
Para este primer caso, únicamente buscamos una cadena "bu" la cual resaltar.
String n = evt.getKeyChar()+"";
if (n.equals(" ") || n.equals("\n"))
{
if (((s.substring(ini, txtEdicion.getCaretPosition()).trim()).equals("bu")))
{
color = sc.addStyle("ConstantWidth",null);
StyleConstants.setForeground(color, Color.red);
doc.setCharacterAttributes(ini, txtEdicion.getCaretPosition(), color, false);
}
else
{
color = sc.addStyle("ConstantWidth",null);
StyleConstants.setForeground(color, Color.black);
doc.setCharacterAttributes(ini, txtEdicion.getCaretPosition(), color, false);
}
ini = txtEdicion.getCaretPosition();
}
Buscamos carácter de inicio, carácter de final, si coincide con "bu" lo marcamos de rojo.
Esto, en la fase 2, será en lugar de una simple cadena, un array de ellas con algún tipo de datos que se ajuste a su fin... estoy pensando en árboles...
Veremos qué tal :)
EDITO: refinando el código
String s = txtEdicion.getText();
String n = evt.getKeyChar()+"";
color = sc.addStyle("ConstantWidth",null);
StyleConstants.setForeground(color, Color.black);
if (n.equals(" ") || n.equals("\n"))
{
if ((a.contains((s.substring(ini, txtEdicion.getCaretPosition()).trim()))))
{
color = sc.addStyle("ConstantWidth",null);
StyleConstants.setForeground(color, Color.blue);
doc.setCharacterAttributes(ini, txtEdicion.getCaretPosition(), color, false);
}
ini = txtEdicion.getCaretPosition();
}
De vez en cuando devuelve alguna excepción que tengo que terminar de controlar, y ahora ya está buscando en un arraylist. Es un principio.
jueves, 17 de marzo de 2011
Emoticonos: código final
Aunque puede parecer un poco raro... pero un cacho de código extraído de mi fuente para poder coger lo que se mete en un JTextPane, y teniendo un Vector de emoticonos, poder añadirlo :)
StyledDocument doc = (StyledDocument)texto.getDocument();
Style style = doc.addStyle("StyleName", null);
int i=0,j=1; // Juego de posiciones para detectar emoticonos
if (sLinea.indexOf(":")>0) // Es mensaje de conversación, está separado el nick del mensaje con :
{
String [] aux = sLinea.split(":", 2);
i=aux[1].indexOf(":",j); // Posición donde encontramos los : para ver si es emoticono
doc.insertString(doc.getLength(), aux[0]+": ",null); // El donde se dice "usuario:" para identificar el mensaje
if (aux[1].length() > 2) // Escribimos : pero nada más, no buscar si la siguiente palabra constituye emoticono
while (i>0) // mientras tengamos referencias a que se encuentran : en el mensaje
{
doc.insertString(doc.getLength(), aux[1].substring(j,i),null); // escribimos hasta llegar al punto de los :
try
{
if (ic.contains(aux[1].substring(i,i+2))) // Está la combinación : + caracter en el vector de emoticonos reconocidos
{
StyleConstants.setIcon(style, new ImageIcon(iconos +aux[1].substring(i,i+2))); // Creamos el icono
doc.insertString(doc.getLength(), "ignored text", style); // lo metemos
}
else
doc.insertString(doc.getLength(), aux[1].substring(i,i+2),null); // no contiene emoticono reconocido, escribimos tal cual
j=i+2; // incrementamos la próxima posición de lectura para buscar emoticonos
i=aux[1].indexOf(":",j); // miramos si tenemos más : en el mensaje
}
catch (StringIndexOutOfBoundsException e) // fuera de rango, forzamos a que no siga buscando y que escriba lo que le quede
{
i = 0;
}
}
doc.insertString(doc.getLength(), aux[1].substring(j)+"\n",null); // acabamos escribiendo el resto del texto
texto.setCaretPosition(texto.getDocument().getLength()); // para que el scroll vaya avanzando
}
else // Mensaje de usuario conectado/desconectado
doc.insertString(doc.getLength(), sLinea+"\n",null);
miércoles, 16 de marzo de 2011
Emoticonos en el chat
Aprovechando el componente JTextPane, y teniendo una lista de iconos disponible (esto es lo que a mi me falta) podemos incluir emoticonos en el chat.
Para ello implementamos algo así como:
int i,j = 0;
i = sLinea.indexOf(":P",j);
StyledDocument doc = (StyledDocument)texto.getDocument();
Style style = doc.addStyle("StyleName", null);
while (i > 0)
{
doc.insertString(doc.getLength(), sLinea.substring(j, i),null);
// The image must first be wrapped in a style
StyleConstants.setIcon(style, new ImageIcon("icono.jpg"));
// Insert the image at the end of the text
doc.insertString(doc.getLength(), "ignored text", style);
j = i + 2;
i = sLinea.indexOf(":P",j);
}
doc.insertString(doc.getLength(), sLinea.substring(j)+"\n",null);
Y para este caso, cuando añadimos en el mensaje :P nos añade el emoticono.
Para ello implementamos algo así como:
int i,j = 0;
i = sLinea.indexOf(":P",j);
StyledDocument doc = (StyledDocument)texto.getDocument();
Style style = doc.addStyle("StyleName", null);
while (i > 0)
{
doc.insertString(doc.getLength(), sLinea.substring(j, i),null);
// The image must first be wrapped in a style
StyleConstants.setIcon(style, new ImageIcon("icono.jpg"));
// Insert the image at the end of the text
doc.insertString(doc.getLength(), "ignored text", style);
j = i + 2;
i = sLinea.indexOf(":P",j);
}
doc.insertString(doc.getLength(), sLinea.substring(j)+"\n",null);
Y para este caso, cuando añadimos en el mensaje :P nos añade el emoticono.
lunes, 14 de marzo de 2011
Chateando
Cuando me pregunten si estoy enganchado a Internet, diré que si, que me he pasado toda la noche chateando.
Como diría Apache: It Works!
Ahora "sólo" toca maquearlo...
Como diría Apache: It Works!
Ahora "sólo" toca maquearlo...
miércoles, 9 de marzo de 2011
Hilos haciendo el trabajo sucio
Pues dentro del editor de texto usando hilos, surge la necesidad de que se llame a un hilo para que haga el trabajo sucio de tener que contar los caracteres.
Para ello, justo después que se copia el contenido del editor sobre el componente de texto, llamamos al hilo para que cuente el contenido de dicho texto.
No tiene pinta de ser nada del otro mundo, un simple cálculo y a morir (como bien dirían los Saratoga).
Utilizamos un: new Hilo().start();
Siendo Hilo una clase que extiende Threads y que está dentro de nuestra clase principal.
Todo un abanico de posibilidades...
Para ello, justo después que se copia el contenido del editor sobre el componente de texto, llamamos al hilo para que cuente el contenido de dicho texto.
No tiene pinta de ser nada del otro mundo, un simple cálculo y a morir (como bien dirían los Saratoga).
Utilizamos un: new Hilo().start();
Siendo Hilo una clase que extiende Threads y que está dentro de nuestra clase principal.
Todo un abanico de posibilidades...
miércoles, 2 de marzo de 2011
Tiembla bloc de notas
Pues en este proyecto... sobretodo me he encontrado con lo porculero que es el entorno para que las cosas salgan en su sitio... me recuerda a las librerías fltk de C++ que vimos en Entornos de Usuario (y que no echo nada de menos).
Posiblemente sea por lo sencillo que puede resultar en entornos .NET (o similares) agregar un botón a un formulario donde queremos con el GUI que estamos todos acostumbrados a ver. Cuando investigue mas con Jigloo opinaré más a fondo :P
De momento... que tiemble el bloc de notas!!!!
Posiblemente sea por lo sencillo que puede resultar en entornos .NET (o similares) agregar un botón a un formulario donde queremos con el GUI que estamos todos acostumbrados a ver. Cuando investigue mas con Jigloo opinaré más a fondo :P
De momento... que tiemble el bloc de notas!!!!
Highlight
No, no es la nueva de Crepúsculo.
Se refiere a una propiedad que tiene el componente JTextPane con el cual podemos definir coloreado a nuestro texto.
¿Para qué sirve eso? para, por ejemplo, que en entornos tipo Eclipse, cuando ponemos una palabra reservada nos la marque en otro colorcito.
En cuanto tenga un poco más de soltura con el entorno (sobretodo con Swing) y tiempo (para cuando los días de 30 horas?) me dedicaré a portar mi "proyecto" de editor PHP que hice hace un tiempo en Gambas, Joa ( http://www.al081570.es/joa )
Se refiere a una propiedad que tiene el componente JTextPane con el cual podemos definir coloreado a nuestro texto.
¿Para qué sirve eso? para, por ejemplo, que en entornos tipo Eclipse, cuando ponemos una palabra reservada nos la marque en otro colorcito.
En cuanto tenga un poco más de soltura con el entorno (sobretodo con Swing) y tiempo (para cuando los días de 30 horas?) me dedicaré a portar mi "proyecto" de editor PHP que hice hace un tiempo en Gambas, Joa ( http://www.al081570.es/joa )
martes, 1 de marzo de 2011
Coordenadas de pantalla
Me acabo de encontrar con una pequeña peculiaridad con el evento MouseEvent.
Resulta que el método getX() devuelve las coordenadas en las que se encuentra el ratón, pero siempre relativas al componente sobre el que le estemos llamando. ¿Qué quiere decir esto? pues que si estamos trabajando sobre el método getX() de un JFrame, no devolverá las mismas coordenadas que el método getX() de un JPanel.
En la aplicación real del asunto, me he topado con esto al intentar hacer el ejercicio de dibujar los circulitos por la pantalla al presionar, ya que estaba cogiendo las coordenadas del JFrame y salía el circulito desplazado en la pantalla.
Viva Google :)
Resulta que el método getX() devuelve las coordenadas en las que se encuentra el ratón, pero siempre relativas al componente sobre el que le estemos llamando. ¿Qué quiere decir esto? pues que si estamos trabajando sobre el método getX() de un JFrame, no devolverá las mismas coordenadas que el método getX() de un JPanel.
En la aplicación real del asunto, me he topado con esto al intentar hacer el ejercicio de dibujar los circulitos por la pantalla al presionar, ya que estaba cogiendo las coordenadas del JFrame y salía el circulito desplazado en la pantalla.
Viva Google :)
lunes, 28 de febrero de 2011
sábado, 19 de febrero de 2011
Jigloo
Mirando un poco en la red, he encontrado un GUI para hacer aplicaciones con interfaz gráfico en Java, que además integra con Eclipse.
Para instalar el pluggin en Eclipse solo hay que ir a Help -> Install new Software y añadir el siguiente repositorio:
http://cloudgarden1.com/update-site
Para poder usar el GUI, simplemente añadir con File -> New -> Others -> GUI Forms
Iremos contando qué tal :)
Para instalar el pluggin en Eclipse solo hay que ir a Help -> Install new Software y añadir el siguiente repositorio:
http://cloudgarden1.com/update-site
Para poder usar el GUI, simplemente añadir con File -> New -> Others -> GUI Forms
Iremos contando qué tal :)
viernes, 18 de febrero de 2011
Ventanitas
El inicio de Swing me ha recordado a los inicios con fltk... es la posibilidad de abrir el "hola mundo" al "hola ventana".
Aunque se haya visto que se hace todo con instrucciones "a pelo", me imagino que llegaremos a ver algún tipo de IDE que nos ayude a organizar nuestras ventanitas tal y como se puede hacer en otros entornos (Visual Studio, Gambas, Mono...).
Tiempo al tiempo, Android, espérame ;)
Aunque se haya visto que se hace todo con instrucciones "a pelo", me imagino que llegaremos a ver algún tipo de IDE que nos ayude a organizar nuestras ventanitas tal y como se puede hacer en otros entornos (Visual Studio, Gambas, Mono...).
Tiempo al tiempo, Android, espérame ;)
jueves, 17 de febrero de 2011
Agenda acabada!!!
Pues he subido ya el entregable de la agenda en el aulavirtual.
Después de una semana horrible casi sin dormir, y teniendo que pedir día de fiesta en el curro hoy, la doy por subida, y si luego me apetece cambiaré algunas cosas que creo que se podría mejorar.
Únicamente no he conseguido generar la documentación... no encuentro en el synaptic el javadoc!!!
Pues eso... esta tarde siestecita :P
Después de una semana horrible casi sin dormir, y teniendo que pedir día de fiesta en el curro hoy, la doy por subida, y si luego me apetece cambiaré algunas cosas que creo que se podría mejorar.
Únicamente no he conseguido generar la documentación... no encuentro en el synaptic el javadoc!!!
Pues eso... esta tarde siestecita :P
miércoles, 16 de febrero de 2011
Borrar en array
¿Qué pasa si borramos elementos de un array mientras lo consultamos con un for each?
Pues que si coincide que es el último elemento del array, el foreach no lo reconoce y se ríe de nosotros!!!
Total... siempre podemos guardar una referencia a dicho elemento de la array, y borrarlo luego :)
Pues que si coincide que es el último elemento del array, el foreach no lo reconoce y se ríe de nosotros!!!
Total... siempre podemos guardar una referencia a dicho elemento de la array, y borrarlo luego :)
Esos errores tontos...
...de los que no se aprende.
Llevo bastante (por no decir mucho) rato buscando un error de implementación en las clases y las interfaces, idas y venidas de código, desesperación, frustración...
Cuando agregaba contactos a la agenda, me devolvía continuamente error de puntero a nulo, pero acabo de localizarlo!!! el problema no estaba en las clases ni las interfaces, sino en la función que tenía (para por cierto) preparada para leer desde fichero, algo parecido a esto:
Agenda aAgenda = new Agenda();
aAgenda = funcionqueabreelfichero();
y la funcionqueabreelfichero, si no encontraba un fichero válido, se inicializaba a null.
Total, cuando insertaba elementos la máquina virtual me miraba mal y me decía del mal que tenía que morir.
Moraleja: soy idiota...
Llevo bastante (por no decir mucho) rato buscando un error de implementación en las clases y las interfaces, idas y venidas de código, desesperación, frustración...
Cuando agregaba contactos a la agenda, me devolvía continuamente error de puntero a nulo, pero acabo de localizarlo!!! el problema no estaba en las clases ni las interfaces, sino en la función que tenía (para por cierto) preparada para leer desde fichero, algo parecido a esto:
Agenda aAgenda = new Agenda();
aAgenda = funcionqueabreelfichero();
y la funcionqueabreelfichero, si no encontraba un fichero válido, se inicializaba a null.
Total, cuando insertaba elementos la máquina virtual me miraba mal y me decía del mal que tenía que morir.
Moraleja: soy idiota...
martes, 15 de febrero de 2011
Perfilando la agenda
Al final, parece que me ha quedado clara la estructura que debe seguir la agenda del entregable de la primera parte del curso...
Dos clases, Persona y Empresa, que tienen una interfaz ObtenerDatos.
Dos clases, PersonaExt y EmpresaExt, que son hijas de Persona y Empresa (respectivamente) y que tienen una interfaz ObtenerDatosExt que es hija de ObtenerDatos.
Y de todo esto, tenemos una clase Agenda que implementa ObtenerDatosExt.
Si he entendido todo el proceso (espero que si), ObtenerDatosExt puede acceder, por ser hija, a los métodos de ObtenerDatos, que además al ser interfaz de Persona y Empresa, nos "abre" las puertas a sus métodos.
A su vez, tenemos PersonaExt y EmpresaExt, a través de las cuales, y por ser sus hijas, accedemos a sus métodos.
La clase Agenda es la que se encarga, en tiempo de ejecución, y con un arraylist de ObtenerDatosExt, la de determinar si el objeto que se le está pasando es un PersonaExt o EmpresaExt.
Al final, mi primera solución al problema, de la que desconfiaba (y con razón, tenía que sacar métodos propios de la clase en el propio main), no tenía nada que ver con el entramado en que ha acabado.
No se si estará bien o mal mi planteamiento, pero como necesito dormir antes de irme a currar... mañana será otro día.
Próximo reto: definir las excepciones, aclarar la función de la edad y documentar!!!
Dos clases, Persona y Empresa, que tienen una interfaz ObtenerDatos.
Dos clases, PersonaExt y EmpresaExt, que son hijas de Persona y Empresa (respectivamente) y que tienen una interfaz ObtenerDatosExt que es hija de ObtenerDatos.
Y de todo esto, tenemos una clase Agenda que implementa ObtenerDatosExt.
Si he entendido todo el proceso (espero que si), ObtenerDatosExt puede acceder, por ser hija, a los métodos de ObtenerDatos, que además al ser interfaz de Persona y Empresa, nos "abre" las puertas a sus métodos.
A su vez, tenemos PersonaExt y EmpresaExt, a través de las cuales, y por ser sus hijas, accedemos a sus métodos.
La clase Agenda es la que se encarga, en tiempo de ejecución, y con un arraylist de ObtenerDatosExt, la de determinar si el objeto que se le está pasando es un PersonaExt o EmpresaExt.
Al final, mi primera solución al problema, de la que desconfiaba (y con razón, tenía que sacar métodos propios de la clase en el propio main), no tenía nada que ver con el entramado en que ha acabado.
No se si estará bien o mal mi planteamiento, pero como necesito dormir antes de irme a currar... mañana será otro día.
Próximo reto: definir las excepciones, aclarar la función de la edad y documentar!!!
lunes, 14 de febrero de 2011
Errores en Eclipse
Cierto es que Eclipse es una herramienta muy potente, pero también es cierto que cada vez me pone más de los nervios
1º Su forma de indentar "si o si", y
2º Me da mensajes de error cuando no los hay, y me toca marear la perdiz para que refresque
En fin... con lo 2º quizás haré poco... pero investigaré si hay alguna forma de que me deje de indentar de esta forma.
¿Cómo indentáis vosotros?
Yo soy partidario de
static void main()
{
// código
}
1º Su forma de indentar "si o si", y
2º Me da mensajes de error cuando no los hay, y me toca marear la perdiz para que refresque
En fin... con lo 2º quizás haré poco... pero investigaré si hay alguna forma de que me deje de indentar de esta forma.
¿Cómo indentáis vosotros?
Yo soy partidario de
static void main()
{
// código
}
viernes, 11 de febrero de 2011
Final
Y le dice un campo final a otro...
VF1: "Oye, y tu porqué no te inicializas?"
VF2: "pse... luego, que ahora no me apetece..."
VF1: "cuanta pereza!!"
VF1: "Oye, y tu porqué no te inicializas?"
VF2: "pse... luego, que ahora no me apetece..."
VF1: "cuanta pereza!!"
jueves, 10 de febrero de 2011
Primera semana
Pues la verdad, ha sido un arranque tremendo de curso, lo que unos añitos atrás fue un semestre, ha sido una semana, que aunque no sean conceptos nuevos, hay que refrescarlos y recordarlos.
Ciertamente el ritmo del curso da miedo, y temo no llegar a poder abarcar todas las lecturas a las cuales hace referencia la guía de aprendizaje (a no ser que deje de dormir).
Todo sea por una buena causa!!
Ciertamente el ritmo del curso da miedo, y temo no llegar a poder abarcar todas las lecturas a las cuales hace referencia la guía de aprendizaje (a no ser que deje de dormir).
Todo sea por una buena causa!!
Fibonacci
Recordando esquemas algorítmicos...
int F(n)
{
if (n==1) return 1;
if (n==2) return 2
else return F(n-2)+F(n-1);
}
int F(n)
{
if (n==1) return 1;
if (n==2) return 2
else return F(n-2)+F(n-1);
}
martes, 8 de febrero de 2011
Los arrays!
Pues con el cacao que llevo encima... me acabo de encontrar con el problema de que, intentando declarar un array del tipo String, el compilador me devolvía un error.
Seguramente es algo que estará en las transparencias del curso... pero no me acordaba, y me ha tocado echar mano del Sr. Google.
Para poder definir una matriz de cualquier tipo de datos, debemos tratar dicha matriz como un objeto:
Tipo_datos variable[] = new Tipo_datos [dimension];
Lo tendré en cuenta para la próxima!!!
Seguramente es algo que estará en las transparencias del curso... pero no me acordaba, y me ha tocado echar mano del Sr. Google.
Para poder definir una matriz de cualquier tipo de datos, debemos tratar dicha matriz como un objeto:
Tipo_datos variable[] = new Tipo_datos [dimension];
Lo tendré en cuenta para la próxima!!!
lunes, 7 de febrero de 2011
Suscribirse a:
Comentarios (Atom)