2015-04-14 158 views
-1

我需要編寫一個程序,我將創建一個可運行的jar並分發。功能應該如下:PrintScreen圖像捕捉

當雙擊該jar時,它會打開一個窗口。 它會詢問保存圖像文件的路徑。 然後它會詢問是否在每個圖像上添加任何前綴/後綴/兩者以及唯一名稱的時間戳。它也會詢問使用什麼圖像格式。 該應用程序可以最小化,並關閉 它會採取一個完整的屏幕截圖,每當PrintScreen按下並保存。 請提供完整的程序。我收集了一些片段,但不能把它們放在一起。這裏是我的代碼: -

import java.awt.*; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.event.*; 
import java.awt.image.RenderedImage; 
import java.io.File; 
import java.util.Date; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

public class MainClass 
{ 
static String location = ""; 
static String prefix = ""; 
static String format = ""; 
static Date timestamp = new Date(); 

public static void main(String args[]) 
{ 
    try 
    { 
     UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
JFrame f = new JFrame("Text Field Examples"); 
f.getContentPane().setLayout(new FlowLayout()); 

final JTextField textField1 = new JTextField("Enter Location To Save Image Files"); 
textField1.addMouseListener(new MouseAdapter(){ 
    @Override 
    public void mouseClicked(MouseEvent e){ 
     textField1.setText(""); 
    } 
}); 
textField1.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     location = textField1.getText(); 
     System.out.println(location); 
    } 
}); 
f.getContentPane().add(textField1); 

final JTextField textField2 = new JTextField("Enter Prefix or Leave Empty"); 
textField2.addMouseListener(new MouseAdapter(){ 
    @Override 
    public void mouseClicked(MouseEvent e){ 
     textField2.setText(""); 
    } 
}); 
textField2.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     prefix = textField2.getText(); 
     System.out.println(prefix); 
    } 
}); 
f.getContentPane().add(textField2); 

String jlistData[] = 
    { 
     "GIF", 
     "PNG", 
     "JPG" 
    }; 
final JComboBox jlist = new JComboBox<String>(jlistData); 
jlist.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     format = jlist.getSelectedItem().toString(); 
     System.out.println(format); 

    } 
}); 
f.getContentPane().add(jlist); 

f.pack(); 
f.setVisible(true); 
} 
catch (Exception evt) 
{ 
    evt.printStackTrace(); 
} 



try 
{ 
    Robot robot = new Robot(); 

    robot.keyPress(KeyEvent.VK_PRINTSCREEN); 
    robot.keyRelease(KeyEvent.VK_PRINTSCREEN); 


    Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); 
    RenderedImage image = (RenderedImage) t.getTransferData(DataFlavor.imageFlavor); 

    ImageIO.write(image, format, new File(new String(location+prefix+image+timestamp))); 
} 
catch(Exception e) 
{ 

} 

} 
} 

第一次嘗試catch塊可以打開一個窗口,採取圖像格式,前綴和存儲位置。單獨的第二個try catch塊可以在不按下printscreen鍵時運行時執行屏幕截圖,但第一次嘗試捕獲它時不會打印任何內容。那麼,按下printscreen鍵時怎麼做截圖呢?

+0

你有這個問題是不可能從Java內部在全局級別捕獲關鍵事件,而不使用JNI/JNA集成 – MadProgrammer

+0

類似[this](http://stackoverflow.com/questions/3078646/jna-keyboard -hook-in-windows) – MadProgrammer

+0

@MadProgrammer當你想要的全部屏幕截圖時,你是否需要這樣做(而不是*必須放置光標的*窗口*鏡頭)? – laune

回答

0

我已經用另一種方式接近了解決方案。 由於人們在線會議時總是使用鼠標工作,因此我從鍵盤上刪除了PrintScreen按鈕的子句,相反,與會者可以單擊擺動窗口按鈕來捕獲屏幕。

我的解決方案如下:

MainClass.java

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MainClass{ 
static String location = ""; 
static String prefix = ""; 
static String format = ""; 

public static void main(String args[]) 
{ 
    try 
    { 
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
    final JFrame f = new JFrame("ENTER ALL DETAILS BELOW"); 
    f.setAlwaysOnTop(true); 
    f.getContentPane().setLayout(new FlowLayout()); 

    final JTextField textField1 = new JTextField("Enter Location To Save Image Files"); 
    textField1.addMouseListener(new MouseAdapter(){ 
     @Override 
     public void mouseClicked(MouseEvent e){ 
      textField1.setText(""); 
     } 
    }); 
    f.getContentPane().add(textField1); 

    final JTextField textField2 = new JTextField("Enter MeetingID"); 
    textField2.addMouseListener(new MouseAdapter(){ 
     @Override 
     public void mouseClicked(MouseEvent e){ 
      textField2.setText(""); 
     } 
    }); 
    f.getContentPane().add(textField2); 

    String jlistData[] = 
     { 
      "GIF", 
      "PNG", 
      "JPG" 
     }; 
    final JComboBox jlist = new JComboBox<String>(jlistData); 
    f.getContentPane().add(jlist); 

    final JButton jButton = new JButton("OKAY"); 
    jButton.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      location = textField1.getText(); 
      prefix = textField2.getText(); 
      format = jlist.getSelectedItem().toString(); 
      System.out.println(location); 
      System.out.println(prefix); 
      System.out.println(format); 
      f.setVisible(false); 
      PrintButton.printButton(); 
     } 
    }); 
    f.getContentPane().add(jButton); 

    f.pack(); 
    f.setVisible(true); 
    } 
    catch (Exception evt) 
    { 
     evt.printStackTrace(); 
    } 
} 
} 

PrintButton.java

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.UIManager; 


public class PrintButton 
{ 
    static void printButton() 
    { 
     try 
    { 
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
    //final JFrame f = new JFrame("Print Screen App"); 
    Dlg f = new Dlg(new JFrame(), "PRINT"); 
    f.setAlwaysOnTop(true); 
    f.getContentPane().setLayout(new FlowLayout()); 

    final JButton jButton = new JButton("OKAY"); 
    jButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      PrintScreen.printScreen(); 
     } 
    }); 
    f.getContentPane().add(jButton); 

    f.pack(); 
    f.setVisible(true); 
    } 
    catch (Exception evt) 
    { 
     evt.printStackTrace(); 
    } 
} 
} 

class Dlg extends JDialog { 
    public Dlg(JFrame frame, String str) { 
    super(frame, str); 
    addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent evt) { 
      System.exit(0); 
     } 
    }); 
} 
} 

PrintScreen.java

import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.event.KeyEvent; 
import java.awt.image.RenderedImage; 
import java.io.File; 

import javax.imageio.ImageIO; 


public class PrintScreen 
{ 
static void printScreen() 
{ 
    try 
    { 
     Robot robot = new Robot(); 

     robot.keyPress(KeyEvent.VK_PRINTSCREEN); 
     robot.keyRelease(KeyEvent.VK_PRINTSCREEN); 

     Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); 
     RenderedImage image = (RenderedImage) t.getTransferData(DataFlavor.imageFlavor); 

     ImageIO.write(image, MainClass.format, new File(new String(MainClass.location+ "\\" +MainClass.prefix+"_"+System.currentTimeMillis()+"."+MainClass.format))); 
    } 
    catch(Exception e) 
    { 

    } 
} 
} 

我希望這將是有益的,以一些朋友。有沒有什麼可以改進的地方?

如何爲Windows和Linux/Ubuntu和Linux/RedHat創建可安裝版本?