最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Java實(shí)現(xiàn)簽字功能的示例代碼

 更新時(shí)間:2024年02月23日 11:32:49   作者:super.aladdin  
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)簽字功能,同時(shí)支持將簽字圖像保存為PNG格式和將簽字添加到PDF文檔中,感興趣的可以了解下

實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的簽字功能,同時(shí)支持將簽字圖像保存為PNG格式和將簽字添加到PDF文檔中。在點(diǎn)擊“簽字”按鈕后,會(huì)彈出一個(gè)窗口,用戶可以在其中繪制簽名,繪制完成后可選擇保存為PNG圖片或?qū)⒑灻砑拥街付ǖ腜DF文檔中。

完整代碼

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
public class SignatureDemo {
    public static void main(String[] args) {
        SignatureFrame frame = new SignatureFrame();
        frame.setVisible(true);
    }
}
class SignatureFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    private JPanel contentPanel;
    public SignatureFrame() {
        setTitle("簽字");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        contentPanel = new JPanel();
        setContentPane(contentPanel);
        // 添加按鈕,用于觸發(fā)簽名事件
        JButton button = new JButton("簽字");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 顯示簽名面板
                SignaturePanel panel = new SignaturePanel();
                int result = JOptionPane.showConfirmDialog(contentPanel, panel, "簽字", JOptionPane.OK_CANCEL_OPTION);
                if (result == JOptionPane.OK_OPTION) {
                    // 獲取簽名圖像并保存到本地
                    saveSignatureImage(panel.getSignatureImage());
                }
            }
        });
        contentPanel.add(button);
    }
    /**
     * 保存簽名圖像到本地
     */
    private void saveSignatureImage(BufferedImage image) {
        // 打開文件選擇器
        JFileChooser fileChooser = new JFileChooser();
        int result = fileChooser.showSaveDialog(contentPanel);
        if (result == JFileChooser.APPROVE_OPTION) {
            // 獲取用戶選擇的文件路徑
            File file = fileChooser.getSelectedFile();
            // 將圖像保存為PNG格式
            try (OutputStream out = new FileOutputStream(file)) {
                ImageIO.write(image, "PNG", out);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
class SignaturePanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private BufferedImage signatureImage;
    public SignaturePanel() {
        setPreferredSize(new Dimension(400, 300));
        setBackground(Color.WHITE);
        setBorder(BorderFactory.createLineBorder(Color.BLACK));
        // 添加鼠標(biāo)監(jiān)聽器,用于繪制簽名
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                // 創(chuàng)建新的圖像,用于繪制簽名
                signatureImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
                Graphics2D g = signatureImage.createGraphics();
                g.setColor(Color.BLACK);
                g.setStroke(new BasicStroke(2));
                g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
                g.dispose();
                repaint();
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                // 繪制簽名
                Graphics2D g = signatureImage.createGraphics();
                g.setColor(Color.BLACK);
                g.setStroke(new BasicStroke(2));
                g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
                g.dispose();
                repaint();
            }
        });
    }
    public BufferedImage getSignatureImage() {
        return signatureImage;
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (signatureImage != null) {
            g.drawImage(signatureImage, 0, 0, null);
        }
    }
}
class PDFUtils {
    /**
     * 在PDF文檔中添加簽名
     */
    public static void addSignatureToPDF(File pdfFile, BufferedImage signatureImage) throws IOException, DocumentException {
        Rectangle pageSize = new Rectangle(PageSize.A4);
        Document document = new Document(pageSize);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFile.getAbsolutePath() + ".signed.pdf"));
        document.open();
        PdfContentByte canvas = writer.getDirectContent();
        // 將簽名圖像添加到PDF文檔中
        Image image = Image.getInstance(signatureImage, null);
        image.scaleToFit(100, 50);
        float x = (document.right() - image.getScaledWidth()) / 2;
        float y = (document.top() - image.getScaledHeight()) / 2;
        canvas.addImage(image, image.getScaledWidth(), 0, 0, image.getScaledHeight(), x, y);
        document.close();
        writer.close();
    }
}

方法補(bǔ)充

除了上文的方法,我們還可以使用JavaFX或者Swing來實(shí)現(xiàn)簽字功能,下面是實(shí)現(xiàn)方法,希望對(duì)大家有所幫助

JavaFX中可以通過使用Canvas實(shí)現(xiàn)簽字功能。

步驟如下:

1. 創(chuàng)建一個(gè)JavaFX應(yīng)用程序。

2. 創(chuàng)建一個(gè)Canvas對(duì)象。

3. 重寫鼠標(biāo)事件的方法。

4. 在鼠標(biāo)移動(dòng)時(shí),通過Canvas的GraphicsContext對(duì)象繪制線條。

