Skip to content

CV builder all source codes

Terminology Explained

GridBagConstraints-āĻāϰ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻĒā§āϰ⧋āĻĒāĻžāĻ°ā§āϟāĻŋāϗ⧁āϞ⧋āϰ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āϰ⧂āĻĒ āύāĻŋāĻšā§‡ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāϞ⧋:

  • gridx & gridy: āωāĻĒāĻžāĻĻāĻžāύāϟāĻŋ āĻ—ā§āϰāĻŋāĻĄā§‡āϰ āĻ•āϤ āύāĻŽā§āĻŦāϰ āĻ•āϞāĻžāĻŽ āĻ“ āϰ⧋-āϤ⧇ āĻŦāϏāĻŦ⧇āĨ¤
  • gridwidth & gridheight: āωāĻĒāĻžāĻĻāĻžāύāϟāĻŋ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻŦāĻž āωāĻĒāϰ-āύāĻŋāĻšā§‡ āĻ•ā§ŸāϟāĻŋ āϘāϰ āĻœā§ā§œā§‡ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤
  • weightx & weighty: āĻ¸ā§āĻ•ā§āϰāĻŋāύ āĻŦ⧜ āĻ•āϰāϞ⧇ āωāĻĒāĻžāĻĻāĻžāύāϟāĻŋ āĻ•āϞāĻžāĻŽ āĻŦāĻž āϰ⧋ āĻŦāϰāĻžāĻŦāϰ āĻ•āϤāϟāĻž āϜāĻžā§ŸāĻ—āĻž āĻŦāĻžā§œāĻŋā§Ÿā§‡ āύ⧇āĻŦ⧇āĨ¤
  • fill: āωāĻĒāĻžāĻĻāĻžāύāϟāĻŋ āύāĻŋāĻœā§‡āϰ āϘāϰ⧇āϰ āϭ⧇āϤāϰ⧇āϰ āĻĢāĻžāρāĻ•āĻž āϜāĻžā§ŸāĻ—āĻž āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ­āϰāĻžāϟ (Horizontal/Vertical/Both) āĻ•āϰāĻŦ⧇āĨ¤
  • anchor: āωāĻĒāĻžāĻĻāĻžāύāϟāĻŋ āύāĻŋāĻœā§‡āϰ āϘāϰ⧇āϰ āϭ⧇āϤāϰ āϕ⧋āύ āĻĻāĻŋāϕ⧇ āĻšā§‡āĻĒ⧇ āĻĨāĻžāĻ•āĻŦ⧇ (āϝ⧇āĻŽāύ: CENTER, NORTH, WEST)āĨ¤
  • insets: āωāĻĒāĻžāĻĻāĻžāύāϟāĻŋāϰ āϚāĻžāϰāĻĒāĻžāĻļ⧇āϰ āĻŦāĻžāχāϰ⧇āϰ āĻĢāĻžāρāĻ•āĻž āϜāĻžā§ŸāĻ—āĻž (Padding/Margin)āĨ¤
  • ipadx & ipady: āωāĻĒāĻžāĻĻāĻžāύāϟāĻŋāϰ āϭ⧇āϤāϰ⧇āϰ āύāĻŋāϜāĻ¸ā§āĻŦ Internal Padding āĻŦāĻž āφāĻ•āĻžāϰ āĻŦāĻžā§œāĻžāύ⧋āĨ¤
Professional Summary Pane

āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻļā§āύāϟāĻž āĻ•āĻŋāĻ¨ā§āϤ⧁ āϖ⧁āĻŦāχ āϞāϜāĻŋāĻ•ā§āϝāĻžāϞ! 💡 āφāĻĒāύāĻžāϰ āĻŽāύ⧇ āĻšāϤ⧇āχ āĻĒāĻžāϰ⧇ āϝ⧇ āχāύāĻĒ⧁āϟ āĻĢāĻŋāĻ˛ā§āĻĄ āϤ⧋ txtSummary, āϤāĻžāĻšāϞ⧇ āĻŽāĻžāĻāĻ–āĻžāύ⧇ āφāĻŦāĻžāϰ āĻ¸ā§āĻ•ā§āϰāϞ āĻĒā§āϝāĻžāύāϕ⧇ āϟāĻžāύāĻžāϰ āϕ⧀ āĻĻāϰāĻ•āĻžāϰ?

