elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Mejorar Captura Firma Manuscrita
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mejorar Captura Firma Manuscrita  (Leído 3,947 veces)
Juan Pelaez

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Mejorar Captura Firma Manuscrita
« en: 19 Febrero 2021, 09:07 am »

Buenos días,

Primero un Saludo a todos porque soy nuevo en este foro.

Segundo, os sitúo un poco sobre mi situación, soy programador desde hace un MONTON de años pero en otro sistema ( RPG - AS400 IBM ), nada que ver con el apasionante mundo del Java, Hace algún tiempo empecé a meterme con Java sobre todo para complementar las GRANDES carencias de los IBM. Teniendo la necesidad en un programa de registrar la firma de los visitantes encontré el código de un forero dani86 que hace EXACTAMENTE lo que necesito, el caso es que el código que el puso tiene el problema que NO se vé la firma que haces en el panel, SI la graba Bien y SI la graba en la ruta que le especifico.

Dado que aun soy nuevo en esto no se muy bien como arreglarlo, no os pido que me lo hagáis por mi pero SI algún consejo para trabajar este código. Entiendo que sería plasmar en el JPanel lo que estoy grabando.

La parte que me interesa es el código que pone EL habiéndolo pasado a un programa Java autoejecutable pasándole parámetros y donde comenta este problema :

https://foro.elhacker.net/java/problemas_con_app_simple_para_dibujar_firma_y_guardarla_como_imagen-t427969.0.html

Muchas gracias por vuestra ayuda.



En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Mejorar Captura Firma Manuscrita
« Respuesta #1 en: 19 Febrero 2021, 11:22 am »

Suena interesante, pero de por si, no uses Applet eso esta deprecated, creo que extendiendo de un JPanel la historia seria mejor, vere que puedo hacer.


En línea



rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen ki
Juan Pelaez

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Mejorar Captura Firma Manuscrita
« Respuesta #2 en: 19 Febrero 2021, 14:26 pm »

Suena interesante, pero de por si, no uses Applet eso esta deprecated, creo que extendiendo de un JPanel la historia seria mejor, vere que puedo hacer.


MUCHAS Gracias,

Toda ayuda será bien recibida, mis conocimientos de Java no son muy amplios.

En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Mejorar Captura Firma Manuscrita
« Respuesta #3 en: 20 Febrero 2021, 05:19 am »

Algo se avanzo pero el sueño no me deja... guiate abajo  :P

  • Código tomado del original y refactorizado, asi que creditos a esa gente tan aburrida  :xD
  • Añadido un JFileChooser para guardar la imagen resultante
  • Refactorización del JPanel para que se escriba dentro de el, y no en todo el JFrame como el codigo original
  • Sin test unitarios

FIXME

  • Refactorizar para que al redimenzionar el JFrame el JPanel de firmar, lo haga también
  • Quizas redimencionando el JPanel de firma bastaria, pero el BufferedImage abria que retocarlo eso creo.

MainJFrame