代碼示例:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception{
        // 創(chuàng)建畫布
        Canvas canvas = new Canvas(500, 500);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        // 設(shè)置畫筆的屬性
        gc.setLineWidth(2);
        gc.setStroke(Color.BLACK);
        // 重寫鼠標(biāo)事件的方法
        canvas.setOnMouseDragged(e -> {
            double x = e.getX();
            double y = e.getY();
            gc.lineTo(x, y); // 繪制線條
            gc.stroke(); // 描邊
        });
        // 創(chuàng)建主場(chǎng)景
        Scene scene = new Scene(new Group(canvas), 500, 500);
        // 顯示窗口
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

Swing中可以通過使用JPanel實(shí)現(xiàn)簽字功能。

步驟如下:

1. 創(chuàng)建一個(gè)JFrame窗口。

2. 創(chuàng)建一個(gè)JPanel對(duì)象。

3. 重寫鼠標(biāo)事件的方法。

4. 在鼠標(biāo)移動(dòng)時(shí),通過JPanel的Graphics對(duì)象繪制線條。

代碼示例:

public class Main extends JFrame {
    public Main() {
        // 創(chuàng)建面板
        JPanel panel = new JPanel();
        // 設(shè)置面板的大小和背景色
        panel.setPreferredSize(new Dimension(500, 500));
        panel.setBackground(Color.WHITE);
        // 重寫鼠標(biāo)事件的方法
        panel.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                Graphics g = panel.getGraphics();
                // 設(shè)置畫筆的屬性
                ((Graphics2D)g).setStroke(new BasicStroke(2));
                g.setColor(Color.BLACK);
                // 繪制線條
                g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
            }
        });
        // 添加面板到窗口中
        getContentPane().add(panel);
        // 設(shè)置窗口的屬性
        setTitle("簽字功能");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
    }
    public static void main(String[] args) {
        new Main();
    }
}

到此這篇關(guān)于使用Java實(shí)現(xiàn)簽字功能的示例代碼的文章就介紹到這了,更多相關(guān)Java簽字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot如何使用slf4j日志及其項(xiàng)目配置、MVC支持

    SpringBoot如何使用slf4j日志及其項(xiàng)目配置、MVC支持

    這篇文章主要介紹了SpringBoot如何使用slf4j日志及其項(xiàng)目配置、MVC支持,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring boot中Jackson的操作指南

    Spring boot中Jackson的操作指南

    這篇文章主要給大家介紹了關(guān)于Spring boot中Jackson操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 淺談Java中復(fù)制數(shù)組的方式

    淺談Java中復(fù)制數(shù)組的方式

    這篇文章主要介紹了Java中復(fù)制數(shù)組的幾種方法,需要的朋友可以參考下。
    2017-08-08
  • springboot配置開發(fā)和測(cè)試環(huán)境并添加啟動(dòng)路徑方式

    springboot配置開發(fā)和測(cè)試環(huán)境并添加啟動(dòng)路徑方式

    這篇文章主要介紹了springboot配置開發(fā)和測(cè)試環(huán)境并添加啟動(dòng)路徑方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中Synchronized鎖的使用和原理詳解

    Java中Synchronized鎖的使用和原理詳解

    這篇文章主要介紹了Java中Synchronized鎖的使用和原理詳解,synchronized是?Java?內(nèi)置的關(guān)鍵字,它提供了一種獨(dú)占的加鎖方式,synchronized的獲取和釋放鎖由JVM實(shí)現(xiàn),用戶不需要顯示的釋放鎖,非常方便,需要的朋友可以參考下
    2023-07-07
  • IDEA中右側(cè)沒有顯示Maven問題及解決

    IDEA中右側(cè)沒有顯示Maven問題及解決

    解決IDEA中Maven工具窗口不顯示的問題,包括手動(dòng)重新加載Maven項(xiàng)目、啟用Maven插件、手動(dòng)加載Maven項(xiàng)目、重置IDEA配置和檢查IDEA版本和Maven配置
    2026-02-02
  • SpringBoot Entity中枚舉類型詳細(xì)使用介紹

    SpringBoot Entity中枚舉類型詳細(xì)使用介紹

    本文介紹SpringBoot如何在Entity(DAO)中使用枚舉類型。(本文使用MyBatis-Plus)。在實(shí)際開發(fā)中,經(jīng)常會(huì)遇到表示類型或者狀態(tài)的情況,比如:有三種支付方式:微信、支付寶、銀聯(lián)。本文介紹如何這種場(chǎng)景的方案對(duì)比,并用實(shí)例來介紹如何用枚舉這種最優(yōu)雅的來表示
    2022-10-10
  • Spring Boot集成MyBatis訪問數(shù)據(jù)庫的方法

    Spring Boot集成MyBatis訪問數(shù)據(jù)庫的方法

    這篇文章主要介紹了Spring Boot集成MyBatis訪問數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2017-04-04
  • Maven項(xiàng)目配置Tomcat的兩種方式

    Maven項(xiàng)目配置Tomcat的兩種方式

    本文主要介紹了Maven項(xiàng)目配置Tomcat的兩種方式,一種是用idea開發(fā),另一種是eclipse開發(fā),具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-05-05
  • Java 詳細(xì)講解線程安全與同步附實(shí)例與注釋

    Java 詳細(xì)講解線程安全與同步附實(shí)例與注釋

    線程安全是多線程編程時(shí)的計(jì)算機(jī)程序代碼中的一個(gè)概念。在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會(huì)通過同步機(jī)制保證各個(gè)線程都可以正常且正確的執(zhí)行,不會(huì)出現(xiàn)數(shù)據(jù)污染等意外情況
    2022-04-04

最新評(píng)論

芜湖市| 绿春县| 巩义市| 大关县| 津南区| 林口县| 扶绥县| 吴堡县| 图们市| 磐安县| 叙永县| 高州市| 丹棱县| 金沙县| 凭祥市| 晴隆县| 道孚县| 宝兴县| 罗田县| 肥城市| 无极县| 台中市| 治多县| 巴中市| 古田县| 伊通| 鹿泉市| 略阳县| 仁寿县| 汶上县| 左云县| 临泽县| 永川市| 岱山县| 丽江市| 通化市| 文昌市| 新平| 建瓯市| 白沙| 无锡市|