āϜāĻžāĻ­āĻž āϏ⧁āχāĻ‚ (Java Swing)-āĻ JTextArea āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āϏāĻŽā§Ÿ āĻāĻ•āϟāĻž āϚāĻŽā§ŽāĻ•āĻžāϰ āĻŽā§‡āĻ•āĻžāύāĻŋāϜāĻŽ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ 📜

āφāĻŽāϰāĻž āϝāĻĻāĻŋ āϏāϰāĻžāϏāϰāĻŋ txtSummary-āϕ⧇ āĻĒā§āϝāĻžāύ⧇āϞ⧇ āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŋ, āϤāĻžāĻšāϞ⧇ āχāωāϜāĻžāϰ āϝāĻ–āύ ā§Ē āϞāĻžāχāύ⧇āϰ āĻŦ⧇āĻļāĻŋ āĻŦ⧜ āϕ⧋āύ⧋ āϏāĻžāĻŽāĻžāϰāĻŋ āϟāĻžāχāĻĒ āĻ•āϰāĻŦ⧇, āϤāĻ–āύ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϞ⧇āĻ–āĻžāϗ⧁āϞ⧋ āĻŦāĻ•ā§āϏ⧇āϰ āύāĻŋāĻšā§‡ āĻĸāĻžāĻ•āĻž āĻĒā§œā§‡ āϝāĻžāĻŦ⧇āĨ¤ āχāωāϜāĻžāϰ āϚāĻžāχāϞ⧇āĻ“ āĻŽāĻžāωāϏ āĻĻāĻŋā§Ÿā§‡ āĻ¸ā§āĻ•ā§āϰāϞ āĻ•āϰ⧇ āĻ“āĻĒāϰ-āύāĻŋāĻšā§‡āϰ āϞ⧇āĻ–āĻž āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰāĻŦ⧇ āύāĻžāĨ¤

āĻāĻ–āĻžāύ⧇āχ āĻ•āĻžāĻœā§‡ āφāϏ⧇ JScrollPane (āφāĻŽāĻžāĻĻ⧇āϰ summaryScroll):

  • đŸ“Ļ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āϧāĻžāϰāĻ• āĻŦāĻž āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ āϝāĻž āĻĢāĻŋāĻ˛ā§āĻĄāϟāĻŋāϕ⧇ āύāĻŋāĻœā§‡āϰ āĻĒ⧇āĻŸā§‡ āϧāϰ⧇ āϰāĻžāϖ⧇āĨ¤
  • â†•ī¸ āϝāĻ–āύāχ āϞ⧇āĻ–āĻž āύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āϏāĻžāχāĻœā§‡āϰ āĻšā§‡ā§Ÿā§‡ āĻŦ⧜ āĻšā§Ÿā§‡ āϝāĻžā§Ÿ, āĻāϟāĻŋ āĻ…āĻŸā§‹āĻŽā§‡āϟāĻŋāĻ• āĻĒāĻžāĻļ⧇ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻ•ā§āϰāϞāĻŦāĻžāϰ āύāĻŋā§Ÿā§‡ āφāϏ⧇, āϝāĻž āĻĒ⧁āϰ⧋ āϏāĻŋāĻ­āĻŋāϰ āϞ⧇āφāωāϟāϕ⧇ āύāĻˇā§āϟ āĻšāϤ⧇ āĻĻā§‡ā§Ÿ āύāĻžāĨ¤

āϤāĻžāχ āϏ⧁āχāĻ‚-āĻāϰ āύāĻŋ⧟āĻŽ āĻšāϞ⧋, āĻŦ⧜ āĻŸā§‡āĻ•ā§āϏāϟ āĻāϰāĻŋ⧟āĻž āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϤāĻžāϕ⧇ āĻ¸ā§āĻ•ā§āϰāϞ āĻĒā§āϝāĻžāύ⧇āϰ āϭ⧇āϤāϰ āĻĸ⧁āĻ•āĻŋā§Ÿā§‡ āĻĻāĻŋāϤ⧇ āĻšā§Ÿ, āφāϰ āĻĒā§āϝāĻžāύ⧇āϞ⧇ āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻšā§Ÿ āϏ⧇āχ āĻ¸ā§āĻ•ā§āϰāϞ āĻĒā§āϝāĻžāύāϟāĻŋāϕ⧇āĨ¤