Código
  1. package com.signwithmouse;
  2.  
  3. import lombok.extern.slf4j.Slf4j;
  4.  
  5. import javax.swing.*;
  6. import javax.swing.border.TitledBorder;
  7. import java.awt.*;
  8.  
  9. /**
  10.  * https://foro.elhacker.net/java/problemas_con_app_simple_para_dibujar_firma_y_guardarla_como_imagen-t427969.0.html
  11.  *
  12.  * Nombre de clase = recogeFirma
  13.  * Descripcion = Clase encargada de capturar la firma que se dibuja en pantalla
  14.  *
  15.  * @version 1.0
  16.  * @author rubn
  17.  * @author google
  18.  * @author mas personas
  19.  */
  20. @Slf4j
  21. public class MainJFrame extends JFrame {
  22.  
  23.    private static final String TITLE = "App Firma";
  24.    private JButton jButtonBorrar = new JButton("Borrar");
  25.    private JButton jButtonGuardar = new JButton("Guardar");
  26.    private JLabel jLabelIL = new JLabel("Introduzca su firma");
  27.  
  28.    private final JPanel mainJPanel = new JPanel();
  29.    //Algo de Magia
  30.    private JPanelForSign jPanelForSign = new JPanelForSign();
  31.  
  32.    public MainJFrame() {
  33.  
  34.        this.configureJFrame();
  35.        this.configureJPanels();
  36.        this.initBehaviour();
  37.  
  38.    }
  39.  
  40.    private void configureJFrame() {
  41.        super.setResizable(false);
  42.        super.setPreferredSize(new Dimension(400,350));
  43.        super.add(mainJPanel);
  44.        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  45.        super.pack();
  46.        super.setLocationRelativeTo(null);
  47.        super.setVisible(true);
  48.    }
  49.  
  50.    private void configureJPanels() {
  51.  
  52.        final TitledBorder border = new TitledBorder(TITLE);
  53.        border.setTitleJustification(TitledBorder.CENTER);
  54.        border.setTitlePosition(TitledBorder.TOP);
  55.  
  56.        this.mainJPanel.setBorder(border);
  57.        this.mainJPanel.setLayout(new BorderLayout());
  58.  
  59.        final JPanel panelFooter = new JPanel();
  60.        panelFooter.setLayout(new FlowLayout());
  61.        panelFooter.add(new JLabel());
  62.        panelFooter.add(jLabelIL);
  63.        panelFooter.add(jButtonBorrar);
  64.        panelFooter.add(jButtonGuardar);
  65.        mainJPanel.add(jPanelForSign);
  66.        mainJPanel.add(panelFooter,BorderLayout.SOUTH);
  67.        mainJPanel.setPreferredSize(new Dimension(450, 250));
  68.    }
  69.  
  70.    private void initBehaviour() {
  71.        jButtonBorrar.addActionListener(e -> {
  72.            //Blanquear la imagen de la firma
  73.            jPanelForSign.clearSignZone();
  74.        });
  75.        jButtonGuardar.addActionListener(e -> {
  76.            jPanelForSign.guardarFirma();
  77.        });
  78.    }
  79.  
  80.    public static void main(String... blabla) {
  81.        final String osType = System.getProperty("os.name");
  82.        try {
  83.            if(osType.contains("Win")) {
  84.                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
  85.            }else if(osType.contains("Linux")) {
  86.                UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
  87.            }
  88.        }catch(Exception ex) {}
  89.  
  90.        new Thread(MainJFrame::new).start();
  91.    }
  92.  
  93. }

JPanelForSign

