El Post Oficial para aprender Java

Lecherito

No debería de haber problemas al añadir, más bien creo que es un problema de layout.

Donde le estás pasando los nombres de las columnas?
Cómo estás creando tu layout del programa, has visto alguna vez la tabla?
Has probado a añadir campos por defecto y ver que todo se muestra como debería y descartar que sea un problema del código de añadir?

Zerokkk

#118 Te pego un código propio de cómo lo suelo hacer (que va bastante bien) y ya de aquí vas sacando tus conclusiones, te lo dejo explicado:

 DefaultTableModel mod = new DefaultTableModel();  

 
       // Sacas los datos de algún lado, yo por ejemplo aquí los saqué de una BBDD
        ResultSet rs = op.rellenarTablaContactos();
                  
       // Añades columnas con sus respectivos nombres. En este ejemplo metemos los datos de una persona:
        mod.addColumn("ID");            
        mod.addColumn("Nombre");
        mod.addColumn("DNI");
        mod.addColumn("Telefono");
        mod.addColumn("Dirección");
        
        /* Iteras tu contenedor de datos y vas metiendo fila por fila. El array ha de tener tantos elementos como columnas haya. Si la variable está vacía, no pasa nada. Al final, llamas al método addRow y metes el array, añadiendo la fila al modelo.*/
        while(rs.next()){                
                Object[]obj = {rs.getInt(1),rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(6)};
                mod.addRow(obj);              
        }
        
        // Para rematar la tarea, asignas el model a tu tabla, y listo!
        tablaContactos.setModel(mod);

1 respuesta
willy_chaos

#122 Pues por la tonteria del addRow(vec) no me funcionaba, ha sido poner

