Muchas veces cuando hacemos un programa y queremos que las modificaciones que realizamos en nuestra aplicacion a modo de personalización en tiempo de ejecucion , como colores, tipo de letra, tamaño de la letra, color de la letra, etc, queremos que estas se guarden para no tener que realizar los mismos cambios una y otra vez.
Maneras de realizar esto creo que hay muchas, la mas sencilla que se me ocurre es utilizar un archivo de texto donde guardar nuestros cambios y cargarlos desde ahi a la aplicacion cada vez que iniciemos el programa.Que necesitas
- Netbeans 6.0 o sup
- Un editor de texto
- imaginacion
Proyecto
Lo que haremos sera crear una aplicacion en netbeans, el cual contara con dos interfaces, la primera, la principal, donde se colocaran los cambios que hagamos, la segunda interfaz, nos servira como un panel de configuracion, esta aplicacion, al momento de iniciar, cargara un archivo de texto donde se encontraran las configuraciones de color de los paneles (FONDO, PANEL1, PANEL2, PANEL3), y tipo, tamaño, estilo y color de fuente de letra, haciendo un total de 8 configuraciones que podremos guardar y cargar en el programa.
Si el archivo de configuracion que llamaremos "miconfiguracion.txt" no existe, el programa creara uno con una configuracion por defecto y cargara este en la aplicacion. este archivo se encuentra o se creara junto al JAR de la aplicacion, en el mismo directorio de este.
Manos a la obra
1. Nuestro proyecto se llamara "configuracion", crea este en netbeans y añade dos JFrames "Aplicacion.java" y "Configurar.java", añade una tercera clase "miconfiguracion.java".
2. Ahora diseña la interfaz para "aplicacion.java" como la imagen de abajo, recuerda los nombres en rojo son importantes, colocalos como estan:
3. Diseña la interfaz para "configurar,java", esta interfaz nos servira como un panel de configuracion donde podremos realizar nuestros cambios.
4. Si llegaste hasta aqui, ahora toca escribir el codigo que nos permita manejar nuestro archivo de configuracion "miconfiguracion.txt", este archivo de texto, esta compuesto de 8 campos separados por el caracter "/", estos 8 campos corresponden a las 8 modificaciones que podemos realizar en la aplicacion, /Color de fondo/ Color de panel 1/ Color de panel 2/ Color de Panel 3/ Tipo de fuente/ Estilo de la fuente (normal, negrilla, cursiva, cursiva negrilla)/ Color de la fuente/ Tamaño de la fuente
No necesitas crear este archivo, lo creara el mismo programa que estamos haciendo, la clase para controlar las modificaciones se llama "miconfiguracion.java", el codigo es:
package configuracion;
import java.awt.Color;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JColorChooser;
/**
* @web http://jc-mouse.blogspot.com/
* @author Mouse
*/
public class miconfiguracion {
//configuracion por defecto
private String default_configuracion = "/-1118482/-1118482/-1118482/-1118482/Arial/1/-16777063/12/";
//direccion del archivo de texto
private String archivo_de_configuracion=System.getProperty("user.dir") + "/miconfiguracion.txt";
//Para leer archivo de texto
private File archivo = null;
private FileReader fr = null;
private BufferedReader br = null;
// para escribir en archivo
private FileWriter fichero = null;
private PrintWriter pw = null;
//almacena los valores leidos del archivo de miconfiguracion.txt
// donde los valores del vector:
// 0 a 3 -> son los colores de fondo, panel1, panel2 y panel3
// 4 -> Tipo de fuente
// 5 -> Estilo de fuente
// 6 -> Color de fuente
// 7 -> Tamaño de fuente
private Vector<String> vector = new Vector<String>(10,2);
public miconfiguracion() {
try {
Configuracion();
} catch (FileNotFoundException ex) {
Logger.getLogger(miconfiguracion.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(miconfiguracion.class.getName()).log(Level.SEVERE, null, ex);
}
}
/* abre un archivo de texto y lee el contenido */
private void Configuracion() throws FileNotFoundException, IOException{
String configuracion="";//contenido del archivo
//el archivo se encuentra en el mismo directorio que la aplicacion
archivo = new File(archivo_de_configuracion);
//si el archivo existe leemos la configuracion
if(archivo.exists()){
configuracion = Leer_configuracion();
}
else{//sino existe lo creamos
Guardar_Configuracion(default_configuracion);
configuracion = Leer_configuracion();
}
// el string que se retorno en "configuracion", lo separa mediante tokens y lo almacena
// en una variable de tipo vector
token(configuracion);
}
/* ABRE UN ARCHIVO DE TEXTO Y LEE EL CONENIDO EL CUAL RETORNA EN UN STRING */
private String Leer_configuracion() throws FileNotFoundException, IOException{
String tmp_c="";
fr = new FileReader(archivo);
br = new BufferedReader(fr);
// Lectura del fichero de texto
String linea = null;
while ((linea = br.readLine()) != null) {
tmp_c = tmp_c + linea;
}
fr.close();
return tmp_c;
}
/* separa la configuracion y los añade al vector */
private void token(String s){
//separamos los valores leidos en tokens
StringTokenizer tokens = new StringTokenizer(s,"/");
while(tokens.hasMoreTokens()){
vector.addElement(tokens.nextToken());
}
}
/* MUESTRA LA VENTA DE DIALOGO [ESCOGER COLOR]*/
public Color Escoger_Color(java.awt.event.ActionEvent evt){
Color color = JColorChooser.showDialog(null,"Escoja un color",((JButton)evt.getSource()).getBackground());
if(color!=null){return color;}else{return new Color(-1118482);}
}
//guarda las configuracion en el archivo de texto "miconfiguracion.txt"
public boolean Guardar_Configuracion(String t){
boolean ok = false;
try {
fichero = new FileWriter(archivo_de_configuracion);
pw = new PrintWriter(fichero);
pw.println(t);
ok = true;
fichero.close();
} catch (IOException ex) {
Logger.getLogger(miconfiguracion.class.getName()).log(Level.SEVERE, null, ex);
}
return ok;
}
/* DEVUELVE LOS VALORES ALMACENADOS EN EL VECTOR */
/* inicio */
public int Color_de_Fondo(){
return Integer.valueOf(vector.get(0).toString());
}
public int Color_Panel1(){
return Integer.valueOf(vector.get(1).toString());
}
public int Color_Panel2(){
return Integer.valueOf(vector.get(2).toString());
}
public int Color_Panel3(){
return Integer.valueOf(vector.get(3).toString());
}
public String Tipo_Fuente(){
return vector.get(4).toString();
}
public int Tipo_Estilo_Fuente(){
return Integer.valueOf(vector.get(5).toString());
}
public int Color_Fuente(){
return Integer.valueOf(vector.get(6).toString());
}
public int Size_Fuente(){
return Integer.valueOf(vector.get(7).toString());
}
/* fin */
}
Un poco largo el codigo, pero es sencillo, consiste, en metodos para leer el archivo de texto, si no existe lo crea, despues utilizar el StringTokenizer para separar las configuraciones y cargarlos en un vector, para que estas esten disponibles en cualquier momento. Asi mismo el metodo Guardar_Configuracion(String t), recibe un string con la cadena que formaremos con las modificaciones hechas para salvar en el archivo de texto.
5. En la clase interfaz aplicacion.java, añade el siguiente codigo:
public void inicializar(){
/* CONFIGURACION*/
miconfiguracion mc = new miconfiguracion();
//se carga la configuracion en los objetos
this.setBackground(new Color(mc.Color_de_Fondo()));
FONDO.setBackground(new Color(mc.Color_de_Fondo()));
PANEL1.setBackground(new Color(mc.Color_Panel1()));
PANEL2.setBackground(new Color(mc.Color_Panel2()));
PANEL3.setBackground(new Color(mc.Color_Panel3()));
Font f = new Font( mc.Tipo_Fuente(),mc.Tipo_Estilo_Fuente(),mc.Size_Fuente() );
TEXTO.setFont(f);
TEXTO.setForeground(new Color(mc.Color_Fuente()));
/* -- */
}
despues añade este en el constructor de la clase, para terminar, escribe en el evento de smConfigurar el siguiente codigo:
private void smConfigurarActionPerformed(java.awt.event.ActionEvent evt) {
configurar c = new configurar();
c.show();
}
6. Para terminar la aplicacion, en la clase interfaz configurar.java, declara
private miconfiguracion mc = new miconfiguracion();
private ButtonGroup buttongroup = new ButtonGroup();
private int OpcionSel;
Despues añade en el constructor de la clase:
public configurar() {
initComponents();
this.setLocationRelativeTo(null);
this.setTitle("Opciones de configuración...");
buttongroup.add(opcion1);
buttongroup.add(opcion2);
buttongroup.add(opcion3);
buttongroup.add(opcion4);
/* carga la configuracion en los objetos*/
//carga los colores en los jbutton
cmd0.setBackground(new Color(mc.Color_de_Fondo()));
cmd1.setBackground(new Color(mc.Color_Panel1()));
cmd2.setBackground(new Color(mc.Color_Panel2()));
cmd3.setBackground(new Color(mc.Color_Panel3()));
//carga el tipo de letra
for(int i=0;i<=cboTipo.getItemCount()-1;i++){
if(mc.Tipo_Fuente().equals(cboTipo.getItemAt(i).toString())){
cboTipo.setSelectedIndex(i);break;
}
}
//carga el tamaño de la fuente
for(int i=0;i<=cboSize.getItemCount()-1;i++){
if(mc.Size_Fuente()==Integer.valueOf(cboSize.getItemAt(i).toString())){
cboSize.setSelectedIndex(i);break;
}
}
//carga el estilo en el JRadioButton correspondiente
if(mc.Tipo_Estilo_Fuente()==0){opcion1.setSelected(true);}
if(mc.Tipo_Estilo_Fuente()==1){opcion2.setSelected(true);}
if(mc.Tipo_Estilo_Fuente()==2){opcion3.setSelected(true);}
if(mc.Tipo_Estilo_Fuente()==3){opcion4.setSelected(true);}
//carga el color de fondo
cmdFuente.setBackground(new Color(mc.Color_Fuente()));
/* fin configurar */
}
Ahora el el JButton: cmdCambios, escribe el siguiente codigo:
private void cmdCambiosActionPerformed(java.awt.event.ActionEvent evt) {
/* SE GUARDA LA NUEVA CONFIGURACION */
//color fondo/color panel1/color panel2/color panel3/Tipo fuente/estilo fuente/color fuente/tamaño fuente
if(
mc.Guardar_Configuracion("/"+cmd0.getBackground().getRGB()+"/"+
cmd1.getBackground().getRGB()+"/"+
cmd2.getBackground().getRGB()+"/"+
cmd3.getBackground().getRGB()+"/"+
cboTipo.getSelectedItem().toString()+"/"+
OpcionSel+"/"+
cmdFuente.getBackground().getRGB()+"/"+
cboSize.getSelectedItem().toString()+"/"
))
{
JOptionPane.showMessageDialog(this,"La nueva configuracion se guardo correctamente \nLos cambios se veran la proxima ves que inicie la aplicacion...");
}
}
finalmente, debes añadir los eventos en los objetos que declaramos mas arriba, este codigo no lo copies y pegues, sino fijate bien, donde debe ir cada instruccion
private void cmd3ActionPerformed(java.awt.event.ActionEvent evt) {
cmd3.setBackground(mc.Escoger_Color(evt));
}
private void cmd2ActionPerformed(java.awt.event.ActionEvent evt) {
cmd2.setBackground(mc.Escoger_Color(evt));
}
private void cmd1ActionPerformed(java.awt.event.ActionEvent evt) {
cmd1.setBackground(mc.Escoger_Color(evt));
}
private void cmdFuenteActionPerformed(java.awt.event.ActionEvent evt) {
cmdFuente.setBackground(mc.Escoger_Color(evt));
}
private void opcion1ActionPerformed(java.awt.event.ActionEvent evt) {
OpcionSel =0;
}
private void opcion2ActionPerformed(java.awt.event.ActionEvent evt) {
OpcionSel =1;
}
private void opcion3ActionPerformed(java.awt.event.ActionEvent evt) {
OpcionSel =2;
}
private void opcion4ActionPerformed(java.awt.event.ActionEvent evt) {
OpcionSel =3;
}
private void cmd0ActionPerformed(java.awt.event.ActionEvent evt) {
cmd0.setBackground(mc.Escoger_Color(evt));
}
ejecuta el proyecto, si no tienes ningun error debes tener algo como esto
Finalmente el codigo fuente para los mas vagos :)
Muchas gracias por el tiempo que dedica a los tutoriales. Este es muy útil.
ResponderEliminarGracias JcMouse por este y todos los proyectos tan buenos que publicas... me han ayudado mucho...
ResponderEliminarademas la explicacion es muy buena y facil de enterder..
Johp3
millon gracias eres lo maximo por gente como tu esuqe nosostros nos perfeccionamos porqe loq ue nos enseñan en clase es poco con lo que e aprendido contigo gracias
ResponderEliminarLa verdad me dejas sorprendiido
ResponderEliminaraunq ya tiiene muxo tiempo tu publicacion a penas lo estoi viendo
y la verdad me sorprendes
sige asiii eres un master
buena suerte
atttE: desde mexico cancun quientana roo ...jose alcudia
Hola Jc mouse, siempre sigo tus ejemplos... te felicito por tu dedicación y sobre todo como compartes los conocimientos con los que estamos iniciando...
ResponderEliminarSobre este programa quería consultarte algo, mira: A mi se me vino la misma pregunta, como puedo guardar la configuración de mi aplicación, pues y opté como tu leer un archivo.txt, pero tengo un problema:
Cuando corro la aplicación trabaja perfectamente, pero cuando se construye el .jar no funciona... porque se da esto?? bueno, tienes otra idea para guardar la configuración y no tener este inconveniente, estaba leyendo y dice que no es factible sobreescribir el archivo txt dentro del jar, lo que hay que hacer es extraer, modificar y zipiar nuevamente...
Quedo a la espera de tus comentario y muchas gracias por tus valioso conocimiento.
Saludos
Leandro
Gracias por el aporte.
ResponderEliminarMe sale eso al querer bajar el código fuente
Warning: mysql_connect() [function.mysql-connect]: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) in /data/webs/sites/y/a/yachaywasi/web/blog/download/lib/conectate.php on line 4
error de conexion