Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Usuario Invitado

#311
Buen día,

¿En el folder Game están tus .class?

Lo digo porque el objetivo del Class Path en Java es localizar los ficheros .class que te genera el compilador.

Crea una carpeta llamada META-INF dentro de src. Dentro crea un archivo llamado MANIFEST.MF en el cual pondrás en el Class Path las librerías de las que hagas uso (JARs). Por ejemplo:


Main-Class
com.company.app.Main
Classpath
Class-Path: lib/json.jar lib/slf4j.jar


En el ejemplo anterior las librerías están en el folder lib. Por eso en mi classpath coloco lib/[libreria] para que se agregue al classpath.

Main-Class indica la clase principal. En el caso anterior está en el paquete com.company.app y se llama Main.

Espero sea de utilidad. Un saludo.
#312
xD Ah, por cierto Engelx, siéntete libre de modificar el tìtulo, solo creé el tema para que los programadores se diviertan un poco con la similitud de reacciones que se tiene en el trabajo xD.

Saludos.
#313
Ignoraré tu comentario @synthesize porque sinceramente me da pereza responder a tu sarcasmo ::)
#314
Cuando un compañero detecta un bug en mi código



Cuando tu supervisor va a verte luego de un bug crítico en tu último commit



¿Hiciste tú el cambio que rompió el servidor en producción?



Todo funciona en desarrollo, vamos a ponerlo en producción



Cuando un comando mal hecho borra ficheros importantes en producción



Intentando parar un bucle infinito



Cuando ves lo que han prometido los de Marketing



Con tu chica luego de programar 3 días seguidos



Cuando el cliente dice que quiere "un pequeño cambio"



Cuando descubres que las contraseñas en la BBDD están en texto plano



Cuando tus compañeros miran el log del servidor y se dan cuenta que la caída es por tu culpa



Cuando el cliente te pide que hagas su web en flash xDD



Probando si tu App es compatible con IE6




Fuente: Iteramos.com
#315
Personalmente siempre me agradó el arte del tattoo, pero nunca vi uno como éstos.


























#316
Java / Re: JOptionPane extendido
22 Marzo 2015, 23:22 PM
De nada. Te recomiendo ir trasteando con JavaFX para que trabajes mejor. Swing ya fue.

Saludos.
#317
Java / Re: Ordenar por nombre y sueldo
22 Marzo 2015, 23:21 PM
Buenas tardes,

Te iré explicando punto por punto para que puedas entenderlo.

1.-
CitarNo entiendo porque usas List en vez de ArrayList ni en que se diferencian.

Rpta: Java está muy bien estructurado y siguiendo siempre las buenas prácticas de programación, así como implementado patrones de diseño para que proveernos una API muy organizada.

En Java, existe un elemento llamado Generics, y es un elemento que sirve para hacer nuestras clases más descriptivas para el compilador, así como también nos permite construir clases genéricas (véase el término genérico).

Generics, como ya dije, se usa para hacer nuestras clases más sólidas y flexibles. La manera de usar Generics es la siguiente:

Código (java) [Seleccionar]
public class A<T> {}

