style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Crear Archivo de configuración y manejo de imagenes!!!

Hola:

Disculpen todas las molestias que pueda estar ocasionando..... Como he comentado estoy intentando hace una aplicación en JAVA usando como IDE JCreator PRO. Elegí JAVA para que ésta aplicación pueda correr en equipos MAC, Linux y Windows. Pues en la empresa donde laboro hay estos tres diferentes OS y debe ser compatible entre las diferentes plataformas! Ahora he logrado hacer una interfaz así:

Ésta será la ventana que permitirá al usuario cambiar los datos de conexión a la base de datos (creo que es demasiado obvio ) Ahora me encontre con dos problemas!

1.- Manejar correctamente las imagenes: Necesito que mis imagenes queden integradas en el JAR si yo creo mi JAR y lo ejecuto NO VEO NADA DE IMAGENES a no ser que coloque una carpeta de imagenes en el mismo directorio de mi JAR y no quiero eso necesito que quede lo más encapsulado posible pero no se como hacer esto y tampoco tengo idea de como acceder a los datos cuando logre incrustarlos o meterlos al JAR.

2.- Crear un archivo de configuración: Quiero que la configuración generada por ésta ventana también sea guardada y manipulada dentro del JAR pues si el usuario decide llevarse la aplicación a otro equipo o cambiar de máquina sus preferencias queden guardadas! Leí que eso de la configuracion puede ser con un archivo de propiedades pero honestamente no se como se hace ni como guardar dicho archivo en el JAR.

Ojalá alguien pueda orientarme y sacarme de mi gran ignorancia sobre el tema gracias por tomarse la molestia de leer mi problema y muchas más si decides hecharme una mano.
Dejo la URL de descarga del programa que estoy haciendo para que tengan una mejor idea y puedan hacerme correcciones si estoy haciendo algo mal o reinvento la rueda como me dijo un colega de esta comunidad (pero de verdad estoy perdido en JAVA ) http://www.centromedicoatlixco.com/SIPCAR.rar

Saludos cordiales

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Puedes jalar ambos, tanto

Puedes jalar ambos, tanto imágenes como archivos de propiedades desde un InputStream, el cual te da un arreglo de bytes, y eso lo conviertes al objeto que deseas

Un ejemplo podría ser:

 InputStream stream = this.getClass().getResourceAsStream("/desde/ruta/raiz/hasta/tu/imagen.jpg");

o

 InputStream stream = this.getClass().getResourceAsStream("/desde/ruta/raiz/hasta/tu/archivo.properties");

ya con el stream de bytes, pues lo conviertes a:

Image image = null;
        try {
          image = ImageIO.read(stream);
          stream.close();
        }
         catch (Exception e) {
               e.printStackTrace( ); //o manejo mas decente de la excepcion
        }

y para properties

Properties properties = null;
        try {
          properties.load(stream);
          stream.close();
        }
         catch (Exception e) {
               e.printStackTrace( ); //o manejo mas decente de la excepcion
        }

Ahora, dos cosas

1.- Si usas esto dentro de un método estático, cambia un poco la llamada al inputStream por

NombreDeLaClase.class.getResourceAsStream();

2.-La ruta a tu carpeta de imagenes, la puedes poner dentro de un paquete específico, pero siempre llamándolo desde el paquete raíz y empezando por slash " / " precisamente para indicar que vas a buscar tu carpeta de imágenes desde la raíz del paquete.
Si llegaras a poner las imágenes dentro del mismo paquete que tu clase, entonces no se pone toda la ruta, sólo se pone
"./imagen.jpg"
Checa el punto, indica que se tiene que buscar la imagen en el paquete donde se encuentra la clase.

Espero haber contribuido a no hacer más grandes tus dudas ;)
Si puedes (y quieres) cuéntanos como te fue...suerte!!

Imagen de tux2003

Hola....

Hola:

Gracias por tomarte la molestia de responder a mi duda! Pero igual y es muy obvio y yo demasiado estupido pero no he logrado resolver el problema... Tengo una estructura de archivos así:

Según yo y mi infinita ignorancia estoy haciendo lo que me sugeriste con instrucciones más o menos así:

InptStream stream = this.getClass().getResourceAsStream("imagenes/background_Conexion.png");
                Image imgBackground = null;
        try {
          imgBackground = ImageIO.read(stream);
          stream.close();
        }
         catch (Exception e) {
               e.printStackTrace( );
        }

y asi:

InptStream stream = this.getClass().getResourceAsStream("/imagenes/background_Conexion.png");
                Image imgBackground = null;
        try {
          imgBackground = ImageIO.read(stream);
          stream.close();
        }
         catch (Exception e) {
               e.printStackTrace( );
        }