01 Intro and Setup

02 Write and Fix pom.xml file

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>ResumeBuilder</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.15.2</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.3</version>
        </dependency>
    </dependencies>
</project>

03 Creating JFrame and Title

import javax.swing.JFrame;

public class ResumeBuilder {
    public static void main(String[] args) {
        JFrame window = new JFrame("My Resume Builder");
        window.setSize(800, 600); // āωāχāĻ¨ā§āĻĄā§‹āϰ āϏāĻžāχāϜ (āϚāĻ“ā§œāĻž āĻ“ āϞāĻŽā§āĻŦāĻž)
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // āĻŦāĻ¨ā§āϧ āĻ•āϰāϞ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻĨāĻžāĻŽāĻŦ⧇
        window.setVisible(true); // āωāχāĻ¨ā§āĻĄā§‹āϟāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāύ⧇ āĻĻ⧇āĻ–āĻžāĻŦ⧇
    }
}

04 Splitting Panels

package org.example;

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

public class ResumeBuilderUI {
    public static void main(String[] args) {
        JFrame window = new JFrame("MY CV Builder");
        window.setSize(800, 500);

        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JSplitPane splitPane  = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        splitPane.setDividerLocation(400);

        // left panel
        JPanel leftPanel = new JPanel();
        leftPanel.setBackground(Color.LIGHT_GRAY);


        // right panel
        JPanel rightPanel = new JPanel();
        rightPanel.setBackground(Color.WHITE);

        splitPane.setLeftComponent(leftPanel);
        splitPane.setRightComponent(rightPanel);

//        leftPanel | rightPanel

        window.add(splitPane);
        window.setVisible(true);


    }
}

05 Adding Simple Form fields

package org.example;

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

public class ResumeBuilderUI {
    public static void main(String[] args) {
        JFrame window = new JFrame("MY CV Builder");
        window.setSize(800, 500);

        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JSplitPane splitPane  = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        splitPane.setDividerLocation(400);

        // left panel
        JPanel leftPanel = new JPanel(new GridLayout(5, 2, 10, 10)); // row, cols, hgap, vgap
        leftPanel.setBackground(Color.LIGHT_GRAY);

        // FORM
        // Name field
        JLabel lblName = new JLabel("Full Name");
        JTextField txtName = new JTextField();
        leftPanel.add(lblName);
        leftPanel.add(txtName);

        // Email field
        JLabel lblEmail = new JLabel("Full Email");
        JTextField txtEmail = new JTextField();
        leftPanel.add(lblEmail);
        leftPanel.add(txtEmail);

        // Phone field
        JLabel lblPhone = new JLabel("Full Phone");
        JTextField txtPhone = new JTextField();
        leftPanel.add(lblPhone);
        leftPanel.add(txtPhone);

        // Skills field
        JLabel lblSkills = new JLabel("Full Skills");
        JTextField txtSkills = new JTextField();
        leftPanel.add(lblSkills);
        leftPanel.add(txtSkills);




        // right panel
        JPanel rightPanel = new JPanel();
        rightPanel.setBackground(Color.WHITE);

        splitPane.setLeftComponent(leftPanel);
        splitPane.setRightComponent(rightPanel);

//        leftPanel | rightPanel



        window.add(splitPane);
        window.setVisible(true);


    }
}

06 Adding Live Preview

package org.example;

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

