Hilo General - Dudas de Java

Wasd

#150 TheNewBoston en Youtube, pero si ya sabes C++ te aburrirás en los primeros vídeos, porque es desde cero.

Para PHP busca en Youtube EliTheComputerGuy.

Ambos son muy buenos.

1 respuesta
Lecherito

#150 si ya sabes C++, sabes lo que es el paradigma de la orientación a objetos, sabes lo que son arrays, bucles y demás cosas varias... lo único que te queda por aprender de Java es:

1- La sintaxis
2- Los métodos específicos de java para hacer X cosa mucho más rápido o cosas que ya te vienen integradas.

Sinceramente te diría que te pillaras una idea, cuando estés atascado en algo, pregunta aquí o en stackoverflow y ya lo vas a tener casi todo solucionado.

1 respuesta
deak0n

#151 #152 Gracias! Me voy a poner a ello y si tengo alguna duda ya os daré el coñazo por aqui.

20 días después
litoss

Tengo aqui un pequeño fallo que nose donde radica:

El objetivo es crear un poligono mediante los clicks del raton. Con el izquierdo añado punto y con el derecho lo creo.

En el controlador tengo:

  
public void mouseReleased(MouseEvent me) {
if(SwingUtilities.isLeftMouseButton(me)) { System.out.println(me.getX()); System.out.println(me.getY()); modelo.setX(me.getX()); modelo.setY(me.getY()); modelo.addpoint(); } else if(SwingUtilities.isRightMouseButton(me)) { modelo.pintaPoligono(modelo.getPoly(), modelo.getGrosor(), modelo.getPerfilColor(), modelo.getRellenoColor()); } }

Y en el modelo:

public void addpoint(){
        poly.addPoint(x,y);  
}

Previamente declarado el poly como Polygon y la x y la y en esa clase.

El problema que me da es:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at model.addpoint(PhotoEditorModel.java:122)

Es decir que le llega un null segun entiendo y la verdad es que no se el por que ya que el print ese si que me muestra las coordenadas...

Tambien he probado a pasarle por parametros las coordenadas y nada..

1 respuesta
B

#154: Ahora mismo no tengo tiempo, pero tengo que decirte que estás utilizando muy mal la orientación a objetos.

Si el objeto "modelo" y tiene sus datos dentro, lo normal sería que hicieses

modelo.pintaPoligono()

, y que los argumentos los pillase el mismo de dentro. Eso es muy "imperativo", por así decirlo.

#156: Si te lo han dado hecho, mientras sepas que eso está mal, perfecto :P.

1 respuesta
litoss

#155 Ya se que eso no esta del todo bien hecho pero el método pintaPoligono ya te lo daban hecho. Y esta es la unica logica que le he encontrado para poder hacerlo.

1 respuesta
Zapador

A ver si alguien puede resolverme la duda.

A partir de un File, ¿cómo puedo determinar si se trata de un archivo de audio, vídeo, si está comprimido o es una imagen...etc?

Se me había ocurrido hacer un split al nombre del archivo y quedarme con la extensión, pero eso es una mierda mu gorda xd.

1 respuesta
cabron

#157

No existe ninguna forma universal de hacer eso con cualquier tipo de fichero habido y por haber.

Un fichero de un tipo determinado suele tener al principio algún tipo de cabecera que lo permite identificar, pero claro, cada tipo de archivo tiene una cabecera diferente, así que tienes que saber lo que estás buscando.

Un reproductor de vídeo busca cabeceras de archivos de vídeo, si no las encuentra, no es capaz de decirte que es, simplemente te dice "esto no es un archivo de vídeo", pero no te puede decir "esto es un documento word y no un archivo de vídeo.

#159

Si tiene un File, es que ha abierto localmente el contenido del archivo, no tiene mime type.

1 2 respuestas
BLZKZ

mime type

#158 por lo que entiendo viendo esto http://www.rgagnon.com/javadetails/java-0487.html es justo lo que quiere :/

1 4 respuestas
JuAn4k4

#159 Ese link lo averigüa por la extensión (por lo que he visto por encima)

Edit: Bueno usa JMimeMagic para imagenes, Apache Tika para documentos con texto (algunos) y otros mas, asi que esta bien para empezar, pero no tendras todo.

elkaoD

#158 #159 ¿No hay libmagic con un wrapper en Java? No me lo creo.

2infy

Alguien me puede decir alguna guía o algo para hacer lo que sea en java?
Lo que son los bucles, arrays, etc lo tengo claro mas o menos, pero necesito ejercicios o algo por que si no no hago nada :-/

8 días después
Zapador

#159 Se me olvidó darte las gracias, me sirvió de mucho ese material.

