<!DOCTYPE html>
    <html lang="vi" xmlns="https://www.w3.org/1999/xhtml" prefix="og: https://ogp.me/ns#">
    <head>
<title>Gradle Java Desktop Application và SQLite</title>
<meta name="description" content="Gradle Java Desktop Application và SQLite - Savefile - Tin Tức -...">
<meta name="author" content="DATAONLINE.IO.VN">
<meta name="copyright" content="DATAONLINE.IO.VN [support@dataonline.io.vn]">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="Gradle Java Desktop Application và SQLite">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;365.io.vn&#x002F;savefile&#x002F;lap-trinh-huong-doi-tuong-oop&#x002F;gradle-java-desktop-application-va-sqlite-36.html">
<meta property="og:site_name" content="DATAONLINE.IO.VN">
<meta property="og:url" content="https://365.io.vn/savefile/lap-trinh-huong-doi-tuong-oop/gradle-java-desktop-application-va-sqlite-36.html">
<link rel="shortcut icon" href="https://365.io.vn/favicon.ico">
<link rel="canonical" href="https://365.io.vn/savefile/lap-trinh-huong-doi-tuong-oop/gradle-java-desktop-application-va-sqlite-36.html">
<link rel="alternate" href="https://365.io.vn/rss/" title="Tin Tức" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tong-hop/" title="Tin Tức - Tổng hợp" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/gdpt/" title="Tin Tức - GDPT" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/cac-van-ban/" title="Tin Tức - Các văn bản" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tieu-hoc/" title="Tin Tức - Tiểu học" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-3/" title="Tin Tức - Lớp 3" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-4/" title="Tin Tức - Lớp 4" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-5/" title="Tin Tức - Lớp 5" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/sgk-tieu-hoc/" title="Tin Tức - SGK Tiểu học" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-3/" title="Tin Tức - Tin học 3" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-4/" title="Tin Tức - Tin học 4" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-5/" title="Tin Tức - Tin học 5" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/thcs/" title="Tin Tức - THCS" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-6-75/" title="Tin Tức - Lớp 6" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-7-75/" title="Tin Tức - Lớp 7" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-8-75/" title="Tin Tức - Lớp 8" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-9-75/" title="Tin Tức - Lớp 9" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/sgk-thcs/" title="Tin Tức - SGK THCS" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-6/" title="Tin Tức - Tin học 6" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-7/" title="Tin Tức - Tin học 7" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-8/" title="Tin Tức - Tin học 8" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-9/" title="Tin Tức - Tin học 9" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/thpt/" title="Tin Tức - THPT" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-10/" title="Tin Tức - Lớp 10" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-11/" title="Tin Tức - Lớp 11" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lop-12/" title="Tin Tức - Lớp 12" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/sgk-thpt/" title="Tin Tức - SGK THPT" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-10/" title="Tin Tức - Tin học 10" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-11/" title="Tin Tức - Tin học 11" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tin-hoc-12/" title="Tin Tức - Tin học 12" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/cntt/" title="Tin Tức - CNTT" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/phan-mem-quan-li-va-dieu-hanh/" title="Tin Tức - Phần mềm quản lí và điều hành" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/phan-mem-ung-dung/" title="Tin Tức - Phần mềm ứng dụng" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/ung-dung-ai/" title="Tin Tức - Ứng dụng AI" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/mang-may-tinh/" title="Tin Tức - Mạng máy tính" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lap-trinh/" title="Tin Tức - Lập trình" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/cau-truc-thi-hsg-va-ts-vao-10/" title="Tin Tức - Cấu trúc thi HSG và TS vào 10" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/tai-lieu-hoc-lap-trinh/" title="Tin Tức - Tài liệu học lập trình" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/phan-mem-lap-trinh/" title="Tin Tức - Phần mềm lập trình" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lap-trinh-truc-quan/" title="Tin Tức - Lập trình trực quan" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lap-trinh-huong-thu-tuc-pop/" title="Tin Tức - Lập trình hướng thủ tục &#40;POP&#41;" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/de-thi/" title="Tin Tức - Đề thi" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/de-hsg-tin-hoc-thcs/" title="Tin Tức - Đề HSG Tin học THCS" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/de-tin-hoc-ts-vao-10-thpt-chuyen/" title="Tin Tức - Đề Tin học TS vào 10 THPT chuyên" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/de-tin-hoc-hsg-thpt/" title="Tin Tức - Đề Tin học HSG THPT" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/cham-thi/" title="Tin Tức - Chấm thi" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/themis/" title="Tin Tức - Themis" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/vnoi/" title="Tin Tức - VNOI" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/danh-sach-hoc-sinh/" title="Tin Tức - Danh sách học sinh" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/lap-trinh-huong-doi-tuong-oop/" title="Tin Tức - Lập trình hướng đối tượng &#40;OOP&#41;" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/web-nguon-mo/" title="Tin Tức - Web nguồn mở" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/he-dieu-hanh/" title="Tin Tức - Hệ điều hành" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/microsoft-windows/" title="Tin Tức - Microsoft Windows" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/ho-linux/" title="Tin Tức - Họ Linux" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/may-chu/" title="Tin Tức - Máy chủ" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/co-so-du-lieu/" title="Tin Tức - Cơ sở dữ liệu" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/web-server/" title="Tin Tức - Web Server" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/hosting-domain-vps/" title="Tin Tức - Hosting-domain-VPS" type="application/rss+xml">
<link rel="alternate" href="https://365.io.vn/rss/ban-tin/" title="Tin Tức - Bản tin" type="application/rss+xml">
<link rel="preload" as="style" href="https://365.io.vn/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://365.io.vn/themes/default/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://365.io.vn/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://365.io.vn/themes/default/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://365.io.vn/themes/default/css/news.css" type="text/css">
<link rel="preload" as="style" href="https://365.io.vn/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="script" href="https://365.io.vn/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://365.io.vn/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://365.io.vn/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://365.io.vn/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://365.io.vn/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://365.io.vn/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://365.io.vn/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://365.io.vn/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://365.io.vn/themes/default/js/bootstrap.min.js" type="text/javascript">
<link rel="stylesheet" href="https://365.io.vn/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://365.io.vn/themes/default/css/bootstrap.non-responsive.css">
<link rel="stylesheet" href="https://365.io.vn/themes/default/css/style.css">
<link rel="stylesheet" href="https://365.io.vn/themes/default/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://365.io.vn/themes/default/css/news.css">
<link rel="stylesheet" href="https://365.io.vn/themes/default/css/custom.css">
<style type="text/css">
	body{background: #fff;}
</style>
    </head>
    <body>
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">DATAONLINE.IO.VN</h2>
		<p class="pull-right"><a title="DATAONLINE.IO.VN" href="https://365.io.vn/">https://365.io.vn</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>Gradle Java Desktop Application và SQLite</h1>
		<ul class="list-inline">
			<li>Thứ hai - 21/03/2022 22:39</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
			<p>Gradle Java Desktop Application và SQLITE.</p>
		</div>
				<div class="imghome">
			<img alt="Gradle Java Desktop Application và SQLite" src="https://365.io.vn/uploads/news/netbeans.png" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<p>settings.gradle</p><pre><code class="language-plaintext">rootProject.name = &#039;javadbsqlite&#039;
include(&#039;app&#039;)
project(&quot;:app&quot;).name = &quot;GradleJavaSQLLITEDB&quot;</code></pre><p>build.gradle</p><pre><code class="language-plaintext">plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    id &#039;application&#039;
}

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(8)) //Yêu cầu từ Java 8 trở lên
        vendor = JvmVendorSpec.ADOPTOPENJDK
    }
}

