JKeyboard
JKeyboard es una pequeña aplicación swing que proporciona un teclado virtual en pantalla pensado para introducir contraseñas en campos de texto de modo seguro incluso si hay un keylogger instalado en el equipo del usuario, ya que las contraseñas se introducen haciendo clics con el ratón sobre el teclado virtual, y no pulsando teclas.
Este mecanismo para evitar keyloggers no es perfecto; algún software malicioso de este tipo va más allá de simplemente registrar pulsaciones de teclas y es capaz de darse cuenta cuando el usuario está a punto de introducir un password en ciertas web y realiza capturas de pantalla cuando se producen los clics, averiguando de ese modo qué teclas en el teclado virtual han sido "pulsadas". Aunque no es un sistema perfecto, si sube bastante la barrera de seguridad para los keyloggers.
El código de Este pequeño proyecto puede descargarse desde aquí, y aquí tenéis un pequeño ejemplo con código fuente mostrando cómo se usa.
Reader Comments (17)
Aguante Swing! Es el mejor framework para hacer aplicaciones de escritorio, lo uso cada tanto desde .... que venia separado de java.. en 1998 mas o menos :)
Desde mi punto de vista, el JKeyboarPanel está demasiado acoplado con el objeto JTextField (si no recuerdo mal de lo que leí ayer del código).
Yo quizás optaría por el típico modelo EventListener de Java. Así, cuando picas un tecla el panel lanza un evento en lugar de ser responsable de escribir en el JTextField. Esto te permitiría utlizar el componente en muchos casos además del JTextField: para un JTree, un canvas... vaya, lo que tú quieras.
De todas formas, gracias por compartir el código.
Un saludo
muy bien
pero tiene algunos "errores" de diseño te acoplas a Jtextfield(lo cual es feo) eso esta mal diseñado si te vas a acoplar mejor evitarlo con el patrón observer (podemos pasar por alto por que tu forma es mas practica aunque es recomendable trabajar con las demas opciones) o te creas una interface a medida o la que es mejor no te acoples a Jtextfield acoplate siempre al que este mas alto en la jerarquía de herencia que puedas en este caso al JTextComponent o si quieres ser mas "purista" usa la interfase Document
A propósito swing apesta estamos en el 2012 hasta el mundo se puede acabar y no tenemos un miserable selector de fechas tampoco tenemos biding y ni que hablas de wrapers que transformen de resulset a comboboxmodel o a tablemodel ;tampoco,tenemos un modelo unico como lo tienen los de punto .net , si quieres crear un modelo pues lo tienes que hacer para el jtable para el combo para el textfield para Jspiner etc y ni hablar que trabajar con eventos en java es horrible son mas de 4 lineas por listener y todavia tenemos que usar el mal menor de las clases anonimas internas
Hola Luis,
si estudiaras un poco, verías que Swing tiene todo eso que tú dices que no tiene y además se te despejaría la nariz.
@Luis
Le he dedicado unos minutos a imaginar cómo se puede tener un "modelo único" para todo, y no he llegado a entender cómo un "tree", una "table" y una "list" pueden compartir el mismo modelo. JList y JComboBox sí pueden compartirlo, ¿Lo sabías?.
Por la misma razón, tampoco imagino como se puede usar un ResultSet directamente, sin transformaciones, cuando los modelos son diferentes, y el propio ResultSet no es una estructura de datos, sino un medio para obtenerlos. Lo habitual es transformar un ResultSet en un Map, lo que puede hacerse de manera genérica, y que cada modelo de componente use del Map que recibe lo que necesite.
¿Te preocupa que un listener tenga más 4 líneas? :D
Suelo tener listeners con decenas de líneas, o es que crees que van a "hacer el trabajo ellos solos".
Claro está que para ahorrarme escribir siempre "lo mismo", uso las funciones de autocompletar de NetBeans. ¿O es que todavía "programas" con un simple editor de texto"?
@luis
Como ya te han contestado comprenderás que estás bastante confundido o despistado.
De todas formas si no te gusta Swing no lo uses, nadie te obliga. Alternativas gratuitas o de código abierto y multiplataforma para el escritorio con tanta madurez y calidad seguramente si tiras una piedra te saldrán por docenas.
Lo que pasa es que queremos ir al restaurante a darnos la gran comilona, que sea gratis y que encima me hagan un masaje en la siesta. No hombre no, habrá que currárselo un poco o si quieres hay productos y plataformas Swing de pago y de código abierto que hacen algunas cosas de las que dices y muchísimo mas, y otras como ya te han contestado parecen mas bien un poco sin sentido.
Y en fin, ahí tienes JFX2, que ya veremos donde está dentro de 20 años (o de 2), porque se me hace a mi que Swing le va a sobrevivir a JFX2 o en cualquier caso JFX2 no va a sustituir a a Swing, y es una opinión personal.
Swing ha demostrado una madurez y una solidez espectaculares, por eso las aplicaciones de escritorio convencionales se seguirán haciendo con Swing desde luego como mínimo por largos años. Y como creo que tendremos Swing habrá que ver que vas a hacer cuando quieras escribir una aplicación de escritorio convencional con Java, porque hoy día nadie se atreve a mover un dedo por JFX2 por mas que Oracle lo vaya promocionando a bombo y platillo, que escaldado está el gato y como bien recuerdan a menudo en JavaHispano aquello para lo que parece que se hizo JFX2 parece definitivamente un sector de negocio y técnico ya superado.
Saludos.
(voy a sacarle un par de canas a @Antonio, je, je)
¡Larga vida a JFX! :D
Hablando en serio, estoy siguiendo en primera fila de butacas el desarrollo de JFX 2.1, y muy atento a la encuesta actual en java.net
http://www.java.net/poll/will-you-use-javafx-development-once-its-fully-ported-mac-and-linux-platforms#comments
que todavía no está cerrada, y las expectativas mejoran a cada semana.
Estos comentarios recientes de Michael Heinrichs también pueden arrojar más luz:
http://blog.netopyr.com/2012/02/23/most-often-asked-questions-about-javafx
Bueno, es la polémica de siempre y no vamos a repetir argumentos. Algún día que tenga tiempo le echaré un buen vistazo a JavaFX, quizás cambie de opinión. Pero por lo que he visto muy por encima a JavaFX le queda todavía bastante y eso es lo que digo, que Swing tiene muchos años de ventaja y ha demostrado que aguanta y esa es la carrera que tendrá que correr JavaFX. Yo creo no obstante que JavaFX no va a ser un superconjunto de Swing sino que está mas orientado a las últimas tecnologías y a eso se va a dedicar. Me puedo estar equivocando, por supuesto.
Bueno si me equivoco estamos para aprender a propósito lo que no es correcto calificar de desconocimiento o error cuando no lo hay yo no tengo ningún problema en reconocer mis errores y no me siento afectado
@peyrona @choces @antonio sanches
Si estas afirmando que me equivoco te tocan sostener las pruebas a si no nos podemos pasar toda la vida afirmando cosas sin sentido como que soy un marciano
yo afirme que no existe un componente especializado para seleccionar fechas peyrona como tu dices que me equivoco te toca demostrar cual es ese famoso componente en swing creado especialmente para seleccionar fechas tendrías que mostrar que clase especifica en swing tiene forma de calendario
También te toca mostrar cuales son o no son las clases especificas en swing dedicadas exclusivamente a hacer beans biding
Para los desinformados en .net si tienen modelo único por que puedes llenar un tabla con un datatable y puedes llenar también un combo con el mismo datatable
dataGridView1.DataSource = dt
cbx.DataSource = dt
cbx.ValueMember = dt.Columns(0).ToString()
cbx.DisplayMember = dt.Columns(1).ToString()
y por ultimo creí que estamos lo suficientemente grandecitos para saber que en java existe la reflexión además que puedes obtener Meta información de un resulset(con el metodo getMetadata) con lo cual es totalmente posible llenar directamente combo o una tabla con un resulset cualquiera ademas crear wrapers
http://casidiablo.net/consultar-base-datos-java-mostrar-resultados-jtable/
@antonio
A propósito si me equivoque en que un jcombo y jlist pueden tener el mismo modelo XD
"me siento tan deprimido y ofendido por que me lo hicieras notar" (sarcasmo xD) te mereces una estrellita en la frente
Cuando me refería a las 4 líneas me refería a la creación del listener no se ustedes pero a mi me gusta que mi código sea lo mas limpio posible y tener que copiar y pegar esas cuatro lieneas en un formulario con 5 o 6 botones es feo es mi humilde opinión si soy troll por eso diganme troll
Lo que me sorprende es el desconocimiento de un buen diseño como es posible que programes tanto en la vista programar en la vista es de novatos y digamos que quieres reutilizar lo que programaste en la vista que harías copiar y pegar lo que escribiste en la vista o creas instancia del formularios para reutilizar sus métodos :- |
A propósito tener un simple calendario(no importa si es muy simple) después de tantos años me parece increíble incluso vb 6 tiene calendario
Mi perro me dijo que peyrona tiene que darme todo su dinero y no necesito probar que mi perro me lo dijo
@Luis
Aparte de que confundes a los autores de algunos comentarios ;) lo que no sé si te lo perdonarán :D te voy a copiar a continuación mi método genérico para obtener datos de un ResulSet, para que lo compares con el de ese enlace que has puesto.
Creo que, antes de criticar cómo programan los demás (eso de programar en "vista" es de novatos), deberías conocer su código, cuando menos.
Si quieres, te paso un enlace con mi proyecto de código abierto, donde está el código de más abajo, y después comentamos sobre diseños y codificación.
@SuppressWarnings("unchecked")
private <T> Map<Integer, List<T>> processQuery(final PreparedStatement preSQLstatement) throws SQLException {
Map<Integer, List<T>> tableData = null;
try (final ResultSet results = preSQLstatement.executeQuery()) {
final ResultSetMetaData metadata = results.getMetaData();
try (final PreparedStatement countStatement = connection.prepareStatement(("SELECT COUNT(*) AS rows FROM ".concat(metadata.getTableName(1))))) {
try (final ResultSet rowCount = countStatement.executeQuery()) {
if (rowCount.next()) {
final int rows = rowCount.getInt("rows");
if (rows > 0) {
tableData = new HashMap<>(2 * rows);
// we first get the number of columns from the table metadata
final int tableColumns = metadata.getColumnCount();
// now we can loop through every row in the table to fetch data
// by walking down the table rows, moving the cursor one at a time
while (results.next()) {
// we create the row contents list
final List<T> rowElements = new ArrayList<>(2 * tableColumns);
// now we loop through every column in the row
for (int column = 1; column <= tableColumns; column++) {
// to fill the list with row contents
rowElements.add((T) results.getObject(column));
}
// we update the data map with the row data fetched
// the database counts rows from 1, so we adjust the map key
tableData.put(results.getRow() - 1, rowElements);
}
}
}
}
}
}
return tableData == null ? new HashMap<Integer, List<T>>(0) : tableData;
}
@choces
¿Cual es tu proyecto, si no es mucho preguntar?
@luis
El onus probandi recae sobre ti que eres el acusador, así que por favor no vengas señalando con el dedo y encima exigiendo que sea el acusado el que debe probar su inocencia, eso es una actitud bastante rústica.
Hay una cosa que se llama internete y esa cosa tiene otras cosas que se llaman buscadores los cuales tienen una potencia tal que te encuentran hasta la última tilde de lo mas exótico que se te pase por la cabeza preguntar. Como el asunto no merece que malgaste mas mi tiempo solo te desmentiré un par de cosas que has mencionado, el resto cúrratelo tu mismo además de que ya has sido contestado, y con todo: lo honesto sería desdecirse una vez comprendidas las evidencias de que lo que uno dijo era absolutamente falaz, no se si me explico.
Cito de memoria exclusivamente (ni siquiera he buscado) algunos que se me vienen a la cabeza:
Enlazado de granos (beans binding): JSR 295, OGNL, JGoodies Binding.
Selector de fecha: JXDatePicker, JCalendar, MigCalendar, y aquí sí que das una patada y te salen por docenas.
El resto, como te he dicho, te lo tienes que currar tu pero haz el favor de no hablar demasiado alegremente y en términos negativos de algo que no se conoce bien y no se ha hecho el suficiente esfuerzo objetivo de investigación para hacer un juicio públicamente sobre esa materia.
Saludos.
@luis
Y recuerda que Swing como toda la plataforma Java lo tienes GRATIS, no tienes que pagar ni una peseta y lo puedes usar en tus proyectos profesionales, y las otras opciones que mencionas son bajo licencia, tienes que pagarlas, es código propietario. No se si entiendes la diferencias pero es una diferencia muy grave. En Java las cosas funcionan de otra manera y aun así tienes mas opciones, las tienes gratis y de pago a elegir y normalmente las tienes de mayor calidad, tanto en las de código abierto como en las de pago. Importante esto a tenerlo en cuenta.
@Antonio
Siendo como es una aplicación de código abierto, no es mucho preguntar ;)
No es "descargable" todavía, puesto que está en desarrollo, pero el código fuente puede verse sin problemas.
http://www.javaforge.com/project/jplay
Sobre el asunto "Beans Binding", para los interesados:
http://kenai.com/projects/betterbeansbinding/pages/Home
@choces
Disculpa porque tal vez este entendiendo mal tu código... pero me parece mal diseñado en varias partes.
La que me resulta más errónea, es el core del código en sí. Tu estas haciendo un HashMap que contiene un elemento para cada fila y por cada fila un ArrayList con todos los valores de las columnas para esa fila, correcto?
No crees que debería ser al revés? Debería ser una lista con un elemento de la lista por cada fila y un HashMap por cada fila en el que la llave, valor sean el nombre de la columna y el valor de cada columna...
No tiene mas sentido de esta forma?
@Jazo
El sentido del código es representar fielmente una tabla de dos entradas, tal y como la información se almacena en las tablas de la base de datos. Por eso se usa un Map, en el que la clave es el número de la fila, y el valor es una lista con el contenido de las columnas.
De esa manera es muy sencillo recorrer el Map para construir el modelo de cualquier componente de Swing, que es lo que se pretende.
No entiendo lo que quieres representar con tu diseño:
- Una lista por fila: ¿Qué elementos contiene esa lista?
- Un Map por columna: ¿Dónde y cómo se devuelven esos Map?
No intento hacer "otro Hibernate", ni nada por el estilo ;) sino facilitarme las consultas mediante JDBC, y obtener estructuras simples para alimentar los modelos de Swing.