8 días después
Lecherito

Buenas muchachos, tengo la siguiente duda:

Quiero recargar todas las clases de una carpeta (hasta ahí bien).

        
public void compileCommands() { File dir = new File("./path/to/"); for (File child : dir.listFiles()) { System.out.println(child.getAbsolutePath()); JavaCompiler jCompiler = ToolProvider.getSystemJavaCompiler(); List<String> options = Arrays.asList("-d", "./bin/", child.getAbsolutePath()); int compilationResult = jCompiler.run(null, null, null, options.toArray(new String[options.size()])); if (compilationResult == 0) { System.out.println("Commands compiled."); } else { System.out.println("Couldnt compile the .java to its .class"); } } }

Una vez que acaba ese codigo:

        
public static void initCommands() {
Class<?>[] allClasses = null; try { allClasses = getClasses("path.to"); } catch (ClassNotFoundException | IOException e1) { e1.printStackTrace(); } for (int i=0; i<allClasses.length; i++) { try { URL u = new File("bin/path/to").toURI().toURL(); URLClassLoader ucl = new URLClassLoader(new URL[] { u }); Class<?> cl = ucl.loadClass(allClasses[i].getName()); ICommand com = (ICommand) cl.newInstance(); registerCommand(Config.prefijo+ allClasses[i].getName().substring( allClasses[i].getName().lastIndexOf(".")+4).toLowerCase(), com); ucl.close(); } catch (Exception e) { e.printStackTrace(); } } }

La cosa es que al cargarlas con URLClassLoader, no las carga bien o cualquier cosa ya que por ejemplo si comento una linea o agrego un Sysout("asdf"); no lo muestra.

La primera vez que arranca, carga las clases perfectamente, pero luego digamos que no se "actualizan".

Alguna manera de recargar todas las clases de un paquete?

3 respuestas
BLZKZ

#164 si nos pasas la bbdd te lo hago :P

Gansoma

Hola soy un noob en el asunto y tengo una pequeña duda.

Cómo se marca un intervalo entre dos valores. Por ejemplo quiero que me salga una cosa si el resultado es : entre 20 y 28.

:):)

#167 Muchas gracias, voy a ver si me funciona el asunto:)

2 respuestas
elkaoD

#166 para el intervalo inclusivo:

if (valor >= 20 && valor <= 28) { ... }

1 respuesta
SikorZ

#164 No se si te he pillado bien o es lo que planteas, comprendo que quieres importar las clases de una carpeta (?). Si es asi porque no simplemente pones los .java/.class dentro de un paquete y le haces un import? en plan com.appWeb.clasesAux y luego hacer un:

import com.appWeb.clasesAux.*;

#166 Te dejo un ejemplo cortito

private boolean comprobarNumero(int num){
   if((num > 20) && (num < 28))  { return true; }else{ return false; }
}

int numero = 25;
if(this.comprobarNumero(numero)){
   //ESTA DENTRO DEL RANGO
}else{
   //NO ESTA DENTRO DEL RANGO
}

Esto comprobara los numeros entre 20 y 28 como indicas (osea 21,22,23,24,25,26,27,28), si quieres que ademas compruebe el 20 y 28 (osea, ese rango con los limites inclusives) deberas poner <= y >= en la condicion de comprobarNumero.

Un consejo para las comparaciones en los if's con Java, acostumbrate a agrupar cada parte de las comparaciones con parentesis porque cuando las hagas mas complejas Java es un poco caprichosas a la hora de interpretarlas. Te lo digo porque yo mismo el otro dia me comi la cabeza con un error y era porque los OR's no los comprende como debe sin los ().

3 respuestas
Lecherito

#168 Al principio no le compliques mucho las cosas con funciones :3

Y lo que quiero es recargar clases en RUNTIME (tiempo de ejecución), no es un simple import.

Gansoma

#168 Oye pues me son muy útiles estos ejemplos, muchas gracias. No sabía lo de los paréntesis lo tendré en cuenta :).

litoss

A ver tengo un problema que me reconcome, tengo una funcion que muestra cosas(Jframes con buttons y tal) y si al final de ella pongo que llame a otra funcion y al comienzo de esta ultima le pongo un sleep, porque cojones cuando hace el sleep se queda todo en blanco, es decir, es como si lo anterior no lo mostrara, directamente pasa a lo siguiente.

2 respuestas
SikorZ

#171 Si pones el proyecto casi que mejor, he trabajado poquisimo con swing pero si el echo un ojo y puedo probarlo te lo soluciono xD

1 respuesta
litoss

#172 gracias lo primero. Te pondría el proyecto o el código pero es bastante largo con lo que te voy a intentar resumir un poco. Estoy utilizando MVP y en el controlador tengo que se llama a esta funcion:

