gpt4 book ai didi

java - 打印屏幕图像捕获

转载 作者:行者123 更新时间:2023-12-02 04:46:24 24 4
gpt4 key购买 nike

我需要编写一个程序,我将创建一个可运行的 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 block 可以打开一个窗口,获取图像格式、前缀和存储位置。第二个 try catch block 单独可以在运行时拍摄屏幕截图,而不是按下 printscreen 键时,但使用第一个 try catch 时它不会打印任何内容。那么,按下printscreen键时如何截屏呢?

最佳答案

我用另一种方式解决了这个问题。由于人们在在线 session 时总是使用鼠标进行操作,因此我从键盘上删除了“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();
}
}
}

打印按钮.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)
{

}
}
}

希望对一些 friend 有帮助。这方面还有改进的余地吗?

如何创建适用于 Windows 和 Linux/Ubuntu 和 Linux/RedHat 的可安装版本?

关于java - 打印屏幕图像捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29621815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com