Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    37

    RobotExp utilizzabile in applet

    Salve ragazzi, su internet ho trovato la seguente classe

    codice:
    import java.awt.AWTException;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.awt.Dimension;
    import java.awt.*;
    
    import javax.imageio.ImageIO;
    
    public class RobotExp {
        
        public static void main(String[] args) {
            
            try {
                
                Robot robot = new Robot();
                // Capture the screen shot of the area of the screen defined by the rectangle
    			Dimension screen = 	Toolkit.getDefaultToolkit().getScreenSize();
                BufferedImage bi=robot.createScreenCapture(new Rectangle(800,800));
                ImageIO.write(bi, "jpg", new File("graphics1.jpg"));
                
            } catch (AWTException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    Avviandola tramite il prompt dei comandi fa uno screenshot al desktop e lo salva i formato jpg.

    Ho provato a far partire questa classe da un applet che ho creato ma non ci riesco in nessun modo...

    Consigli?

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    siccome era un argomento mezzo interessante, ho fatto una ricerchina ed è venuto fuori questo thread su StackOverflow:

    Thread @ StackOverflow.com

    ho messo un po' mano al codice originale per trasformarlo in JApplet:
    codice:
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import javax.imageio.*;
    import javax.swing.border.TitledBorder;
    /**
     *
     * @author Andrea
     */
    public class ScreenshotJApplet extends JApplet {
        
        static final String HELP = 
        "Type Ctrl-0 to get a screenshot of the current GUI.\n" + 
        "The screenshot will be saved to the current " + 
        "directory as 'screenshot.png'."; 
        
        public static BufferedImage getScreenShot(Component component) { 
            BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB); 
            // call the Component's paint method, using 
            // the Graphics object of the image. 
            component.paint(image.getGraphics()); 
            return image; 
        }
        
        private class MyActionListener implements ActionListener {
            
            private ScreenshotJApplet sja;
            
            public MyActionListener (ScreenshotJApplet sja) {
                this.sja = sja;
                
            }
            
            public void actionPerformed (ActionEvent ae) {
                BufferedImage img = sja.getScreenShot(sja.getContentPane());
                JOptionPane.showMessageDialog(null, 
                            new JLabel(new ImageIcon(img.getScaledInstance(img.getWidth(null)/2, img.getHeight(null)/2, Image.SCALE_SMOOTH)                     
                )));
            }
        }
        
        public void init() {        
            
            JMenuItem screenshot = new JMenuItem("Screenshot");
            screenshot.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_0, InputEvent.CTRL_DOWN_MASK)); 
            screenshot.addActionListener(new MyActionListener(this));            
                
            JMenu menu = new JMenu("Other");
            menu.add(screenshot);
            JMenuBar mb = new JMenuBar();
            mb.add(menu);
            this.setJMenuBar(mb);
            
            JPanel p = new JPanel(new BorderLayout(5,5));
            p.setBorder( new TitledBorder("Main GUI"));
            p.add(new JScrollPane(new JTree()), BorderLayout.WEST);
            p.add( new JScrollPane( new JTextArea(HELP,10,30)), BorderLayout.CENTER); 
            
            this.setContentPane(p);
            
            this.setVisible(true); 
        }         
    }
    e come puoi vedere, mostra il JOptionPane con l'immagine, scalata. Ho eliminato tutta la gestione del salvataggio su file perché comporta la firma dell'applet etc etc, magari la finisci tu.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    37
    Quindi in parole povere, se dovessi inserire questo sistema nella mia applet come dovrei fare?

    codice:
    import java.awt.*; // Per la classe Graphics
    import java.applet.*; // Per la classe Applet
    import java.net.*; // Per leURL
    import javax.swing.*;
    import java.awt.event.*;
    
    
    public class VisualizzaImmagine extends Applet  implements MouseListener
    {
          public void mousePressed  (MouseEvent e){}
          public void mouseReleased (MouseEvent e){}
          public void mouseEntered  (MouseEvent e){}
          public void mouseClicked  (MouseEvent e){
          
    // Qui dovrei la possibilità di fare lo screen ma non so come fare.      
          
          }
          public void mouseExited (MouseEvent e) {}
    }

    Poi altra cosa che non ho capito, è il perchè non salva lo screenshot sul pc?

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    mi pare abbastanza evidente come fare: ti copi quanto c'è nella classe MyActionListener e lo adatti alla tua applet (ovvero cambia i tipo di oggetto che passi, visto che la tua classe che estende JApplet sarà diversa da quello scheletro che ho postato io). A quel punto alla tua classe extends JApplet ci appiccichi anche quel listener.

    Poi tutta la menata CTRL+0 per visualizzare / (salvare) l'immagine è solo per evitare di mettere un JButton e/o impegnare il click del mouse.

    Per quanto riguarda il salvataggio dell'immagine: le applet girano tutte in una "sandbox" (ambiente chiuso e circoscritto, salvo falle della JVM o autorizzazioni speciali date all'applet stessa) che ne limita parecchio (deo gratias) il campo di azione, ovvero per far fare modifiche al sistema del client, bisogna che questi ne dia esplicita autorizzazione. Se ci fai caso, di tanto in tanto ti imbatti in applet o applicazioni java (caricate via Java Web Start) che richiedono il permesso dell'utente per compiere determinate azioni. Quel permesso si richiede fornendo l'applet di un certificato digitale etc etc. Siccome la cosa è un po' lunga e ci sono miliardi di tutorial (e thread qui sul forum) che descrivono come ottenere (oppure creare, anche se un certificato rilasciato dal privato x, quindi da qualcuno che non è autorità di certificazione in merito alla sicurezza informatica, ha ben poco valore) ed utilizzare un certificato/firma digitale, ti rimando a questi.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    37
    Sto andando nella confusione più totale.

    Lo so che chiedo molto, ma potresti adattarlo tu al mio codice?
    Ci sto provando ma incontro sempre errori, fai con comodo, quando hai voglia, per me l'importante è che funzioni.

    EDIT: Poi non capisco, come mai RobotoExp riesce a scrivere senza problemi il file sul PC, mentre questa classe richiede sto procedimento di firma dell'applet?

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Lo so che chiedo molto, ma potresti adattarlo tu al mio codice?
    direi di no e non vorrei sembrarti scortese o indisponente, però non solo è contro i miei principi, ma non sono nemmeno un programmatore professionista: lo faccio solo per passione e passo già troppo, troppo tempo davanti a schermi e schermetti vari per lavoro.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    37
    Non c'è problema, ti capisco.

    Ti chiedo allora di aiutarmi alla risoluzione degli errori durante la compilazione, sempre se sei disposto.

    codice:
    import java.awt.*; // Per la classe Graphics
    import java.applet.*; // Per la classe Applet
    import java.net.*; // Per leURL
    import javax.swing.*;
    import java.awt.event.*;
    
    
    public class VisualizzaImmagine extends Applet  implements MouseListener 
    {
    
    private class MyActionListener implements ActionListener {
            
            private ScreenshotJApplet sja;
            
            public MyActionListener (ScreenshotJApplet sja) {
                this.sja = sja;
                
            }
            
            public void actionPerformed (ActionEvent ae) {
                BufferedImage img = sja.getScreenShot(sja.getContentPane());  // Cannot Find Symbol  
                JOptionPane.showMessageDialog(null, 
                            new JLabel(new ImageIcon(img.getScaledInstance(img.getWidth(null)/2, img.getHeight(null)/2, Image.SCALE_SMOOTH)                     
                )));
            }
        }
    
          public void mousePressed  (MouseEvent e){}
          public void mouseReleased (MouseEvent e){}
          public void mouseEntered  (MouseEvent e){}
          public void mouseClicked  (MouseEvent e){
          
    // Qui dovrei la possibilità di fare lo screen ma non so come fare.      
          
          }
          public void mouseExited (MouseEvent e) {}
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ovvio che non funziona niente: del codice di una classe fanno parte anche gli import e poi si era detto poco più su che in ogni caso il listener andava riadattato, visto che non sa niente della tua JApplet...

    scusa la domanda, ma a questo punto mi sorge spontanea: tieni a portata di mano le API? E ancora di più, e questa è un'affermazione, devi andare oltre il copia-incolla, altrimenti non tirerai mai fuori il ragno dal buco.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    37
    Ok mi ci so messo e finalmente sono riuscito ad implementarlo all'interno del mio codice, con unico problema che al posto di fare lo screenshot del contenuto della mia applet (una serie di immagini messe con il metodo paint(). ) Compare invece la struttura creata da te con i menu.

    Facendo qualche prova, forse ho capito dove è il problema
    codice:
     p.add(new JScrollPane(new JTree()), BorderLayout.WEST);
            p.add( new JScrollPane( new JTextArea(HELP,10,30)), BorderLayout.CENTER);
    Sono le due parti del menu. Ecco, come devo fare invece per fare lo screenshot del metodo paint?

    Poi altra domanda, perchè bisogna certificare l'applet? Con il metodo RobotExp salva il file senza problemi sul pc, forse perchè non è un applet?

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Compare la struttura "fatta" da me (non l'ho fatta io) perché hai fatto un copia incolla senza valutare che cosa ti servisse (fondamentalmente solo l'actionlistener).

    Per quanto riguarda la certificazione dell'applet, ti avevo già dato un accenno di risposta in qualche intervento più su; lo metto con parole diverse qui: un applet non scrive una beata fava da nessuna parte, salvo dargli i permessi di farlo (certificato/firma digitale).
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.