Código
  1. package com.signwithmouse;
  2.  
  3. import com.signwithmouse.util.GetFileChooser;
  4. import lombok.extern.slf4j.Slf4j;
  5.  
  6. import javax.imageio.ImageIO;
  7. import javax.swing.*;
  8. import java.awt.*;
  9. import java.awt.event.MouseAdapter;
  10. import java.awt.event.MouseEvent;
  11. import java.awt.event.MouseMotionAdapter;
  12. import java.awt.image.BufferedImage;
  13. import java.io.IOException;
  14. import java.nio.file.Path;
  15. import java.util.concurrent.atomic.AtomicInteger;
  16.  
  17. /**
  18.  * JPanel donde se firmara
  19.  */
  20. @Slf4j
  21. public class JPanelForSign extends JPanel {
  22.  
  23.    private static final int WIDTH = 400;
  24.  
  25.    private BufferedImage bufferedImage = new BufferedImage(WIDTH, WIDTH, BufferedImage.TYPE_INT_ARGB);
  26.    private final AtomicInteger uX = new AtomicInteger();
  27.    private final AtomicInteger uY = new AtomicInteger();
  28.  
  29.    public JPanelForSign() {
  30.        super.setBackground(Color.WHITE);
  31.        super.requestFocus();
  32.        super.setBorder(BorderFactory.createEtchedBorder());
  33.        this.addMouseListener(new MouseAdapter() {
  34.            @Override
  35.            public void mousePressed(MouseEvent e) {
  36.                uX.set(e.getX());
  37.                uY.set(e.getY());
  38.                repaint();
  39.            }
  40.        });
  41.  
  42.        this.addMouseMotionListener(new MouseMotionAdapter() {
  43.            @Override
  44.            public void mouseDragged(MouseEvent e) {
  45.                final int x = e.getX();
  46.                final int y = e.getY();
  47.                final Graphics2D g2 = (Graphics2D) bufferedImage.getGraphics();
  48.                g2.setBackground(Color.WHITE);
  49.                g2.setColor(Color.BLACK);
  50.                g2.drawLine(uX.get(), uY.get(), x, y);
  51.                uX.set(x);
  52.                uY.set(y);
  53.                g2.dispose();
  54.            }
  55.        });
  56.  
  57.    }
  58.  
  59.    public void clearSignZone() {
  60.        this.createEmptyImage();
  61.        super.repaint();
  62.    }
  63.  
  64.    private void createEmptyImage() {
  65.        bufferedImage = new BufferedImage(super.getWidth(), super.getHeight(), BufferedImage.TYPE_INT_ARGB);
  66.        final Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();
  67.        g2d.setColor(Color.BLACK);
  68.    }
  69.  
  70.    @Override
  71.    public void paint(Graphics g) {
  72.        super.paint(g);
  73.        final Graphics2D graphics2D = (Graphics2D) g.create();
  74.        graphics2D.drawImage(bufferedImage, 0, 0, null);
  75.        super.repaint();
  76.    }
  77.  
  78.    /**
  79.      * Método que guarda la imagen generada
  80.      */
  81.    public void guardarFirma() {
  82.        final JFileChooser jFileChooser = GetFileChooser.getFileChooser(JFileChooser.DIRECTORIES_ONLY);
  83.        if (jFileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
  84.            Path path1 = jFileChooser.getSelectedFile().toPath();
  85.            final String fileN = path1.getFileName().toString();
  86.  
  87.            if(!fileN.endsWith(".png")) {//En caso de que no termine en .png se lo concatenamos
  88.                try {
  89.                    String fileName = path1.getFileName().toString().concat(".png");
  90.                    path1 = path1.resolveSibling(fileName);
  91.                    ImageIO.write(bufferedImage, "png", path1.toFile());
  92.                    JOptionPane.showMessageDialog(null, "Imagen creada correctamente!");
  93.                } catch (IOException e) {
  94.                    log.warn(e.getMessage());
  95.                    JOptionPane.showMessageDialog(null, "Error al guardar!");
  96.                }
  97.            } else {
  98.                try {
  99.                    final Path path2 = jFileChooser.getSelectedFile().toPath();
  100.                    ImageIO.write(bufferedImage, "png", path2.toFile());
  101.                    JOptionPane.showMessageDialog(null, "Imagen creada correctamente!");
  102.                } catch (IOException e) {
  103.                    log.warn(e.getMessage());
  104.                    JOptionPane.showMessageDialog(null, "Error al guardar!");
  105.                }
  106.            }
  107.        }
  108.    }
  109. }

Para guardar




Borrar la firma



« Última modificación: 20 Febrero 2021, 14:18 pm por rub'n » En línea



rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen ki
Juan Pelaez

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Mejorar Captura Firma Manuscrita
« Respuesta #4 en: 20 Febrero 2021, 11:41 am »

Algo se avanzo pero el sueño no me deja... guiate abajo  :P

Para guardar




Borrar la firma



Source


De verdad rub'n, MUCHISIMAS GRACIAS, este fín de semana voy a analizar el código e implantarlo ( con tu permiso ).

Ya te contaré que tal me ha ido.

Envidia me das de dominar de esta forma el Java.

 ;-) ;-) ;-) ;-) ;-)

En línea

Juan Pelaez

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Mejorar Captura Firma Manuscrita
« Respuesta #5 en: 22 Febrero 2021, 21:09 pm »


De verdad rub'n, MUCHISIMAS GRACIAS, este fín de semana voy a analizar el código e implantarlo ( con tu permiso ).

Ya te contaré que tal me ha ido.

Envidia me das de dominar de esta forma el Java.

 ;-) ;-) ;-) ;-) ;-)




Buenas noches,

Siento molestarte pero estoy atascado en :

@Slf4j

No tengo muy claro que es y como incorporarlo para que en Eclipse no me de error ( siento mi desconocimiento de Java )