y asi:

InptStream stream = this.getClass().getResourceAsStream("./imagenes/background_Conexion.png");
                Image imgBackground = null;
        try {
          imgBackground = ImageIO.read(stream);
          stream.close();
        }
         catch (Exception e) {
               e.printStackTrace( );
        }

Pero nada no me muestra la imagen… Solo una ventanita tipo dialogo en blanco que le doy aceptar y se cierra! Mil disculpas si es algo muy obvio y estúpido pero no logro hacerlo funcionar si pudieras darme una AYUDADOTA XD te lo agradecería demasiado gracias y saludos cordiales

El siguiente código

El siguiente código funciona:

package demo;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.io.IOException;

public class Main {
        public static void main( String [] args ) throws IOException {
                JFrame frame = new JFrame();
                frame.add( new JLabel(new ImageIcon(ImageIO.read(Main.class.getResource("/img/zen_logo.png")))));
                frame.pack();
                frame.setVisible( true );
        }
}

Creando el jar con la siguiente estructura:

jar -tf demo.jar
META-INF/
META-INF/MANIFEST.MF
demo/
demo/Main.class
img/
img/zen_logo.png

Se vé así:

Los archivos .jar tienen la misma estructura que un archivo .zip, entonces para la segunda parte, lo que puedes hacer es leer y escribir un archivo de propiedades al jar mismo utilizando las clases en el paquete java.util.zip

Imagen de neko069

...

De hecho, como lo comenta OscarRyz está bien, también, de los 3 códigos que muestras, la ruta del segundo es como debe de ir (para que funcione en tú caso)

InptStream stream = this.getClass().getResourceAsStream("/imagenes/background_Conexion.png");

Lo que se me hace raro, es lo que dices, que sólo muestra un cuadro en blanco, es como si no encontrara la imagen....
Lo único que se me ocurre, y que veo de diferencia con el código de Oscar, es que se genera un objeto de tipo ImageIcon en lugar de Image como lo expuse en mi primer post, podrías probar cambiando el tipo de dato a generar, o bien, modifica el ejemplo que Oscar colocó, ya te demostró que funciona...
En cualquier caso, házlo saber, suerte!!!

Imagen de tux2003

Gracias a todos.....

muchisimas gracias a todos por el apoyo y la paciencia al fin entendi como es el asunto de las imágenes o al menos eso parece :S pero bueno ahora otra pregunta... corri mi aplicacion en Ubuntu para ver si jalaba y si funciona de maravilla la cosa es que no se ve como la programe en Windows!! en Linux luce así:

y su contraparte (Windows) así:

como pueden notar la fuente cambio y el tamaño de la misma es mayor (quiero pensar que es logico por el OS) pero creo que debe existir al menos una fuente estandar que jale en los dos OS y el tamaño del form? yo lo veo raro o es mi imaginaciòn? tengo muchas dudas al respecto.... pero ojala si deciden seguirme asesorando tengan paciencia conmigo porque les juro que me esta costando mucho trabajo adaptarme a este nuevo entorno de programación. Gracias y saludos cordiales.

Al parecer estás usando

Al parecer estás usando tamaños absolutos para tus controles ( y poniendo el layout manager a null )

Esta es la razón por la cual no es recomendable hacer eso. Lo que tienes que hacer es usar un layout manager que se encargará de dar las dimensiones correctas a cada componente.

Puedes poner alguna parte del código que usas para construir la GUI? ( no todo, solamente quisiera ver como lo estas haciendo en general )

Imagen de tux2003

Hola....

Gracias nuevamente por el apoyo.... Si así es estoy estableciendo mi setLayout(null) y ocupo setBounds() y setSize() para establecer tamaños :( yo pense que ésto era valido pero me doy cuenta que no tomare en cuenta el estudiar bien lo de los layouts para poder colocar mi interfaz como quiero o necesito gracias nuevamente y saludos cordiales

Bueno, acabas de presenciar

Bueno, acabas de presenciar por que es mala idea. :-/

Lo más fácil, es que utilices un constructor de interfaces ( gui builder ). Netbeans e IntelliJ Idea tienen unos muy, pero muy buenos.

Si lo quieres hacer a mano, el que te recomiendo usar el GroupLayout.

Suerte.

Imagen de neko069

También podrías checar

También podrías checar algun Look and Feel, para que tu aplicación tenga una apariencia uniforme en cualquier sistema operativo, hay muchos que implementan su propio sistema de fuentes, y hacen uniforme el tamaño de las ventanas.
Suerte!!

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">