void crearpartida() {
        view = new MainView(model);
        view.addWindowListener(new ControllerWindowListener()); 
        view.setActionListener(new ControllerActionListener());
        view.ip.dif.setText(""+model.getDificultad());
        view.ip.jug.setText(""+model.getJugadores());
        view.setLocation(200, 200);
        view.setVisible(true);
        model.esperar(1);                // AQUI ESTA EL PROBLEMA
        empezarpartida();
        partidacreada = true;
    
}; void empezarpartida() { // SIMPLEMENTE CAMBIA LAS IMAGENES de los BOTONES(carta)
for(int i=0; i<view.cp.car.length;i++){ view.cp.car[i].carta.setIcon(new ImageIcon("src/go.png")); } };

Por defecto, es decir, cuando se crea el view al comienzo de la primera funcion con el constructor se le ponen las imagenes verdaderas a los botones, luego se espera un segundo y se cambian las imagenes a esas de la funcion empezarpartida.
Por si las dudas el esperar del model es esto:

public  void esperar(double segundos) {
        long x=(int)(1000*segundos);
        try {
            Thread.sleep(x);
        } catch (InterruptedException e) {
            System.out.println("Aviso: Espera interrumpida");
        }
    }

1 respuesta
SikorZ

#173 Tu codigo parece estar bien (teniendo en cuenta mis conocimientos con gui's). No he entendido bien lo que querias decir con lo de que lo de antes se borra y solo se ve lo siguiente, si me explicas un poco mejor el problema quizas sepa mejor como ayudarte.

Lo que si veo y no comprendo (tonteria en realidad) es que haces:

        view.ip.dif.setText(""+model.getDificultad());

y yo me pregunto, porque concatenas ahi en vez de poner simplemente:

        view.ip.dif.setText(model.getDificultad());

Otra cosa es saber si sabes que esa funcion es la que falla ver si te salta el catch, si no te salta pero te dumpea error en consola o algo podrias ponerlo tal que asi:

public  void esperar(double segundos) {
        long x=(int)(1000*segundos);
        try {
            Thread.sleep(x);
        } catch (InterruptedException e) {
            System.out.println("Aviso: Espera interrumpida");
        } catch (Exception e) {
            e.printStrackTrace();
            //Aqui es donde hara catch que cualquier tipo de excepcion
        }
    }

De hecho he estado mirando docu's y el metodo que has escrito es exactamente igual al que estas usando xD.. pero como no he entendido muy bien tu problema principal tampoco puedo hacer mucho mas XDD

1 respuesta
litoss

#174 Lo de la concatenación es porque la tanto la dificultad como los jugadores los manejo con enteros.

Respecto al problema principal se trata de el típico juego de cartas por parejas, que destapas una luego otra y comparas si son iguales y tal. Al comienzo de la partida se muestran las cartas unos segundos antes de taparse. En mi caso yo lo que hago es que cuando llamo al constructor para generar la vista los propios botones ya tienen su imagen verdadera y simplemente espero un segundo para cambiar esas imágenes por una que sea igual en todas(go.png), espero que se me entienda xd.

He probado con lo de la excepcion del catch y no sale nada.

B

#168: Nunca entenderé lo de

if (condition) {
  return true;
} else {
  return false;
}

Joder!

return condition;
3
elkaoD

#171 si paras el hilo principal del programa, se deja de dibujar.

pdj

#164 Prueba asi

 URL u = new File("bin/path/to").toURI().toURL();
 URLClassLoader cl = new URLClassLoader(new URL[] {u}, getClass().getClassLoader());
 Class<?> cl = ucl.loadClass(allClasses[i].getName());
1 respuesta
Lecherito

#178 La cosa es que el método es estático :-c

#180 Podrías explicar un poco la cosa, realmente no quiero simplemente copiarlo xD

1 respuesta
pdj

#179
A ver esto es un poco estandar p cubo (programacion por pollazos), la explicación es que te funciona la primera vez bien xk tu clase no tiene classloader entonces te crea uno y tira nice pero la segunda vez (recarga) dice algo asi como "ojo que ya tengo un classloader" con lo cual no ves los cambios. Se supone (por que esto es como te he dicho p cubo) que con esto deberia crear un nuevo classloader y realmente hacer un reload.

Pasada la "teoria", pruebalo y me dices.

NOTA: NO lo he probado, estoy en el curro liado con la mierda de objective c, si quieres cuando llegue a casa te lo explico / pruebo mejor

URLClassLoader ucl = new URLClassLoader(new URL[]{u}, allClasses[i].getClass().getClassLoader());
2 respuestas
Tema cerrado