public class ResumeBuilderUI {
    public static void main(String[] args) {
        JFrame window = new JFrame("MY CV Builder");
        window.setSize(800, 500);

        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JSplitPane splitPane  = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        splitPane.setDividerLocation(400);

        // left panel
        JPanel leftPanel = new JPanel(new GridLayout(5, 2, 10, 10)); // row, cols, hgap, vgap
        leftPanel.setBackground(Color.LIGHT_GRAY);

        // FORM
        // Name field
        JLabel lblName = new JLabel("Full Name");
        JTextField txtName = new JTextField();
        leftPanel.add(lblName);
        leftPanel.add(txtName);

        // Email field
        JLabel lblEmail = new JLabel("Full Email");
        JTextField txtEmail = new JTextField();
        leftPanel.add(lblEmail);
        leftPanel.add(txtEmail);

        // Phone field
        JLabel lblPhone = new JLabel("Full Phone");
        JTextField txtPhone = new JTextField();
        leftPanel.add(lblPhone);
        leftPanel.add(txtPhone);

        // Skills field
        JLabel lblSkills = new JLabel("Full Skills");
        JTextField txtSkills = new JTextField();
        leftPanel.add(lblSkills);
        leftPanel.add(txtSkills);

        // for preview
        JTextArea txtPreview = new JTextArea();
        txtPreview.setEditable(false);



        // right panel
        JPanel rightPanel = new JPanel();
        rightPanel.setBackground(Color.WHITE);
        rightPanel.setLayout(new BorderLayout());
        rightPanel.add(txtPreview);

        // scrolling option for right preview panel
        JScrollPane previewScroll = new JScrollPane(txtPreview);
        rightPanel.add(previewScroll);


        splitPane.setLeftComponent(leftPanel);
        splitPane.setRightComponent(rightPanel);

//        leftPanel | rightPanel

        addLiveTracking(txtName.getDocument(), ()-> updatePreview(txtName, txtEmail, txtPhone, txtSkills, txtPreview) );
        addLiveTracking(txtEmail.getDocument(), ()-> updatePreview(txtName, txtEmail, txtPhone, txtSkills, txtPreview) );
        addLiveTracking(txtPhone.getDocument(), ()-> updatePreview(txtName, txtEmail, txtPhone, txtSkills, txtPreview) );
        addLiveTracking(txtSkills.getDocument(), ()-> updatePreview(txtName, txtEmail, txtPhone, txtSkills, txtPreview) );

        window.add(splitPane);
        window.setVisible(true);


    }

    private static void updatePreview (JTextField name, JTextField email, JTextField phone, JTextField skills, JTextArea preview) {
        String text = " RESUME PREVIEW " + "\n" +
                "Name: " + name.getText() + "\n" +
                "Email: " + email.getText() + "\n" +
                "Name: " + phone.getText() + "\n" +
                "Email: " + skills.getText();
        preview.setText(text);
    }
    private static void addLiveTracking (javax.swing.text.Document doc, Runnable action ){
        doc.addDocumentListener(new javax.swing.event.DocumentListener() {
            public void  insertUpdate (javax.swing.event.DocumentEvent event){ action.run(); };
            public void removeUpdate (javax.swing.event.DocumentEvent event){action.run();};
            public void  changedUpdate (javax.swing.event.DocumentEvent event){action.run();};
        });
    }
}

07 Save ResumeData as JSON

ResumeData āĻāϰ code:

package org.example;

public class ResumeData {
    private String name;
    private String email;
    private String phone;
    private String skills;

    public ResumeData() {
    }

    public ResumeData(String name, String email, String phone, String skills) {
        this.name = name;
        this.email = email;
        this.phone = phone;
        this.skills = skills;
    }

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getSkills() {
        return skills;
    }

    public void setSkills(String skills) {
        this.skills = skills;
    }
}

ResumeBuilderUI āĻāϰ code:

package org.example;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.swing.*;
import java.awt.*;
import java.io.File;

public class ResumeBuilderUI {
    public static void main(String[] args) {

        // same code 


    }

    private static void updatePreview(JTextField name, JTextField email, JTextField phone, JTextField skills, JTextArea preview) {
        String text = " RESUME PREVIEW " + "\n" +
                "Name: " + name.getText() + "\n" +
                "Email: " + email.getText() + "\n" +
                "Name: " + phone.getText() + "\n" +
                "Email: " + skills.getText();
        preview.setText(text);
        saveToJson(name.getText(), email.getText(), phone.getText(), skills.getText());
    }

    private static void addLiveTracking(javax.swing.text.Document doc, Runnable action) {
        // same code 
    }

    private static void saveToJson(String name, String email, String phone, String skills){
        try {
            ResumeData data = new ResumeData(name, email, phone, skills);

            ObjectMapper mapper = new ObjectMapper();

            mapper.writeValue(new File("Resume_backup.json"), data);
        }
        catch (Exception e){
            e.printStackTrace(); // console a print korbe

        }
    }
}


08 Export to PDF Functionality

09 Start Moderning UI and PDF - Part 1

02 Write and Fix pom.xml file