Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > скриншот апплетом


Автор: feda1984 8.11.2012, 10:13
Здравствуйте, писал несколько сообщений на этом форуме, по разным моментам на java решая одну задачу нужно сделать скрин окна пользователя, и вывести его. посоветовали решать аплетом используя java.awt.

но так как аплет получает доступ к файловой системе его нужно подписать: http://www.community.terrasoft.ua/blogs/5816(все подробно расписано)
и в самом конце статьи приведенной выше просят переделать код смысл переделки я к сожалению не понял если кто может объясните.
Код
import java.awt.image.BufferedImage;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO; 
import java.io.*; 
import java.applet.*; // импортируем классы для создания апплета
import java.awt.datatransfer.Clipboard;
import java.security.AccessController;
import java.security.PrivilegedAction;

  
   public class Life extends Applet {
   private static boolean newFile;    
      public void paint() throws IOException {
         
        
         try {
            Robot robot = new Robot(); 
              
            //было
            // Dimension clipboard  = Toolkit.getDefaultToolkit().getScreenSize();
            //BufferedImage screenShot = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));   
             //было
            
            
             //стало
            Dimension dim  = (Dimension) AccessController.doPrivileged(new PrivilegedAction() {
                public Object run() {
                                      return Toolkit.getDefaultToolkit().getScreenSize();
                                     }
             });

            BufferedImage screenShot = robot.createScreenCapture(
                                                               new Rectangle(
                                                                              dim  
                                                                             )); 
             //стало
            
            screenShot= screenShot.getSubimage(0, 0, 400, 400);
            File file = new File("c://temp//screenShot.jpg");
            //file = file.getSubimage( 0, 0, 100, 100);
            ImageIO.write(screenShot, "JPG", file); 
            System.out.println(file.exists()); // look for a real file
            newFile = file.createNewFile(); // maybe create a file!
            System.out.println(newFile); // already there?
            System.out.println(file.exists()); // look again 
        } catch (AWTException ex) {
            Logger.getLogger(Life.class.getName()).log(Level.SEVERE, null, ex);
        }
      }
   }


если запустить этот класс не в роли аплета и раскоментить "было", и закоментить "стало"  то скрин создается. 
класс подписан, появляется окно как в приведенной выше статье. подскажите как найти проблему(в java консоль ошибки не валяться) и может быть решение, спасибо. 

Автор: dorogoyIV 8.11.2012, 11:05
строка 41

Автор: feda1984 8.11.2012, 12:22
Цитата(dorogoyIV @ 8.11.2012,  11:05)
строка 41

а подробнее? на локальной машине и не через аплеты все работает, то есть скрин с экрана того компа где лежит класс я могу сделать и сохраняется все нормально. в плате того что со слешами все впорядке

Автор: k0rvin 8.11.2012, 13:08
1) Каталога "C:/temp/" может и не быть на машине пользователя.
2.1) Вообще это дурной тон, записывать пользовательские данные в системный каталог, нужно использовать какой-нибудь типа "%APPDATA%/YourCompanyName/YourProgramName/" или "%TEMP%/" или "%USERPROFILE%/Temp/";
2.2) Вполне возможно, что http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html, инкапсулирующий работу с окружением вообще и подобными каталогами вчастности, следует использовать его, т.к. у пользователя может оказаться Mac OSX например или Linux или еще что-нибудь.
3) Наверное не стоит вот так создавать файл (у тебя метод createNewFile вызывается независимо от того, существует файл или нет), если он уже существует:
Код

import java.io.File;
import java.io.IOException;

public class FileTest {

    private static File getFile(String filename) {
        String tmpDirPath = System.getProperty("java.io.tmpdir");
        String separator = System.getProperty("file.separator");
        File file = new File(tmpDirPath + separator + filename);
        if (file.exists()) {
            return file;
        }
        try {
            boolean fileCreated = file.createNewFile();
            if (fileCreated) {
                return file;
            } else {
                return null;
            }
        } catch (IOException e) {
            e.printStackTrace();  // TODO: implement exception handling
            return null;
        }
    }

    public static void main(String[] args) {
        File file = getFile("foo.txt");

        if (file == null) {
            // TODO: message user that program can not find/access file
            return;
        }
        System.out.println(file.getAbsolutePath());
    }
}


Думаю в этом дело.

P.S. В оракловской доке почему-то не указано, что есть свойство "java.io.tmpdir", http://www.kodejava.org/examples/94.html, статья за 2010-й год, может оно deprecated, не знаю.

P.P.S. http://stackoverflow.com/questions/1706982/find-user-independent-temp-directory-with-java про tmpdir.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)