compileJava {options.encoding = &quot;UTF-8&quot;}   
compileTestJava {options.encoding = &quot;UTF-8&quot;}
tasks.withType(JavaCompile) {
    options.encoding = &quot;UTF-8&quot;
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit Jupiter for testing.
    // testImplementation &#039;org.junit.jupiter:junit-jupiter:5.7.2&#039;

    // This dependency is used by the application.
    // implementation &#039;com.google.guava:guava:30.1.1-jre&#039;
    runtimeOnly &#039;org.xerial:sqlite-jdbc:3.36.0.3&#039;
}
mainClassName = &#039;javadbsqlite.frmMain&#039;
application {
    // Define the main class for the application.
    mainClass = mainClassName
}

jar {     
    manifest {      
        attributes( &#039;Main-Class&#039;: mainClassName)                   
    }
    from {
        duplicatesStrategy = DuplicatesStrategy.INCLUDE
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

tasks.named(&#039;test&#039;) {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}
</code></pre><p>frmMain.java</p><pre><code class="language-plaintext">/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package javadbsqlite;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.io.File;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.text.ParseException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import javax.swing.table.JTableHeader;
import javax.swing.text.JTextComponent;

/**
 *
 * @author admin
 */
public class frmMain extends javax.swing.JFrame {

    private final String javaversion;
    private int id = -1;
    private JLabel lbldbname = new JLabel(&quot;Tên cơ sở dữ liệu:&quot;, JLabel.LEFT);
    private JComboBox cbodbname = new JComboBox();
    private JButton btnOpenDatabase = new JButton(&quot;Open Database&quot;);
    private JButton btnDeleteDatabase = new JButton(&quot;Delete Database&quot;);
    private JButton btnCloseDatabase = new JButton(&quot;Close Database&quot;);
    private JButton btnAdd = new JButton(&quot;Add&quot;);
    private JButton btnSave = new JButton(&quot;Save&quot;);
    private JButton btnDelete = new JButton(&quot;Delete&quot;);
    private JButton btnClose = new JButton(&quot;Close&quot;);
    private JScrollPane scrollPane = new JScrollPane();
    private DefaultTableModel dm = new javax.swing.table.DefaultTableModel() {
        @Override
        public Class&lt;?&gt; getColumnClass(int column) {
            switch (column) {
                case 0:
                    return Integer.class;
                case 1:
                    return String.class;
                case 2:
                    return Float.class;
                default:
                    return String.class;
            }
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            if (column == 0) {
                return false;
            } else {
                return false;
            }
        }
    };
    private JTable table = new JTable(dm) {
        @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component component = super.prepareRenderer(renderer, row, column);
            int rendererWidth = component.getPreferredSize().width;
            TableColumn tableColumn = getColumnModel().getColumn(column);
            tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
            return component;
        }
    };

    private final JLabel lblname = new JLabel(&quot;Name:&quot;, JLabel.LEFT);
    private final JTextField txtname = new JTextField();
    private final JLabel lblmoney = new JLabel(&quot;Money:&quot;, JLabel.LEFT);
    private final JTextField txtmoney = new JTextField();
    private final String fileseparator = System.getProperty(&quot;file.separator&quot;);
    private final File fileFolder = new File(&quot;Databases&quot;);
    private final String filedbType = &quot;.db&quot;;
    private Connection conn = null;
    private int dbindex = -1;
    private boolean dbmoney = false;
    private String valuedbname = &quot;&quot;;

    private void SUM(JTable table, int column) {
        if (table.getRowCount() &lt; 1) {
            return;
        }
        NumberFormat format = DecimalFormat.getInstance();
        format.setGroupingUsed(true);
        format.setMinimumFractionDigits(0);
        float sum = 0;
        int row = 0, rowcout = table.getRowCount();
        try {

            for (row = 0; row &lt; rowcout; row++) {
                sum = sum + format.parse(table.getValueAt(row, column).toString()).floatValue();
            }
            dm.insertRow(row, new Object&#91;&#93;{&quot; &quot;, &quot;Cộng:&quot;, sum});
        } catch (ParseException e) {

        }
    }

    private String getFileName(String S) {
        int index = S.lastIndexOf(&quot;.&quot;);
        if (index &gt; -1) {
            S = S.substring(0, index);
        }
        return S;
    }

    private void loaddbname() {
        if (!fileFolder.exists()) {
            fileFolder.mkdir();
        }
        File&#91;&#93; listOfFiles = fileFolder.listFiles();
        if (listOfFiles.length &gt; 0) {
            String files = null, name = &quot;&quot;;
            for (int i = 0; i &lt; listOfFiles.length; i++) {
                if (listOfFiles&#91;i&#93;.isFile()) {
                    files = listOfFiles&#91;i&#93;.getName();
                    if (files.endsWith(filedbType) || files.endsWith(filedbType.toUpperCase())) {
                        name = getFileName(files);
                        if (((DefaultComboBoxModel) cbodbname.getModel()).getIndexOf(name) == -1) {
                            cbodbname.addItem(name);
                        }
                        if (name.toLowerCase().equals(&quot;money&quot;)) {
                            dbmoney = true;
                        }
                    }
                }
            }
        } else {
            cbodbname.removeAllItems();
            cbodbname.addItem(&quot;money&quot;);
        }
    }

    private void OpenDatabase() {
        try {
            String value = this.valuedbname;
            Class.forName(&quot;org.sqlite.JDBC&quot;);
            File filecurent = new File(fileFolder.getCanonicalPath().concat(fileseparator).concat(cbodbname.getSelectedItem().toString().concat(filedbType)));
            String dbURL = &quot;jdbc:sqlite:&quot;.concat(filecurent.getCanonicalPath());
            if (!filecurent.getParentFile().exists()) {
                filecurent.mkdir();
            }
            conn = DriverManager.getConnection(dbURL);
            if (conn != null) {
                btnOpenDatabase.setEnabled(false);
                btnCloseDatabase.setEnabled(true);
                btnDeleteDatabase.setEnabled(false);
                btnAdd.setEnabled(true);
                btnSave.setEnabled(false);
                btnDelete.setEnabled(false);
                btnClose.setEnabled(true);
                txtname.setEnabled(false);
                txtmoney.setEnabled(false);
                if (!dbmoney) {
                    cbodbname.removeItem(&quot;money&quot;);
                }
                if (value.toLowerCase().equals(&quot;money&quot;)) {
                    dbmoney = true;
                }
                if (((DefaultComboBoxModel) cbodbname.getModel()).getIndexOf(value) == -1) {
                    cbodbname.addItem(value);
                }
                DatabaseMetaData dm = (DatabaseMetaData) conn.getMetaData();
                StringBuilder sb = new StringBuilder();
                sb.append(value).append(&quot;; &quot;).append(dm.getDriverName()).append(&quot;; &quot;).append(dm.getDatabaseProductName()).append(&quot;; &quot;)
                        .append(dm.getDatabaseProductVersion());
                this.setTitle(sb.toString());
            }
        } catch (IOException | ClassNotFoundException | SQLException ex) {
        }
    }

    private void CloseDatabase() {
        try {
            if (conn != null) {
                conn.close();
                conn = null;
            }
            this.setTitle(&quot;&quot;);
            cbodbname.setSelectedIndex(-1);
            dm.setRowCount(0);
            btnOpenDatabase.setEnabled(true);
            btnCloseDatabase.setEnabled(false);
            btnDeleteDatabase.setEnabled(true);
            btnAdd.setEnabled(false);
            btnSave.setEnabled(false);
            btnDelete.setEnabled(false);
            btnClose.setEnabled(true);
            txtname.setText(&quot;&quot;);
            txtmoney.setText(&quot;&quot;);
            txtname.setEnabled(false);
            txtmoney.setEnabled(false);
        } catch (SQLException ex) {
        }
    }

    private void DeleteDatabase() {
        try {
            File filecurent = new File(fileFolder.getCanonicalPath().concat(fileseparator).concat(cbodbname.getSelectedItem().toString().concat(filedbType)));
            if (filecurent.delete()) {
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
                this.setTitle(&quot;&quot;);
                cbodbname.removeItemAt(dbindex);
                cbodbname.setSelectedIndex(-1);
                dm.setRowCount(0);
                btnOpenDatabase.setEnabled(true);
                btnCloseDatabase.setEnabled(false);
                btnDeleteDatabase.setEnabled(true);
                btnAdd.setEnabled(false);
                btnSave.setEnabled(false);
                btnDelete.setEnabled(false);
                btnClose.setEnabled(true);
                txtname.setText(&quot;&quot;);
                txtmoney.setText(&quot;&quot;);
                txtname.setEnabled(false);
                txtmoney.setEnabled(false);
                cbodbname.requestFocusInWindow();
            }
        } catch (IOException | SQLException ex) {
            JOptionPane.showInternalMessageDialog(this, &quot;Lỗi xóa cơ sở dữ liệu &quot; + ex.getMessage(), &quot;Xóa Database&quot;, JOptionPane.ERROR_MESSAGE);
        }
    }

    private void createtbldmLop(Connection conn) {
        String sql = &quot;CREATE TABLE IF NOT EXISTS tbldmLop(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR(50) NOT NULL, money REAL NOT NULL);&quot;;
        try {
            if (conn != null) {
                Statement stmt = conn.createStatement();
                stmt.execute(sql);
            }
        } catch (SQLException e) {

        }
    }

    private int inserttbldmLop(Connection conn) {
        int kq = 0;
        String name = txtname.getText();
        float money = Float.valueOf(txtmoney.getText());
        String sql = &quot;INSERT INTO tbldmLop (name, money) VALUES (&#039;&quot; + name + &quot;&#039;,&quot; + money + &quot;)&quot;;
        try {
            if (conn != null) {
                Statement stmt = conn.createStatement();
                kq = stmt.executeUpdate(sql);
            }
        } catch (SQLException e) {

        }
        return kq;
    }

    private int updatetbldmLop(Connection conn) {
        int kq = 0;
        NumberFormat format = DecimalFormat.getInstance();
        format.setGroupingUsed(true);
        format.setMinimumFractionDigits(0);
        String name = txtname.getText();
        try {
            float money = format.parse(txtmoney.getText()).floatValue();
            String sql = &quot;UPDATE tbldmLop SET name = &#039;&quot; + name + &quot;&#039;, money = &quot; + money + &quot; WHERE id = &quot; + this.id;
            if (conn != null) {
                Statement stmt = conn.createStatement();
                kq = stmt.executeUpdate(sql);
            }
        } catch (SQLException | ParseException e) {

        }
        return kq;
    }

    private int deletetbldmLop(Connection conn) {
        int kq = 0;
        try {
            String sql = &quot;DELETE FROM tbldmLop WHERE id = &quot; + this.id;
            if (conn != null) {
                Statement stmt = conn.createStatement();
                kq = stmt.executeUpdate(sql);
            }
        } catch (SQLException e) {

        }
        return kq;
    }

    private int selecttbldmLop(Connection conn) {
        int kq = 0;
        String sql = &quot;SELECT * FROM tbldmLop&quot;;
        try {
            if (conn != null) {
                Statement stmt = conn.createStatement();
                try ( ResultSet rs = stmt.executeQuery(sql)) {
                    int row = -1;
                    dm.setRowCount(0);
                    while (rs.next()) {
                        kq++;
                        row++;
                        dm.insertRow(row, new Object&#91;&#93;{rs.getInt(1),
                            rs.getString(2), rs.getFloat(3)});
                    }
                }
            }

        } catch (SQLException e) {

        }
        return kq;
    }

    private void GUI() {
        lbldbname.setBounds(5, 5, 150, 30);
        getContentPane().add(this.lbldbname);
        cbodbname.setEditable(true);
        cbodbname.setBounds(155, 5, 150, 30);
        getContentPane().add(this.cbodbname);
        btnOpenDatabase.setBounds(310, 5, 150, 30);
        btnOpenDatabase.setMnemonic(KeyEvent.VK_O);
        getContentPane().add(this.btnOpenDatabase);
        btnCloseDatabase.setBounds(465, 5, 150, 30);
        btnCloseDatabase.setMnemonic(KeyEvent.VK_C);
        getContentPane().add(this.btnCloseDatabase);
        btnDeleteDatabase.setBounds(615, 5, 150, 30);
        btnDeleteDatabase.setMnemonic(KeyEvent.VK_D);
        getContentPane().add(this.btnDeleteDatabase);
        scrollPane.setBounds(5, 50, 600, 400);
        scrollPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.red));
        getContentPane().add(this.scrollPane);
        scrollPane.setViewportView(table);
        scrollPane.repaint();
        table.setFont(new Font(&quot;Times New Roman&quot;, Font.PLAIN, 16));
        JTableHeader th = table.getTableHeader();
        th.setPreferredSize(new Dimension(30, 30));
        th.setFont(new Font(&quot;Times New Roman&quot;, Font.BOLD, 16));

        lblname.setBounds(610, 50, 100, 30);
        lblname.setDisplayedMnemonic(KeyEvent.VK_N);
        lblname.setLabelFor(txtname);
        getContentPane().add(this.lblname);
        txtname.setBounds(715, 50, 400, 30);
        getContentPane().add(this.txtname);

        lblmoney.setBounds(610, 85, 100, 30);
        lblmoney.setDisplayedMnemonic(KeyEvent.VK_M);
        lblmoney.setLabelFor(txtmoney);
        getContentPane().add(this.lblmoney);
        txtmoney.setBounds(715, 85, 200, 30);
        getContentPane().add(this.txtmoney);

        btnAdd.setBounds(715, 120, 100, 30);
        btnAdd.setMnemonic(KeyEvent.VK_A);
        getContentPane().add(this.btnAdd);
        btnSave.setBounds(820, 120, 100, 30);
        btnSave.setMnemonic(KeyEvent.VK_S);
        getContentPane().add(this.btnSave);
        btnDelete.setBounds(925, 120, 100, 30);
        btnDelete.setMnemonic(KeyEvent.VK_L);
        getContentPane().add(this.btnDelete);
        btnClose.setBounds(1030, 120, 100, 30);
        btnClose.setMnemonic(KeyEvent.VK_E);
        getContentPane().add(this.btnClose);
        cbodbname.addActionListener((ActionEvent e) -&gt; {
            this.dbindex = cbodbname.getSelectedIndex();
        });

        cbodbname.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {

            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (((JTextComponent) ((JComboBox) ((Component) e
                            .getSource()).getParent()).getEditor()
                            .getEditorComponent()).getText().trim().isEmpty()) {
                        valuedbname = &quot;&quot;;
                        cbodbname.requestFocusInWindow();
                    } else {
                        btnOpenDatabase.requestFocusInWindow();
                    }
                }
            }

            @Override
            public void keyTyped(KeyEvent e) {
                char c = e.getKeyChar();
                if (!(Character.isAlphabetic(c)
                        || Character.isDigit(c)
                        || (c == KeyEvent.VK_BACK_SPACE)
                        || (c == KeyEvent.VK_DELETE))) {
                    e.consume();
                }
            }
        });

        txtname.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (txtname.getText().trim().isEmpty()) {
                        txtname.requestFocusInWindow();
                    } else {
                        txtmoney.requestFocusInWindow();
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {

            }
        });
        txtmoney.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (txtmoney.getText().trim().isEmpty()) {
                        txtmoney.requestFocusInWindow();
                    } else {
                        btnSave.requestFocusInWindow();
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {
                DecimalFormatSymbols symbols = new DecimalFormatSymbols();
                char c = e.getKeyChar();
                char decimalSeparator = symbols.getDecimalSeparator();
                long count = txtmoney.getText().chars().filter(ch -&gt; ch == decimalSeparator).count();
                if (count == 0) {
                    if (!(Character.isDigit(c)
                            || (c == KeyEvent.VK_BACK_SPACE)
                            || (c == KeyEvent.VK_DELETE) || (c == decimalSeparator))) {
                        e.consume();
                    }
                } else {
                    if (!(Character.isDigit(c)
                            || (c == KeyEvent.VK_BACK_SPACE)
                            || (c == KeyEvent.VK_DELETE))) {
                        e.consume();
                    }
                }
            }
        });

        dm.addColumn(&quot;id&quot;);
        dm.addColumn(&quot;Name&quot;);
        dm.addColumn(&quot;Money&quot;);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setRowHeight(30);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
        centerRenderer.setHorizontalAlignment(JLabel.CENTER);
        table.getColumnModel().getColumn(0).setCellRenderer(centerRenderer);

        cbodbname.addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {

            }

            @Override
            public void focusLost(FocusEvent e) {

            }
        });
        btnOpenDatabase.addActionListener((ActionEvent e) -&gt; {
            setOpenDatabase();
        });
        btnDeleteDatabase.addActionListener((ActionEvent e) -&gt; {
            setDeleteDatabases();
        });
        btnCloseDatabase.addActionListener((ActionEvent e) -&gt; {
            setCloseDatabases();
        });
        btnAdd.addActionListener((ActionEvent e) -&gt; {
            setAdd();
        });
        btnSave.addActionListener((ActionEvent e) -&gt; {
            setSave();
        });
        btnDelete.addActionListener((ActionEvent e) -&gt; {
            setDelete();
        });
        btnClose.addActionListener((ActionEvent e) -&gt; {
            setClose();
        });
        btnOpenDatabase.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (btnOpenDatabase.isFocusable()) {
                        setOpenDatabase();
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {

            }
        });
        btnDeleteDatabase.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (btnDeleteDatabase.isFocusable()) {
                        setDeleteDatabases();
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {

            }
        });
        btnCloseDatabase.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (btnCloseDatabase.isFocusable()) {
                        setCloseDatabases();
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {

            }
        });
        btnAdd.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (btnAdd.isFocusable()) {
                        setAdd();
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {

            }
        });
        btnSave.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (btnSave.isFocusable()) {
                        setSave();
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {

            }
        });
        btnDelete.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (btnDelete.isFocusable()) {
                        setDelete();
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {

            }
        });
        btnClose.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                    if (btnClose.isFocusable()) {
                        setClose();
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {

            }
        });
        table.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mousePressed(MouseEvent e) {
                int row;
                int rowcount = dm.getRowCount();
                if (rowcount &gt; 0) {
                    row = table.getSelectedRow();
                    if (row &lt; rowcount - 1) {
                        Object value = table.getValueAt(row, 0);
                        id = Integer.valueOf(value.toString());
                        value = table.getValueAt(row, 1);
                        txtname.setText(value.toString());
                        value = table.getValueAt(row, 2);
                        NumberFormat format = DecimalFormat.getInstance();
                        format.setGroupingUsed(true);
                        format.setMinimumFractionDigits(0);
                        txtmoney.setText(format.format(value));
                        btnAdd.setEnabled(true);
                        btnSave.setEnabled(true);
                        btnDelete.setEnabled(true);
                        btnClose.setEnabled(true);
                        txtname.setEnabled(true);
                        txtmoney.setEnabled(true);
                    } else {
                        id = -1;
                        txtname.setText(&quot;&quot;);
                        txtmoney.setText(&quot;&quot;);
                        btnAdd.setEnabled(true);
                        btnSave.setEnabled(false);
                        btnDelete.setEnabled(false);
                        btnClose.setEnabled(true);
                        txtname.setEnabled(false);
                        txtmoney.setEnabled(false);
                    }
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseClicked(MouseEvent e) {

            }
        });

        table.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int rowcount = dm.getRowCount();
                if (rowcount &gt; 0) {
                    int row = table.getSelectedRow();
                    if (e.getKeyCode() == KeyEvent.VK_UP) {
                        if (row &gt; 0) {
                            getDataTableSelectRows(row - 1, rowcount);
                        }
                    }
                    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                        getDataTableSelectRows(row + 1, rowcount);
                    }
                    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                        if (row == rowcount - 1) {
                            row = 0;
                            id = -1;
                            txtname.setText(&quot;&quot;);
                            txtmoney.setText(&quot;&quot;);
                        } else {
                            row++;
                        }
                        System.out.println(&quot;row: &quot; + row);
                        getDataTableSelectRows(row, rowcount);
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }

            @Override
            public void keyTyped(KeyEvent e) {

            }
        });
    }

    private void getDataTableSelectRows(int row, int rowcount) {
        try {
            if (row &lt; rowcount - 1) {
                Object value = table.getValueAt(row, 0);
                id = Integer.valueOf(value.toString());
                value = table.getValueAt(row, 1);
                txtname.setText(value.toString());
                value = table.getValueAt(row, 2);
                NumberFormat format = DecimalFormat.getInstance();
                format.setGroupingUsed(true);
                format.setMinimumFractionDigits(0);
                txtmoney.setText(format.format(value));
                btnAdd.setEnabled(true);
                btnSave.setEnabled(true);
                btnDelete.setEnabled(true);
                btnClose.setEnabled(true);
                txtname.setEnabled(true);
                txtmoney.setEnabled(true);
            } else {
                id = -1;
                txtname.setText(&quot;&quot;);
                txtmoney.setText(&quot;&quot;);
                btnAdd.setEnabled(true);
                btnSave.setEnabled(false);
                btnDelete.setEnabled(false);
                btnClose.setEnabled(true);
                txtname.setEnabled(false);
                txtmoney.setEnabled(false);
            }
        } catch (NumberFormatException e) {

        }
    }

    private void setCloseDatabases() throws HeadlessException {
        int kq = JOptionPane.showConfirmDialog(this, &quot;Bạn có chắc chắn đóng cơ sở dữ liệu không?&quot;, &quot;Cơ sở dữ liệu&quot;, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
        if (kq == JOptionPane.YES_OPTION) {
            CloseDatabase();
             this.setTitle(&quot;java.version: &quot; + javaversion);
        }
    }

    private void setDeleteDatabases() throws HeadlessException {
        valuedbname = ((JTextField) cbodbname.getEditor().getEditorComponent()).getText().trim();
        if (valuedbname.length() &gt; 0) {
            int kq = JOptionPane.showConfirmDialog(this, &quot;Bạn có chắc chắn xóa cơ sở dữ liệu &quot; + cbodbname.getSelectedItem() + &quot; không?&quot;, &quot;Xóa Database&quot;, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (kq == JOptionPane.YES_OPTION) {
                DeleteDatabase();
               this.setTitle(&quot;java.version: &quot; + javaversion);
            }
        } else {
            cbodbname.requestFocusInWindow();
        }
    }

    private void setClose() throws HeadlessException {
        try {
            int kq = JOptionPane.showConfirmDialog(this, &quot;Bạn có chắc chắn đóng cơ sở dữ liệu và thoát không?&quot;, &quot;Thoát&quot;, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (kq == JOptionPane.YES_OPTION) {
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
                System.exit(0);
            }
        } catch (SQLException ex) {

        }
    }

    private void setDelete() {
        try {
            int kq = JOptionPane.showConfirmDialog(this, &quot;Bạn có chắc chắn xóa dữ liệu có id = &quot; + this.id + &quot; không?&quot;, &quot;Xóa dữ liệu&quot;, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (kq == JOptionPane.YES_OPTION) {
                if (this.id != -1) {
                    deletetbldmLop(this.conn);
                    this.id = -1;
                    txtname.setText(&quot;&quot;);
                    txtmoney.setText(&quot;&quot;);
                    selecttbldmLop(this.conn);
                    SUM(table, 2);
                    btnAdd.setEnabled(true);
                    btnSave.setEnabled(false);
                    btnDelete.setEnabled(false);
                    btnClose.setEnabled(true);
                    txtname.setEnabled(false);
                    txtmoney.setEnabled(false);
                    table.requestFocusInWindow();
                }
            }
        } catch (HeadlessException ex) {

        }
    }

    private void setSave() {
        try {
            if (txtname.getText().trim().length() == 0) {
                txtname.requestFocusInWindow();
            } else if (txtmoney.getText().trim().length() == 0) {
                txtmoney.requestFocusInWindow();
            } else {
                if (this.id == -1) {
                    inserttbldmLop(this.conn);
                } else {
                    updatetbldmLop(this.conn);
                }
                this.id = -1;
                txtname.setText(&quot;&quot;);
                txtmoney.setText(&quot;&quot;);
                selecttbldmLop(this.conn);
                SUM(table, 2);
                btnAdd.setEnabled(true);
                btnSave.setEnabled(false);
                btnDelete.setEnabled(false);
                btnClose.setEnabled(true);
                txtname.setEnabled(false);
                txtmoney.setEnabled(false);
                int kq = JOptionPane.showConfirmDialog(this, &quot;Đã lưu thành công. Tiếp tục thêm mới?&quot;, &quot;Lưu dữ liệu&quot;, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                if (kq == JOptionPane.YES_OPTION) {
                    btnAdd.requestFocusInWindow();
                } else {
                    table.requestFocusInWindow();
                }
            }
        } catch (HeadlessException ex) {

        }
    }

    private void setAdd() {
        this.id = -1;
        txtname.setText(&quot;&quot;);
        txtmoney.setText(&quot;&quot;);
        btnAdd.setEnabled(false);
        btnSave.setEnabled(true);
        btnDelete.setEnabled(false);
        btnClose.setEnabled(true);
        txtname.setEnabled(true);
        txtmoney.setEnabled(true);
        txtname.requestFocusInWindow();
    }

    private void setOpenDatabase() {
        valuedbname = ((JTextField) cbodbname.getEditor().getEditorComponent()).getText().trim();
        if (valuedbname.length() &gt; 0) {
            OpenDatabase();
            createtbldmLop(this.conn);
            int kq = selecttbldmLop(this.conn);
            SUM(table, 2);
            System.out.println(kq);
            if (kq == 0) {
                btnAdd.requestFocusInWindow();
            } else {
                table.requestFocusInWindow();
            }
        } else {
            cbodbname.requestFocusInWindow();
        }
    }

    public frmMain() {
        this.javaversion = System.getProperty(&quot;java.version&quot;);
        setLayout(null);
        this.setTitle(&quot;java.version: &quot; + javaversion);
        getContentPane().setBackground(Color.white);
        getRootPane().setBorder(BorderFactory.createMatteBorder(4, 4, 4, 4, Color.blue));
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setResizable(true);
        GUI();
        cbodbname.removeAllItems();
        loaddbname();
        cbodbname.setSelectedIndex(-1);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        this.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent evt) {
                setExtendedState(JFrame.MAXIMIZED_BOTH);
            }
        });

        btnOpenDatabase.setEnabled(true);
        btnCloseDatabase.setEnabled(false);
        btnDeleteDatabase.setEnabled(true);
        btnAdd.setEnabled(false);
        btnSave.setEnabled(false);
        btnDelete.setEnabled(false);
        btnClose.setEnabled(true);
        txtname.setEnabled(false);
        txtmoney.setEnabled(false);
    }

    public static void main(String&#91;&#93; args) {
        try {
            java.awt.EventQueue.invokeLater(() -&gt; {
                new frmMain().setVisible(true);
            });
        } catch (Exception ex) {

        }
    }
}
</code></pre><p><img src="https://i.imgur.com/Tomk9jX.png" alt="" /><br />&nbsp;</p>
		</div>
				<div id="author">
						<p>
				<strong>Tác giả:</strong>
				<a href="https://365.io.vn/author/Vang-Van-Quyn/">Vàng Văn Quyn</a>
			</p>
		</div>
				<div class="copyright">
			Chú ý: Việc đăng lại bài viết trên ở website hoặc các phương tiện truyền thông khác mà không ghi rõ nguồn<strong> <a href="https://365.info.vn" target="_blank">https://365.io.vn</a>&nbsp;</strong>là vi phạm bản quyền
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://365.io.vn/savefile/lap-trinh-huong-doi-tuong-oop/gradle-java-desktop-application-va-sqlite-36.html" title="Gradle Java Desktop Application và SQLite">https://365.io.vn/savefile/lap-trinh-huong-doi-tuong-oop/gradle-java-desktop-application-va-sqlite-36.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; DATAONLINE.IO.VN
		</div>
		<div id="contact">
			<a href="mailto:support@dataonline.io.vn">support@dataonline.io.vn</a>
		</div>
	</div>
</div>
        <div class="cookie-notice"><div><button onclick="cookie_notice_hide();">&times;</button>Chúng tôi đang sử dụng cookie để cung cấp cho bạn những trải nghiệm tốt nhất trên trang web này. Bằng cách tiếp tục truy cập, bạn đồng ý với <a href="https://365.io.vn/siteterms/privacy.html">Chính sách thu thập và sử dụng cookie</a> của chúng tôi.</div></div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://365.io.vn/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
<div id="run_cronjobs" style="visibility:hidden;display:none;"><img alt="cron" src="/index.php?second=cronjobs&amp;p=v43u4fLe" width="1" height="1" /></div>
<script src="https://365.io.vn/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="nv4",nv_check_pass_mstime=1738000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://365.io.vn/assets/js/language/vi.js"></script>
<script src="https://365.io.vn/assets/js/DOMPurify/purify3.js"></script>
<script src="https://365.io.vn/assets/js/global.js"></script>
<script src="https://365.io.vn/assets/js/site.js"></script>
<script src="https://365.io.vn/themes/default/js/news.js"></script>
<script src="https://365.io.vn/themes/default/js/main.js"></script>
<script src="https://365.io.vn/themes/default/js/custom.js"></script>
<script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "url": "https://365.io.vn",
            "logo": "https://365.io.vn/assets/images/logo.svg"
        }
        </script>
<script src="https://365.io.vn/themes/default/js/bootstrap.min.js">
        </script>
<script>
    var LIMIT = 600000; // 10 phút

    var startTime = sessionStorage.getItem("redirect_timer");
    if (!startTime) {
        startTime = Date.now();
        sessionStorage.setItem("redirect_timer", startTime);
    } else {
        startTime = parseInt(startTime, 10);
    }

    var elapsed = Date.now() - startTime;
    var remain = LIMIT - elapsed;

    if (remain > 0) {
        setTimeout(function () {
            alert("Hệ thống sẽ chuyển sang trang chấm bài.");
            window.location.replace("https://vnoj.io.vn");
        }, remain);
    } else {
        window.location.replace("https://vnoj.io.vn");
    }
</script>
</body>
</html>