El Post Oficial para aprender Java

Lecherito

#90 Pero según los javadocs se ejecuta cuando llega el GC a pasar la escoba por lo tanto cuando se "destruye", es lo más parecido que hay y quizá le vale.

Cabe decir que el GC es una cosa muy muy random (Y que aunque lo puedes llamar con System.gc()) se recomienda comprobar cosas antes.

1 respuesta
Spacelord

#91 Pero según esos mismos Javadocs no se garantiza que el objeto se destruya si lo invocas tú. Es decir, que cuando lo invoca el recolector sí que se destruye el objeto, pero al sobreescribirlo e invocarlo por uno mismo puede que no. Depende de lo que quiera hacer igual le sirve, pero si lo que quiere es un delete como en C++, pues no es lo mismo, claro.

2 respuestas
Lecherito

#92 Ya ya, es que él no dijo nada de que lo iba a invocar. Pero no, no es nada seguro el invocarlo.

Y para el de la duda, es que para eso es mejor construir una capa encima de eso y meter algo tipo ArrayList, y cuando lo saques del array (se supone que es cuando ya lo has "destruido") pues haces lo que quieres que haga.

1 respuesta
Zerokkk

#93 #92 Para resolver la duda... NO se puede escoger cuando mandar un objeto de memoria a la basura. El garbage collector de Java actúa como si fuese un thread aparte, él mismo selecciona qué debe cargarse y qué no. Cuando sale de un módulo funcional es cuando se supone que se pone en cola para ser destruído (lo que comenta #93 poniendo como ejemplo los ArrayList), pero eso no significa que sea instantáneo como se puede hacer en otros lenguajes.

Aún así, yo creo que no hace falta matarse mucho; cómo administra Java la memoria está muy bien y pienso que no hace falta matarse demasiado con la optimización para que ésta cumpla unos mínimos.

A menos que seas un completo patán programando y hagas todo poco modulado, pero eso es otra cosa xDD.

Lecherito

Eso estamos hablando xDD, que no se escoge cuando limpiar la mierda xD

Scottie

Gracias señores, si, el finalice lo ejecuta previo al borrado. Aunque para que lo ejecute antes (estaba haciendo pruebas durante este tiempo xD) he empezado a crear hilos a mansalva xDD

8 días después
preguntitas

Estoy interesado en aprender java, podéis recomendarme algún manual/tutorial/web con recursos para ponerme a ello?

Gracias

1 respuesta
bornex

#97 Te puedo mandar por MP todas las transparencias, pdf con ejercicios y demás desde los fundamentos hasta las Estructuras de datos y algorítmica. ;)

2 respuestas
Hyox10

#98 Pasamelo a mi tambien si no es mucha molestia, que me apeteceria repasar conceptos y demases.

1 respuesta
preguntitas

#98 te estaria muy agradecido. Asi da gusto ;-).

1 respuesta
bornex

#100 #99 Ok, dadme unos minutos y os hago un zip con todo :)

2 respuestas
MartiONE

#101 Hola! Podrias enviarmelo a mi también? Muchas gracias

Edel_Hagaren

#101 Si no te importa, a mí tampoco me vendría mal, como ayuda a los apuntes que nos dan (que son más bien justos :S)

20 días después
FoxWinterMan

