Java 打印屏幕图像捕获

Java 打印屏幕图像捕获,java,awt,actionlistener,printscreen,Java,Awt,Actionlistener,Printscreen,我需要编写一个程序,我将创建一个可运行的jar并分发。功能应如下所示: 当双击jar时,它将打开一个窗口。 它将询问保存图像文件的路径。 然后,它将询问是否在每个图像上添加任何前缀/后缀/两者,以及唯一名称的时间戳。 它还将询问要使用的图像格式。 应用程序可以最小化并关闭 每当按下PrintScreen并保存时,都会出现完整的屏幕截图。 请提供完整的计划。我收集了一些碎片,但不能把它们放在一个里面。这是我的密码:- import java.awt.*; import java.awt.datat

我需要编写一个程序,我将创建一个可运行的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)
{

}   

}
}
import java.awt.*;
导入java.awt.datatransfer.DataFlavor;
导入java.awt.datatransfer.transfer;
导入java.awt.event.*;
导入java.awt.image.renderImage;
导入java.io.File;
导入java.util.Date;
导入javax.imageio.imageio;
导入javax.swing.*;
公共类主类
{
静态字符串位置=”;
静态字符串前缀=”;
静态字符串格式=”;
静态日期时间戳=新日期();
公共静态void main(字符串参数[])
{
尝试
{
UIManager.setLookAndFeel(“com.sun.java.swing.plaf.windows.WindowsLookAndFeel”);
JFrame f=新的JFrame(“文本字段示例”);
f、 getContentPane().setLayout(新的FlowLayout());
final JTextField textField1=新的JTextField(“输入保存图像文件的位置”);
textField1.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
textField1.setText(“”);
}
});
textField1.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
location=textField1.getText();
系统输出打印项次(位置);
}
});
f、 getContentPane().add(textField1);
final JTextField textField2=新的JTextField(“输入前缀或留空”);
textField2.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
textField2.setText(“”);
}
});
textField2.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
prefix=textField2.getText();
System.out.println(前缀);
}
});
f、 getContentPane().add(textField2);
字符串jlistData[]=
{
“GIF”,
“巴布亚新几内亚”,
“JPG”
};
最终jcombox jlist=新jcombox(jlistData);
jlist.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
format=jlist.getSelectedItem().toString();
System.out.println(格式);
}
});
f、 getContentPane().add(jlist);
f、 包装();
f、 setVisible(真);
} 
捕获(异常evt)
{
evt.printStackTrace();
}
尝试
{
机器人=新机器人();
robot.keyPress(KeyEvent.VK_PRINTSCREEN);
robot.keyRelease(KeyEvent.VK_打印屏幕);
t=Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
RenderImage=(RenderImage)t.getTransferData(DataFlavor.imageFlavor);
write(图像、格式、新文件(新字符串(位置+前缀+图像+时间戳));
}
捕获(例外e)
{
}   
}
}

第一个try-catch块可以打开一个窗口,获取图像格式、前缀和存储位置。第二个try-catch块单独可以在运行时拍摄屏幕快照,而不是在按下printscreen键时,但在第一个try-catch中,它不会打印任何内容。那么,当按下printscreen键时,如何拍摄屏幕截图呢?

我已经用另一种方式处理了这个问题。 由于人们在在线会议上总是使用鼠标,我从键盘上删除了PrintScreen按钮的条款,与会者可以单击swing窗口按钮来捕获屏幕

我的解决办法如下:

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();
    }
}
}
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创建一个可安装的版本?

您遇到的问题是,如果不借助JNI/JNA集成,就不可能从Java中捕获全局级别的关键事件,比如@MadProgrammer,当您只需要全屏拍摄时,您需要这样做吗(与必须放置光标的窗口截图相反)?如果您想在应用程序没有键盘焦点的情况下检测何时按下打印屏幕按钮,那么是的,这是唯一的解决方案“请提供一个完整的程序”。请问一个问题。这不是编码服务。
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)
    {

    }
}
}