PrintScreen图像捕获

时间:2015-04-14 07:46:27

标签: java awt actionlistener printscreen

我需要编写一个程序,我将创建一个可运行的jar并分发。功能应如下所示:

双击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)
{

}   

}
}

第一个try catch块可以打开一个窗口,采用图像格式,前缀和存储位置。单独的第二个尝试捕获块可以在运行时进行屏幕截图,而不是在按下打印屏幕键时但是第一次尝试捕获它不会打印任何内容。那么,在按下printscreen键时如何处理屏幕截图呢?

1 个答案:

答案 0 :(得分:1)

我已经用另一种方式解决了这个问题。 由于人们总是在在线会议上使用鼠标,我从键盘上删除了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创建可安装的版本?