Holaaa !! Necesito de vuestra sabiduria de nuevo debido a que mis profesores son totalmente inutiles y que no tengo a nadie que me ayude en esto :(

Es un programa que creo que es sencillo pero me falta mucha práctica. Se trata de hacer un programa de sorteo de la Primitiva con 2 clases.

spoiler
package afortunados;

import java.util.Scanner;

public class Jugador {
    
private String NIF; private String nombre; private int telefono; private int[] apuestaJugador; public static Scanner entrada= new Scanner(System.in); public Jugador(String NIF, String nombre, int telefono) { this.NIF = NIF; this.nombre = nombre; this.telefono = telefono; this.apuestaJugador = new int[6]; jugar(apuestaJugador); } public String getNIF() { return NIF; } public void setNIF(String NIF) { this.NIF = NIF; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public int getTelefono() { return telefono; } public void setTelefono(int telefono) { this.telefono = telefono; } public int[] getApuestaJugador() { return apuestaJugador; } public int[] jugar (int[] apuestaJugador){ for(int i = 0; i<6; i++){ do{ System.out.println("Introduce tu apuesta en el rango de 1 al 49: \n"); apuestaJugador[i] = entrada.nextInt(); } while ((apuestaJugador[i]<1) || (apuestaJugador[i]>49) || noRepetidos(apuestaJugador, apuestaJugador[i], i)); } return apuestaJugador; } public boolean noRepetidos(int[] array, int numero, int rellenos) { boolean resultado = false; for(int i=0; i<rellenos;i++){ if(numero == array[i]){ resultado = true; } } return resultado; }
public void imprimirApuesta(int[] apuestaJugador){ for(int i=0;i<apuestaJugador.length; i++){ System.out.println("La apuesta del jugador es :"+apuestaJugador[i]+"\n"); } }
}

Esta es mi clase jugador, sinceramente no se si esta bien o esta mal, pero compilar me compila aunque despues al crear mi clase main no funciona nada y se queda en el bucle infinito de meter numeros... y nose que hacer.

PD: Mi profesor no sabia como hacer un cast, con lo cual creo que dejo claro que mi situacion no es la mas favorable :(

1 respuesta
ke2g

#104 puedes copiar tu clase main? entiendo que se te queda en el bucle del método "jugar", no?

1 respuesta
FoxWinterMan

#105

Solucionado aunque tengo varias preguntas:

¿Hay alguna manera de darle el formato que yo quiera con la clase GregorianCalendar (me obligan a usarla), me refiero a quitarle los minutos y segundos para dejarlo en solamente dd/mm/aaaa.

¿Como puedo imprimir los numeros introducidos en la misma linea? Me comentaron que es con un bucle for y convirtiendo el array en String y concatenarlo, pero no lo termino de hacer correctamente.

Y esto es para una posible ampliacion, para poder tener en el mismo jugador varias apuestas, tendria que crearle una clase aparte que contenga un ArrayList, para poder almacenar varias apuestas para el mismo jugador, correcto? Se puede hacer con arrays normales? Cual sería el procedimiento?

¿Cual es la mejor manera de agrupar las Exception? Siempre lanzo los throws Exception pensando en que en algun momento alguien podria utilizarlos?

1 respuesta
ke2g

#106 Por partes:

Para lo que pides del GregorianCalendar puedes utilizar la librería de SimpleDateFormat. Se usa así:

Calendar cal = new GregorianCalendar();

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");

System.out.println(dateFormat.format(cal.getTime()));

lo de los números no lo acabo de entender, ¿has probado de imprimir el array recorriendolo y utilizando system.out.print, en vez de println?

La forma más sencilla que se me ocurre para hacer lo de varias apuestas (sin pensarlo mucho... xD) es hacer una clase Apuesta y que cada jugar tenga un ArrayList de Apuestas (betList). El método jugar iría dentro la clase Apuesta y pasaría a ser el constructor. Cada vez que un jugador quiera añadir una apuesta, llamas el método jugar (que se tendría que renombrar a Apuesta), y añades a betList la apuesta que se ha creado.

Con las excepciones lo que hay que plantearse es: ¿quién se tiene que encargar si falla? si es algo que quieres pasarle a quien llama la función -> throw, si por otra parte quieres controlarla de forma interna -> try/catch. Ten en cuenta que si utilizas el try/catch y hay un fallo, quien llame esa función no tendrá forma de saber que algo ha petado.
Dicho esto, de forma general, yo no haría lo que has hecho tú en el método jugar. No tiene mucho sentido que lances la excepción y en la misma función hagas try/catch. Ah! y no hubiese creado una excepción por cada caso, sino una general (jugarexception?) así el código se entiende mucho mejor y es más corto. Date cuenta que fueraDeRango, numRepetido y dataError no se distinguen en nada.

willy_chaos

Una pregunta cuando quereis desarrollar una aplicacion multi idioma como lo haceis.

Yo he pensado tirar de archivos XML con la siguiente estructura, pero no se ...

<?xml version="1.0" encoding="UTF-8"?>
<Languages>
    <Parameter>
        <Id>language</Id><Text>es</Text>
    </Parameter>
    <Parameter>
        <Id>accept</Id><Text>Aceptar</Text>
    </Parameter>
    <Parameter>
        <Id>decline</Id><Text>Cancelar</Text>
    </Parameter>
..

Algun consejo sobre como hacerlo. Podriais poner un ejemplo de xml y luego como una vez leido ese XML que hago, lo cargo en variables static, por ejemplo de una clase Lang de manera que luego en el codigo donde tenga que ir un "Aceptar" pueda poner un Lang.msg_accept y este dependiendo el fichero que se haya cargado pues suelte el Aceptar en un idioma o otro.

4 respuestas
DaRk-eXe

#108 puedes usar un JSON por cada idioma

1 respuesta
B

#108 No soy un experto en Java, pero diría que harías bien en investigar el soporte de i18n que trae de serie el lenguaje.

1 respuesta
Skiuv

#108 Se me ocurre algo así como:

<?xml version="1.0" encoding="UTF-8"?>
<Languages>
    <Parameter id="boton1">
        <Idioma id="es">Soy botón 1</Text>
        <Idioma id="en">Texto en ingles 1</Text>
    </Parameter>
    <Parameter id="texto2">
        <Idioma id="es">Texto en español 2</Text>
        <Idioma id="en">Texto en ingles 2</Text>
    </Parameter>
    <Parameter id="texto3">
        <Idioma id="es">Texto en español 3</Text>
        <Idioma id="en">Texto en ingles 3</Text>
    </Parameter>
...

La misma estructura en caso de JSON.

Después en el programa cargarías, según el idioma de sistema o el de la configuración..., para el boton1, el texto de boton1->idioma "es" y así con cada cosa. :)

Es decir, tendrías una variable idioma="es" que indica que idioma cargar para cada parámetro... por ejemplo. :D

1 respuesta
willy_chaos

#109 #110 #111 Gracias a todos, de momento estoy mirandome lo de i18n ya que si lo pone en tutorial de Java pues mejor seguir la guia.

1 respuesta
Lecherito

#112 Si usas eclipse puedes externalizar strings y te crea una clase "Messages" que se usa del tipo Messages.getSring(), luego ya es agregar un fichero igual que el que te pone pero fichero_idioma etc, aunque hace poco vi esto: http://siondream.com/blog/games/internationalization-for-libgdx-projects/

Se puede adaptar ultrafacilmente a tu proyecto

FoxWinterMan

Hola de nuevo gente,

Estoy inmerso en el maravilloso mundo de las interfaces gráficas, la verdad que una vez ya acostumbrado a descubrir cosas nuevas, no se me hace tan pesado ver lineas de codigo.

Estoy viendo codigos con interface gráficas muy esenciales, implementar los botones es sencillo, lo que me parece complicado es el manejo de eventos.

Dicho esto, me gustaría que me recomendarais algun foro de programacion, se que existen muchos pero uno de habla hispana y que tenga mucha actividad, seria muy de agradecer para ver dudas y ejemplos de otros programadores, no quiero llenar este thread de mis dudas las cuales son muchas.

Imagino que en internet habra muchos tipos de interface creadas por los distintos programadores del mundo que se podran descargar e implementar en mis codigos.

Actualmente estoy siguiendo un video-tutorial en youtube de Jesus Conde (bastante recomendable) pero necesito mas.

1 respuesta
Lecherito

#114 Y para que crees que está este hilo / crear tu hilo propio para preguntar dudas? No tengas miedo muchacho y pregunta, que aquí excepto Jastro, no comemos.

FoxWinterMan

Esto es mi ventana principal de un programa de peajes, autobuses y camiones.

Programo en NetBeans.

spoiler

La parte de los eventos, como en este cacho de codigo:

La manera de declararlos es siempre asi? He visto que hay bastantes eventos como este o MouseMonitorListener, WindowListener, etc... Con lo que no me aclaro bien es cual es el mejor en cada caso, me refiero a que todos se parecen muchisimo entre ellos.

La otra gran duda es referente a los layout, la verdad que en el codigo es una parte muy densa, y que habra infinidad de Layouts. No hay alguna manera mas simple de hacer tu disposicion?

Tengo que marchar a trabajar, espero no estar haciendo preguntas idiotas, esta semana santa me pondre muy duro intentando realizar todo lo de programacion que tengo mandado para despues poder investigar por mi propia cuenta.

Muchas gracias a todos.

1 respuesta
Zerokkk

#116 Los layouts y demás tema gráfico está tirado de hacer con el netbeans, creando objetos Form y montándolos a tu gusto con el editor que el programa trae. Lo de los layouts puedes cambiarlo también ahí mismamente, y utilizar GridBagLayout, BoxLayout, FlowLayout y demás, aunque normalmente no te harán demasiada falta xD.

El tema eventos también es facilito de hacer desde el editor. Click derecho sobre el elemento sobre el que quieres definir un evento, y vas a Events. Ahí tienes un montón de eventos que activar, que te declara el programa y luego ya puedes hacer lo que quieras con ellos. Son bastante fáciles de usar, experimenta un poco por tu cuenta trasteando con el objeto Event y sus métodos, y verás.

willy_chaos

Hola a todos, estoy haciendo una mini aplicacion y me encuentro con unos cuantos problemas con un JTable ( DefaultTableModel ).

Parte del codigo es el siguiente.

table = new DefaultTableModel();
tablaresultados = new JTable(table);

	Vector vec = new Vector();
	vec.add("EAN");
	vec.add("EUW");
	vec.add("PVP");
	vec.add("AVG");
	vec.add("DESC");

	table.addRow(vec)
	jsp = new JScrollPane(tablaresultados);
	getContentPane().add(jsp, BorderLayout.CENTER);
init();

Metodos que se encargan de añadir y eliminar

	public void emptyTable() {
		for (int i=0; i<table.getRowCount(); i++ ) {
			table.removeRow(0);
		}
	}
	public void add2Table(Vector<String> vecin) {
		int pos = table.getRowCount();
		System.out.println("Vec In :"+vecin.toString() );
		if (vecin.size() > 0)
			table.addRow(vecin);
		
}

En la consola me aparece esto, indicando que ha introducido el codigo que se ve en loading en la tabla (la tabla va incrementando)

Tamaño tabla: 2741
Loading 7332543230488
Tamaño tabla: 2742
Loading 7332543196128
Tamaño tabla: 2743
Loading 7332543279081
Tamaño tabla: 2744
Loading 3045388189418

Pero no se ve la tabla por pantalla, que hago mal?

Edit

Resultado consola de cuando el controlador procesa el array de datos y se lo envia a la vista

Loading 7332543196128
Vec Out:[7332543196128, Cod EUW, 327.27, 338.1083, Zanussi Lavadora carga superior zwq5109]
Vec In :[7332543196128, Cod EUW, 327.27, 338.1083, Zanussi Lavadora carga superior zwq5109]
Loading 7332543279081
Vec Out:[7332543279081, Cod EUW, 294.7, 316.87418, Zanussi Lavadora carga superior zwy1106]
Vec In :[7332543279081, Cod EUW, 294.7, 316.87418, Zanussi Lavadora carga superior zwy1106]
Loading 3045388189418
Vec Out:[3045388189418, Cod EUW, 121.56, 137.34286, Krups Cortafiambres tr522341 aoste profesional]
Vec In :[3045388189418, Cod EUW, 121.56, 137.34286, Krups Cortafiambres tr522341 aoste profesional]

La linea Loading es cuando el controlador procesa el producto.

Vec out -> Controlador muestra el vector que le pasa a la vista

Vec in -> El vector que nos ha pasado el controlador a la vista

2 respuestas
pdj

#118 prueba a refrescar la tabla... si no recuerdo mal era algo como invalidate() o asi...

B

Sigo esperando las lecciones.

1 respuesta