public void add2Table(Vector<String> vecin) {
		
	
	
	System.out.println("Vec In :"+vecin.toString() );
	if (vecin.size() > 0) {
		Object[] obj = {
				vecin.get(0),
				vecin.get(1),
				vecin.get(2),
				vecin.get(3),
				vecin.get(4)
				};
		tablemodel.addRow(obj);
	}
		
	
	
	tablaresultados.setModel(this.tablemodel);

Añadiendo tambien la ultima linea y funcionar.

FoxWinterMan

Tengo que realizar una aplicacion con GUI simulando un aparcamiento.

Quiero que cuando entre un vehiculo, se genere la fecha de entrada con Calendar dandole formato:

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

Cuando salga ese mismo vehiculo quiero, que coja la fecha actual del sistema con Calendar con el mismo formato que el de entrada.

Lo que quiero hacer es restar la fecha de salida con la de entrada y cojer los minutos para calcular el importe total que debe de pagar el propietario del vehiculo, y ahi esta el problema, que nose como hacer esto, si es transformando la fecha en un numero? o si hay algun metodo para hacerlo.

1 respuesta
Perurena

#124 Creo que en java había un "date.getTime()" que te devuelve la fecha en milisegundos, sería restar los milisegundos de la fecha que entra el coche y en la que sale.

willy_chaos

Bueno ya tengo la aplicacion bastante terminada, solo me quedan 2 preguntas.

1 - Cada boton que veis en #123 los dos negros , esta pensado para que se seleccione de que web queremos hacer la comparativa. Cada web tiene una base de datos diferente y tablas diferentes. Como haceis para cargar eso?

A mi se me ocurre crear una clase static llamada por ejemplo Databasemapping que tenga atributos publicos tal que asi

public class Databasemapping {

public static String database;
public static String tb_eans;
public static String tb_precio;
}

Luego en el controlador cuando piquen un boton hacer un

Databasemapping.database = nuevadatabase;
Databasemapping.tb_eans = tabladelaweb2_eans;
Databasemapping.tb_precio = tabladelaweb2_precio;

Y luego en la clase de productos que se conecta a la base de datos para sacar el precio real del producto nuestro (campo PVP de la imagen, el que sale ahora no es real)

2 - Mientras tanto he puesto la consulta a "mano" para una sola web, he visto que mientras carga los datos de los productos, parece como si el programa no hiciera nada, luego al final acaba saliendo todo en la tabla, he pensado poner una loadbar. Pero claro como hago que mientras esta cargando los datos en el "model" se pueda ver que la barra va incrementando ?

2 respuestas
Lecherito

#126 Respecto a la 2, hilos, hilos everywhere.

1 respuesta
willy_chaos

#127 Y que hago que el modelo sea realmente un thread entero ? Si me puedes guiar un pelin el como plantearlo (no como hacer un thread, eso ya lo miro en oracle docs)

1 respuesta
Lecherito

#128 En un hilo cargas, y en el normal muestras por donde vas cargando

Aunque... mirate: http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/components/ProgressBarDemoProject/src/components/ProgressBarDemo.java

1 respuesta
Zerokkk

#126 Para utilizar un formateo de tablas dinámico has de sacar un Metadata Resultset de la tabla que quieres, que te devuelve los nombres de las columnas y por tanto, el número de las mismas. Esos datos luego los metes en la carga de la tabla, y tras ello, metes los datos con consultas normales.

Lee sobre ello, que es facilito y te permite trabajar con cualquier tipo de tabla.

Sobre lo segundo, es lo que te comentaban: las barras de progreso utilizan threads. Un thread (puede ser el main u otro distinto) te carga la tabla, por ejemplo, y otro te va rellenando la barrita (creo que era así, no soy muy de usar progress bars).

1 respuesta
willy_chaos

#130 no si lo del metadata ya lo lei , mas bien me refiero que como haceis para hacer las consultas como si fuera un objeto dbo pero sin ello. Vamos mapear el nombre de las tablas para que si cambias el nombre a la tabla o a un campo en la base de datos no tener que ir a todos los .java a cambiar la consulta. Vease yo en php suelo tener un archivo con constantes que tienen defines con el nombre de la tabla, campo etc...

select nombre from usuario

a

select Database.dbt_user_fname from Database.dbt_user

Al final he hecho un metodo para cada web y en el controlador cambia el valor de esas variables static

pero me gustaria saber la mejor forma de hacer esto

1 respuesta
Spacelord

#131 Muy sencillo:

public String buildQuery(String field, String table, String conditions)
{
  String consulta = "Select " + field + " from " + table + " " + conditions;
  return consulta;
}

Y sólo tienes que invocar al método pasándole por parámetro la información. En tu ejemplo, tendrías que hacer:

String query = buildQuery("Database.dbt_user_fname", "Database.dbt_user");

Y te devolvería la query montada para esos dos parámetros en concreto. Si fuese una query multicampo o multitabla, con ponerlo así suficiente:

buildQuery("Database.dbt_user_fname, Database.dbt_2", "Database.dbt_user, Database.dbt_password");

Es tan sencillo como parametrizar los valores de una query que pueden cambiar e insertarlos dentro de un armazón de string con las partes de la query que sabes que no van a cambiar (select, from, etc). Lo mismo para queries DDL, DML, etc., cada tipo de query necesitará su método para que coincida con su sintaxis concreta.

Todo eso lo metes en una clase aparte, donde sólo estén esos métodos, y los invocas desde donde haga falta.

1 respuesta
Khanser

#132 sencillo sí, pero asi no. Estas enviando al chaval a un claro caso del SQL Injection, la api de jdbc te permite poner interrogantes en parametros para luego poder llamar a los metodos setInt y setString, etc. setString gestionara el escape de caracteres de SQL para ti.

1 3 respuestas
Spacelord

#133 Hombre, es que si la aplicación es suya, para uso personal, no quería complicarle la vida metiéndole en la API de JDBC. Si eso lo tiene que usar cualquiera que no sea él claro, es un peligro, le pueden inyectar lo que quieran, pero yo entiendo que es un programa que se ha hecho para él.

2 respuestas
willy_chaos

#134 #133 Es un programa para mi y para mi jefe para ver rapidamente si estamos bien de precio o no, por lo que no estara ni publicado en internet ni nada, mas que nada porque el servidor SQL esta en la empresa y no es accesible desde internet, aun asi siempre que hago algo intento hacerlo de la forma mas profesional por lo que si me podeis dar algun ejemplo de como hacerlo pues guay.

Ahora mismo lo hago asi

java.sql.ResultSet result = null;
String query = "SELECT " + campo +" FROM " + tabla +" where bla bla bla";
result = Database.execSQL(query);
1 respuesta
B

#133, #134, #135: No hay excusa para no usar la API de JDBC. Mírate la documentación y lee sobre SQL injection.

2
Ronso

#120 Lecciones de que?

#129 Das miedo con ese avatar >.<

8 días después
FoxWinterMan

Vuelvo a la carga porque mi profesora me desespera, sus explicaciones es lo mas cercano a des-aprender que he visto en mi vida :(

Tengo que hacer la aplicacion de gestion de Parking con GUI.

Tengo las siguientes clases:
Vehiculo
Coche que hereda de vehiculo
Camion que hereda de vehiculo
Aparcamiento donde tengo los metodos introducir vehiculo(vehiculo v) y sacarVehiculo(String matricula).

Tengo el diseño de la GUI echa, mi problema es la gestion de los eventos, que nose cual es la manera correcta de hacerlo, y mi profesora me dice que tengo los conceptos mal pero no me dice como hacerlo de manera correcta.

En mi frame de Vehiculos tengo varios campos a rellenar: matricula, ancho, alto y si el vehiculo es abonado o no. Una vez rellenos le doy a meter vehiculo y tiene que comprobar que hay espacion en el parking, que la matricula no se correponde con ninguna de las que ya hay dentro e introducirlo a un HashMap definido en la clase aparcamiento.

Bueno pues aqui esta el problema en cuestion:

spoiler

Me ha dicho que tengo que hacerlo todo asi, creando los campos en donde el boton y asignandoselo al crear el objeto coche pasandole los parametros, mi duda viene en cuanto tengo que comprobar si hay capacidad suficiente en el parking y si esta dentro o no.

Tengo el metodo introducir vehiculo en la clase aparcamiento donde tenia tenia todo el codigo de comprobacion capacidad parking/matricula pero me ha dicho que asi esta mal y sinceramente no tengo ni puta idea porque, tampoco me lo explico habiendome dando una charla de 60 minutos sobre que en 4 años sabre porque esta mal :(

Creo los metodos correponsidentes en el frame? Usos los de la clase aparcamiento?
No quiero que me hagan el codigo ni mucho menos, sino que me expliquen porque se hacen asi las cosas.

Gracias de antemano.

1 respuesta
pdj

#138 Entiendo que en tu clase Main, tendrás un objeto "Parking", y la clase será algo así como...

public class Parking{
  int maxCapacity;
  HashMap<String,Vehiculo> vehiculos;
  
public Parking(int parkingCapacity){ this.maxCapacity = parkingCapacity; this.vehiculos = new HashMap<String,Vehiculo>(); } public int parkingSize(){ this.vehiculos.size(); }
private boolean vehicleExists(String id){ return this.vehiculos.get(id.toUpperCase())!=null; } public String addVehiculo(Vehiculo newVehicle){ if(!vehicleExists(newVehicle.getMatricula() && parkinSize() < this.maxCapacity)) { this.vehiculos.put(newVehicle.getMatricula().toUpperCase(), newVehicle); return newVehicle.getMatricula(); }else{ return "No se ha podido añadir"; } } }

Algo así sería... Lo he escrito sin IDE y pueden haber fallos sintácticos XD

Lan0s

Justo este verano quería aprender Java, ya que estoy finalizando una ingeniería, no nos enseñan nada de este lenguaje y sin embargo lo piden en muchísimas ofertas de trabajo.

¿Cómo debería enfocar el aprendizaje? He trabajado con C, C++ (mayormente a bajo nivel) y algo de C#. Me gustaría aprender a programar aplicaciones para Android.

¡Gracias por el hilo!

2 respuestas
Drhaegar

#140 Si ya sabes programar en C dar el salto a Java es muy fácil, yo estaba en la misma situación que tú y en menos de un mes aprendí por mi cuenta todo lo básico para hacer APPs para Android sin haber tocado antes Java.

Lo mejor es coger algún tutorial que te enseñe a programar para Android y cada día ir haciendo un poco.

zoeshadow

#140 Si sabes inglés te recomiendo este libro en cuanto a desarrollo en Android.

Además si has desarrollado en C#, segun tengo entendido la Orientación a Objetos es casi igual que en Java, si entiendes eso tienes el 70% aprendido ya.

Hay que tener en cuenta que lo que se usa en Android no es Java normal, además de utilizar una VM distinta, Dalvik, tiene unas necesidades y restricciones muy distintas a las de una aplicación servidor ( tiempo de arranque, recursos disponibles, etc .. ), por lo que aunque el lenguaje sea igual, tanto las herramientas, frameworks, cómo diseño de aplicaciones es totalmente distinto a lo que se suele ver en las aplicaciones "empresariales"...

Todo esto te lo digo para que te hagas a la idea de que aunque aprendas Java, y desarrolles aplicaciones de Android, si algún día intentas hacer una entrevista para la mayoría de estas ofertas, te va a sonar todo a chino, aunque ambas sean de Java.

FoxWinterMan

Tengo Calendar fechaEntrada, la instancio con el metodo getInstance(). Y cuando quiero imprimirlo en JOptionPane me sale un churro de datos increible, y nose como modificar para que me coja solo dia/mes/año hora/minutos.

Lo modifique usando Date y con SimpleDateFormat me lo formateaba como yo queria, que pasa que necesito despues pasar el tiempo a minutos y para eso Calendar tiene getTimeinMilis cosa que Date no tiene asique estoy super desesperado, porque he probado de todo y bien con Calendar me sale el churro de datos y con Date nose como pasarlo a minutos el tiempo obtenido.

Alguna sugerencia?

3 respuestas
Khanser

#143 A que te refieres con "pasar el tiempo a minutos"? getTimeMillis te devuelve el valor en milisegundos.

zoeshadow

#143 Para cualquier cosa de fechas usa la librería si puedes Joda Time o la nueva librería que viene en con Java8 te va a ahorrar muchos quebraderos de cabeza.

1 respuesta
SikorZ

#143 Ya te lo han dicho arriba tio... en Calendar creo que era, tienes un getter: getTime() o algo asi, que devuelve la fecha en ms. Coges los MS que equivalen a la fecha de entrada y salida, ves cuando hay de diferencia entre uno y otro, te dara un numero tocho que sno los MS del tiempo que ha pasado entre las fechas y luego lo vuelves a pasar a fecha.

Si vas a tener que tocar muchas fechas en muchos sitios haz lo que dice #145, pero solo si vas a usarlo mucho, porque para lo que planteas nada mas... es una tonteria xD

#108 Pues la mejor forma es usando Spring, haces un messages_es.properties y un messages_en.properties por ponerte el ejemplo que tenemos en el proyecto que acabamos de terminar, y en cada uno pones las descripciones, es un estilo asi el contenido:

# Labels para botones
btn.ok = Ok
btn.close = Cerrar
etc...

Lo que planteas del XML, bueno... Si mantienes el contenido y no tienes que leer del XML cada vez pues vale... Pero si no... Es mas complejo/costoso el parsear un XML para esa tonteria que tenerlo ya dentro del contexto que usa Spring por ejemplo.

Kiroushi

Tengo que terminar un Pacman para una asignatura de la UNED; y como es la primera vez que toco Java y la programación de juegos, quería preguntaros si es mejor usar un único Thread para el juego, o uno para cada personaje, para poder controlar independientemente las velocidades de actualización y que no me salgan doubles en las posiciones de cada uno.

1 respuesta
Khanser

#147 a no ser que hayas lidiado con problemas de sincronizacion en otras asignaturas, todo en un hilo porque sino las pasaras putas.

1 respuesta
Kiroushi

#148 Ahora mismo lo estoy probando con un hilo para el Pac y otro para un Blinky (el rojo).

La ventaja de meterlo a cada uno en un hilo, es que puedo hacer la actualización de las posiciones a tiempos diferentes (la velocidad del personaje).

Si uso el mismo hilo para todos, tengo que multiplicar la posición por una velocidad definida en la clase del personaje, pero me surge un problema: los personajes no pueden ir por debajo de un dx o dy igual a 1 (básicamente porque el desplazamiento mínimo es un pixel). Con esto no puedo hacer que el fantasma vaya a la mitad de velocidad cuando el Pac coge un punto grueso, por ejemplo.

Hay algún otro approach para esto?

1 respuesta
sasher

#149 Si, muchos:

http://gameprogrammingpatterns.com/game-loop.html

1

Usuarios habituales