Donde:

  • T significa Type, es decir, tipo de clase.

    Éste elemento T en tiempo de ejecución se transformará en el tipo de clase que tu le especificas:

    Código (java) [Seleccionar]
    A<String> a = new A<>();

    La instrucción anterior crea un objeto tipo A el cual le pasa por medio de Generics el tipo de clase String (para x propósitos). Por ejemplo, List<T> utiliza Generics para saber qué tipos de datos guardar.




    List<T>, como toda interface en Java, NO PUEDE SER INSTANCIADA. List la implementan varias clases, como: ArrayList, LinkedList, entre otras. Entonces, dado que ArrayList implementa List, podríamos decir que:

    List = ArrayList

    Entonces, en tiempo de ejecución, puedes hacer esto:

    Código (java) [Seleccionar]
    List<String> list = new ArrayList<>();
    list = new LinkedList<>();


    Esto lo que aporte es flexibilidad. La facilidad de cambiar de implementaciones en tiempo real es muy útil.

    Supongamos que tienes una variable de tipo ArrayList:

    Código (java) [Seleccionar]
    ArrayList<String> variable;

    Y tienes un método que realiza una operación. Teniendo "variable" de tipo ArrayList, obligas al método que devuelva un ArrayList. Pero que pasa si "variable" es de tipo List:

    Código (java) [Seleccionar]
    List<String> variable;

    Aquí cambia la cosa. Ahora el método puede devolver muchos tipos de clases:

  • ArrayList
  • LinkedList
  • RoleList
  • AttributeList
  • etc

    Como puedes ver, esto aporta mucha flexibilidad. Porque dependiendo del proceso del método, puedes devolver muchas implementaciones de List y todas serán aceptadas por "variable".

    2.-
    CitarTampoco entiendo el :  Collections.addAll

    Mira la documentación, acostúmbrate a hacerlo. El método all de la clase Collections recibe como primer parámetro un objeto tipo Collection (que puede ser una implementación de List<T>) y un ellipsis de elementos T que serán añadidos al objeto List<T>.

    3.-
    CitarNi el : Collections.sort

    El método sort de Collections ordena un objeto Collection. Si no se especifica un objeto tipo Comparator se usa el método de ordenamiento por defecto. Si se especifica un objeto Comparator se usa éste para comparar los elementos de la colección.

    4.-
    CitarNi el public int compare

    El objeto Comparator implemena un método llamado compare(T obj1, T obj2), que retorna -1 0 o 1 si obj1 es menor, igual o mayor que obj2.

    La interface Comparable provee el método compareTo cuya implementación es similar a compare de la interface Comparator.

    En resumen, compare recibe elementos en par de la colección pasada a sort y compara el par de elementos. De acuerdo al resultado (-1, 0 o 1), ordenará los elementos de la colección. Cuando ya no haya elementos, retorna la colección ordenada.

    5.-
    CitarY en la clase del objeto Empleado, ¿porque Integer en vez de int? :/

    Preferencia personal. Prefiero los Wrapper a los primitivos, puedes hacer muchas más cosas. Con los primitivos no tienes ningún método a disposición.

    Espero hayas entendido, si no es así, no te preocupes, en serio. A mí también me costó entenderlo, pero al final lo terminas aprendiendo.

    ¡Un saludo y no te desanimes!
#318
Java / Re: Meter un Frame dentro de otro Frame
22 Marzo 2015, 21:09 PM
En Java, NO EXISTE EL PASO DE PARÁMETROS POR REFERENCIA, TODO PASO ES POR VALOR, pero un "paso por valor" muy especial y es muy confuso entenderlo. Intentaré explicártelo ;) (disculpa si lo hago más confuso :xD).

Imaginemos el siguiente escenario:

Tenemos una clase Dog:

Código (java) [Seleccionar]
public class Dog {
    private String name;
   
    public Dog() {
       
    }
   
    public Dog(String name) {
        this.name = name;
    }
   
    public String getName() {
        return name;
    }
   
    public void setName(String name) {
        this.name = name;
    }
   
}


Y el main:

Código (java) [Seleccionar]
public class DogMain {
   
    public static void main(String[] args) {
        Dog aDog = new Dog();
        aDog.setName("Rex");
        System.out.println("Nombre del perro: "+aDog.getName());
        changeDogName(aDog);
        System.out.println("Nombre del perro: "+aDog.getName());
        changeDogReference(aDog);
        System.out.println("Nombre del perro al terminar las operaciones: "+aDog.getName());
    }
   
    public static void changeDogName(Dog sameDog) {
        sameDog.setName("Brutus");
        System.out.println("Cambiado el nombre del perro a 'Brutus'");
    }
    public static void changeDogReference(Dog sameDog) {
        sameDog = new Dog("Fury");
        System.out.println("Nuevo nombre del perro: "+sameDog.getName());
    }
}


Ahora, analicemos que hace el código.