Puedes orientarme ?

Gracias
En línea

K-YreX


Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Mejorar Captura Firma Manuscrita
« Respuesta #6 en: 23 Febrero 2021, 01:14 am »

@Slf4j es una anotación que permite generar un log de forma alternativa a crear un atributo static. Para utilizarlo debes incorporar la biblioteca lombok a tu proyecto e importarlo con:
Citar
Código
  1. import lombok.extern.slf4j.Slf4j;

Los logs sirven para producir mensajes en determinados puntos y mostrarlos o guardarlos en un fichero de salida (lo que se conocen como los logs de la aplicación) para ver un seguimiento y poder detectar errores, problemas,...

Si no vas a utilizar logs en tu aplicación y/o no utilizas lombok, puedes eliminar esa anotación y el import indicado antes sin problemas y todo debería funcionar correctamente.

Suerte  :-X
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Mejorar Captura Firma Manuscrita
« Respuesta #7 en: 23 Febrero 2021, 07:15 am »

K-YreX asi es.

Juan Pelaez no importa que preguntes eso, Mmm creo que debes permitir el uso de lombok en eclipse.

O comentar la linea 20,  94 y 103 en la clase JPanelForSign 
En línea



rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen ki
Juan Pelaez

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Mejorar Captura Firma Manuscrita
« Respuesta #8 en: 23 Febrero 2021, 09:19 am »

K-YreX asi es.

Juan Pelaez no importa que preguntes eso, Mmm creo que debes permitir el uso de lombok en eclipse.

O comentar la linea 20,  94 y 103 en la clase JPanelForSign 

Ok, Gracias a los dos ( rub'n, K-YreX ).Lo he entendido perfectamente, como parece interesante el poder seguir posibles Errores voy a intentar incorporarlo en el proyecto. También es una forma de ir aprendiendo más.

Gracias,

Ya os contaré.

En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Mejorar Captura Firma Manuscrita
« Respuesta #9 en: 23 Febrero 2021, 09:31 am »

Ok, Gracias a los dos ( rub'n, K-YreX ).Lo he entendido perfectamente, como parece interesante el poder seguir posibles Errores voy a intentar incorporarlo en el proyecto. También es una forma de ir aprendiendo más.

Gracias,

Ya os contaré.



Asi es, si quieres una tarea buena, aprende con lombok, no te sera muy complicado, solo que por medio de anotaciones tienes esa utilidad tambien,

Entonces permite crear codigo en runtime, nos ahorra escribir codigo, incluso dicha dependencia ya viene por defecto en otro IDE como IntelliJ IDEA siendo la configuracion muy corta y facil.


prueba a usar la anotacion @Data de lombok es cool, te crea, getters, setter, toString() hashCode() e Equals() en runtime... y el codigo te quedaria algo asi

Código
  1. @Data
  2. public class Hola {
  3.  
  4.    private String hola = "Hi!";
  5.  
  6. }

Donde aparentemente no pasa nada, pero si que hay magia detras... cuando vas a otra clase puedes hacer

Código
  1. new Hola().setHola("");

o

Código
  1. new Hola().getHola();
« Última modificación: 23 Febrero 2021, 15:36 pm por rub'n » En línea



rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen ki
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
hola tengo una duda con respecto a la captura de canales plus
Multimedia
bolao 0 1,377 Último mensaje 2 Mayo 2005, 20:09 pm
por bolao
no captura el audio
Multimedia
aivilis 2 1,442 Último mensaje 13 Abril 2006, 11:17 am
por Sourraund
captura eventos
Java
Bleach@lex 3 4,150 Último mensaje 1 Diciembre 2009, 23:03 pm
por Caballero Maldito
Fraps 3.2.4: captura imágenes, mide los FPS y graba vídeos de tus videojuegos...
Software
wolfbcn 0 3,019 Último mensaje 30 Noviembre 2010, 14:04 pm
por wolfbcn
Tipografia "desordenada, manuscrita, mano alzada?"
Diseño Gráfico
Darioxhcx 1 4,493 Último mensaje 24 Noviembre 2012, 17:50 pm
por Darioxhcx
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines