|
111
|
Programación / Java / Re: Mejorar Captura Firma Manuscrita
|
en: 20 Febrero 2021, 05:19 am
|
Algo se avanzo pero el sueño no me deja... guiate abajo - Código tomado del original y refactorizado, asi que creditos a esa gente tan aburrida
- 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.
MainJFramepackage com.signwithmouse; import lombok.extern.slf4j.Slf4j; import javax.swing.*; import javax.swing.border.TitledBorder; import java.awt.*; /** * https://foro.elhacker.net/java/problemas_con_app_simple_para_dibujar_firma_y_guardarla_como_imagen-t427969.0.html * * Nombre de clase = recogeFirma * Descripcion = Clase encargada de capturar la firma que se dibuja en pantalla * * @version 1.0 * @author rubn * @author google * @author mas personas */ @Slf4j public class MainJFrame extends JFrame { private static final String TITLE = "App Firma"; private JLabel jLabelIL = new JLabel("Introduzca su firma"); //Algo de Magia private JPanelForSign jPanelForSign = new JPanelForSign(); public MainJFrame() { this.configureJFrame(); this.configureJPanels(); this.initBehaviour(); } private void configureJFrame() { super.setResizable(false); super. setPreferredSize(new Dimension(400, 350)); super.add(mainJPanel); super. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); super.pack(); super.setLocationRelativeTo(null); super.setVisible(true); } private void configureJPanels() { this.mainJPanel.setBorder(border); panelFooter. add(new JLabel()); panelFooter.add(jLabelIL); panelFooter.add(jButtonBorrar); panelFooter.add(jButtonGuardar); mainJPanel.add(jPanelForSign); mainJPanel. setPreferredSize(new Dimension(450, 250)); } private void initBehaviour() { jButtonBorrar.addActionListener(e -> { //Blanquear la imagen de la firma jPanelForSign.clearSignZone(); }); jButtonGuardar.addActionListener(e -> { jPanelForSign.guardarFirma(); }); } public static void main (String... blabla) { try { if(osType.contains("Win")) { UIManager. setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); }else if(osType.contains("Linux")) { UIManager. setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); } new Thread(MainJFrame ::new). start(); } }
JPanelForSignpackage com.signwithmouse; import com.signwithmouse.util.GetFileChooser; import lombok.extern.slf4j.Slf4j; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.file.Path; import java.util.concurrent.atomic.AtomicInteger; /** * JPanel donde se firmara */ @Slf4j public class JPanelForSign extends JPanel { private static final int WIDTH = 400; private final AtomicInteger uX = new AtomicInteger(); private final AtomicInteger uY = new AtomicInteger(); public JPanelForSign() { super. setBackground(Color. WHITE); super.requestFocus(); @Override uX.set(e.getX()); uY.set(e.getY()); repaint(); } }); @Override final int x = e.getX(); final int y = e.getY(); g2. setBackground(Color. WHITE); g2. setColor(Color. BLACK); g2.drawLine(uX.get(), uY.get(), x, y); uX.set(x); uY.set(y); g2.dispose(); } }); } public void clearSignZone() { this.createEmptyImage(); super.repaint(); } private void createEmptyImage() { g2d. setColor(Color. BLACK); } @Override super.paint(g); graphics2D.drawImage(bufferedImage, 0, 0, null); super.repaint(); } /** * Método que guarda la imagen generada */ public void guardarFirma() { if (jFileChooser. showSaveDialog(this) == JFileChooser. APPROVE_OPTION) { Path path1 = jFileChooser.getSelectedFile().toPath(); final String fileN = path1. getFileName(). toString(); if(!fileN.endsWith(".png")) {//En caso de que no termine en .png se lo concatenamos try { String fileName = path1. getFileName(). toString(). concat(".png"); path1 = path1.resolveSibling(fileName); ImageIO.write(bufferedImage, "png", path1.toFile()); JOptionPane. showMessageDialog(null, "Imagen creada correctamente!"); log.warn(e.getMessage()); JOptionPane. showMessageDialog(null, "Error al guardar!"); } } else { try { final Path path2 = jFileChooser.getSelectedFile().toPath(); ImageIO.write(bufferedImage, "png", path2.toFile()); JOptionPane. showMessageDialog(null, "Imagen creada correctamente!"); log.warn(e.getMessage()); JOptionPane. showMessageDialog(null, "Error al guardar!"); } } } } }
Para guardar
Borrar la firma
|
|
|
113
|
Comunicaciones / Redes / Re: Desbloqueo Router Arris TG2482A
|
en: 18 Febrero 2021, 17:27 pm
|
Hola, al hacer ese proceso como obtengo la semilla? Tengo la contraseñas de octubre y noviembre, pero no he podido obtener la semilla
Doc que quieres hacer? este post es sobre tener acceso a la vista "Advanced" del modem.
|
|
|
114
|
Programación / Java / Re: java.lang.UnsupportedClassVersionError
|
en: 18 Febrero 2021, 02:46 am
|
Hola, estoy tratando de compilar un codigo y me sale el siguiente error:
Error: LinkageError occurred while loading main class Menu java.lang.UnsupportedClassVersionError: Menu (class file version 58.65535) was compiled with preview features that are unsupported. This version of the Java Runtime only recognizes preview features for class file version 59.65535
Nose como hacer para solucionarlo, alguien podria ayudarme?
Muchas gracias
Creo que tienes la Jdk 14 y 15,
Usa la open jdk 11 esta es LTS tanto para compilar y ejecutar. ajusta tu path.
|
|
|
115
|
Programación / Java / Re: proceso en segundo plano que me reemplaza paneles, en modo debugger funciona
|
en: 11 Febrero 2021, 23:14 pm
|
Que tal doc, usa Geshi con Java, para que añadas una descripcion basica mas detallada, en las lineas mas potenciales si es posible.
Estas variables podria aplicar locks con synchronized() {} (siempre como ultima instancia, para evitar deadlocks), hacerlas inmutables o con Referencias atomicas, dado que estan en un background thread
- fParent - jPanelCuerpo
Mismo para estas variables booleanas dentro del Thread Referencia Atomica
AtomicBoolean atomicBoolean = new AtomicBoolean();
- lupdateui - linstancio Aun asi, necesitaria mas codigo, sobre todo de las variables de instancia. Otra cosa que no entiendo es la siguiente, si necesitas que los paneles se muestren de manera secuencial, es decir no paralela, porque implementas a Runnable?
Has intentado hacer todo sin sobreescribir el método run() ? el run es asíncrono, paralelo no secuencial, si quieres añade la clausula synchronized al método ya creado y comprueba su comportamiento@Override public synchronized void run(){ }
|
|
|
117
|
Programación / Java / Re: Programar en Kotlin
|
en: 22 Enero 2021, 20:09 pm
|
Kotlin, el enlace perdido entre java y scala...
Porque no lo aprendes? yo ni idea por los momentos, pero si ya sabes C, eso supone una ventaja...
|
|
|
118
|
Programación / Java / Re: contribucion ejemplo de eventbus
|
en: 18 Enero 2021, 03:13 am
|
se siente raro quedar hablando solo
Y acaso necesitas obligatoriamente que te respondan? Sapito tienes mas de 10 años en el foro, dejale eso a alguien con poco tiempo aqui , a mi cada vez que dices eso me da mucha risa. Simple y llanamente sigue colaborando y ya, que tan dificil es? ajjajaaa
|
|
|
|
|
|
|