1. Crea un objeto tipo Dog llamado aDog.
2. Establece el nombre de aDog a "Rex".
3. Imprime el nombre del perro (Rex).
4. Llama al método changeDogName y se le pasa aDog.
    Dentro de changeDogName:
    4.1 Cambia el nombre a aDog a "Brutus".
    4.2 Informa que se ha cambiado el nombre de aDog a "Brutus".
5. Imprime el nombre de aDog (Brutus).
6. Llama al método changeDogReference y se le pasa aDog.
    Dentro de changeDogReference:
    6.1 Instancia nuevamente aDog pasándole el nuevo nombre "Fury".
    6.2 Informa que se ha cambiado el nombre de aDog a "Fury".
7. Imprime el nombre final del aDog. El resultado es "Brutus".

Cuando le pasas un objeto por parámetro a un método, el objeto no pasa al método. Cuando pasas un objeto por parámetro a un método lo que ocurre es que se pasa es una copia de la dirección de memoria de dicho objeto. Por ende, no se puede modificar la referencia (dirección) no puede modificarse, pero sí se puede modificar los valores que engloba dicha referencia.

Es por eso que cuando hacemos:

Código (java) [Seleccionar]
public static void changeDogName(Dog sameDog) {
        sameDog.setName("Brutus");
        System.out.println("Cambiado el nombre del perro a 'Brutus'");
    }


Cambia el nombre de aDog sin problema alguno, porque puede acceder a los valores por medio de la copia de la dirección de memoria de aDog.

Pero, ¿Qué pasa si volvemos a instanciar aDog dentro de un método? El resultado es que esa copia de la dirección de memoria de aDog recibe una nueva dirección de memoria al instanciar Dog, por lo que ahora es otro objeto tipo Dog.

Código (java) [Seleccionar]
public static void changeDogReference(Dog sameDog) {
        sameDog = new Dog("Fury");
        System.out.println("Nuevo nombre del perro: "+sameDog.getName());
    }


Para comprobarlo, ejecutemos la prueba:

Citar
Nombre del perro: Rex
Cambiado el nombre del perro a 'Brutus'
Nombre del perro: Brutus
Nuevo nombre del perro: Fury
Nombre del perro al terminar las operaciones: Brutus

Como ves, el paso de variables en Java es por VALOR y NO POR REFERENCIA. Puedes llevarle éste ejemplo a tu profesor, para que vea que está equivocado.


Saludos.
#319
Java / Re: Flash player y Java
22 Marzo 2015, 19:53 PM
Hola BJM,

¿Me hablas de una web app o desktop app?

Si se trata de una aplicación web es muy sencillo, simplemente muestras la animación flash en una pequeña ventana modal.

Si por el contrario se trata de una aplicación escritorio, ahí si la tendrías complicada. Ahora mismo veo algunas opciones:

  • Tener dentro de la aplicación la animación y para mostrarla, activar el navegador por defecto y cargar la animación.
  • Utilizar JavaFX y mostrar la animación en HTML5 en un WebView.

    Personalmente me inclino por la segunda opción. Además que FlashPlayer consume más recursos y ya entró en declive, HTML5 es más flexible y potente, al ser javascript.

    Por supuesto, todo dependerá de tus necesidades y/o conocimientos.

    Un saludo.
#320
Puedes obtener el objeto que desencadenó el evento. Así mismo, como JComboBox y JList hacen uso de Generics para indicar qué tipo de elemento (Clase) debe contener, puedes obtener los objetos que has guardado en ellos.

Suponiendo que tienes un JComboBox y un JList declarados así:

Código (java) [Seleccionar]
JComboBox<Product> cboProducts = new JComboBox<>();
JList<Product> productList = new JList<>();


Puedes obtener el Producto seleccionado del JComboBox y ponerlo en el JList así:

Código (java) [Seleccionar]
cboProducts.addItemListener(new ItemListener() {
   @Override
   public void itemStateChange(ItemEvent e) {
       Product product = (Product) evt.getItem();
       productList.addElement(product.toString());
   }
});



Eso te entendí. Si entendí mal, me explicas mejor.

Un saludo.