Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

Sử dụng text file để lưu trữ dữ liệu dạng CSDL

Trong bài này chúng ta mở rộng vấn đề đã được thảo luận ở bài viết Các bước làm việc với tập hợp các đối tượng. Ở đây chúng ta thêm vào chức năng lưu trữ dữ liệu sau 1 phiên làm việc và phục hồi chúng cho lần làm việc kế tiếp.

Đầu tiên ta tạo 1 thư mục SimplejavaDB, tạo  tập tin “cơ sở dữ liệu” của chúng ta với tên “database.txt”. Chúng ta có thể dùng notepad để thêm vài mẫu tin bằng cách gõ theo định dạng : msHang;Tên hàng;don_gia ví dụ như sp0;Xoài;4000. Hoặc nếu chúng ta không tạo, chương trình sẽ tự động tạo 1 database mặc định không có mẫu tin nào.

Tạo tập tin đặc tả cho đối tượng hàng hóa của chúng ta  với tên Product.java

public class Product {
private String productID;
private String productName;
private double price;
public String getProductID() {
return productID;
}
public void setProductID(String productID) {
this.productID = productID;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}public Product() {}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((productID == null) ? 0 : productID.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Product other = (Product) obj;
if (productID == null) {
if (other.productID != null)
return false;
} else if (!productID.equals(other.productID))
return false;
return true;
}
public Product(String productID, String productName, double price) {
super();
this.productID = productID;
this.productName = productName;
this.price = price;
}

public String toString() {
return productID+”,”+productName+”,”+price;
}

}

Tạo tập tin làm database cơ bản có tên ListProduct.java.

package baitapFile;import java.util.ArrayList;public class ListProducts {
private ArrayList<Product> list;
public ListProducts() {
list=new ArrayList<Product>();
}

public void ThemHang(Product pr) {
list.add(pr);
}

public void Remove(Product pro) {
list.remove(pro);
}

public double Tongtien() {
double amount=0;
for(Product p:list) {
amount+=p.getPrice();
}
return amount;
}

public Product GetProduct(int index) {
if(index<0||index>list.size())
return null;
return list.get(index);
}

public int Count() {
return list.size();
}
}

Tạo tập tin ứng dụng để thử. Tập tin này khi khởi động sẽ đọc file dữ liệu, khôi phục nó lên, sau đó chúng ta làm việc với dữ liệu này. Khi chương trình kết thúc, nó sẽ tự động cập nhật dữ liệu xuống file. Code của nó như sau:

File QuanLyHH_GUI.java

package baitapFile;import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Scanner;import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class QuanLyHH_GUI extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;

private DefaultTableModel dtm;
private JTable table;
private JTextField tfID,tfName,tfPrice;
private JButton btnAdd,btnSave,btnDelete,btnUpdate,btnExit;

private ListProducts dsHang;

public QuanLyHH_GUI() {
super(“Quản lý hàng hóa”);setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400,300);setLocation(150,100);
CreateGUI();
LoadDatabase();
LockText(true);
//tự động cập nhật khi đóng ứng dụng
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
UpdateDatabase();
System.exit(1);
}
});
}
void CreateGUI() {
String []header={“Mã số SP”,”Tên sản phẩm”,”Đơn giá”};
dtm=new DefaultTableModel(header,0);
table=new JTable(dtm);
this.add(new JScrollPane(table));
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
int row=table.getSelectedRow();
tfID.setText(table.getValueAt(row, 0).toString());
tfName.setText(table.getValueAt(row, 1).toString());
tfPrice.setText(table.getValueAt(row, 2).toString());
} catch (Exception e1) {}
}
});

Box b=Box.createVerticalBox();
Box b1=Box.createHorizontalBox();Box b2=Box.createHorizontalBox();
Box b3=Box.createHorizontalBox();Box b4=Box.createHorizontalBox();
b.add(Box.createVerticalStrut(10));
b.add(b1);b.add(Box.createVerticalStrut(8));
b.add(b2);b.add(Box.createVerticalStrut(8));
b.add(b3);b.add(Box.createVerticalStrut(8));
b.add(b4);b.add(Box.createVerticalStrut(8));
JLabel l1,l2,l3;
b1.add(l1=new JLabel(“Mã số sản phẩm:”,JLabel.RIGHT));b1.add(tfID=new JTextField(20));
b2.add(l2=new JLabel(“Tên sản phẩm:”,JLabel.RIGHT));b2.add(tfName=new JTextField(20));
b3.add(l3=new JLabel(“Đơn giá:”,JLabel.RIGHT));b3.add(tfPrice=new JTextField(20));
l2.setPreferredSize(l1.getPreferredSize());
l3.setPreferredSize(l1.getPreferredSize());
this.add(b,BorderLayout.NORTH);

b4.add(btnAdd=new JButton(“Thêm”));btnAdd.addActionListener(this);
b4.add(Box.createHorizontalStrut(10));
b4.add(btnSave=new JButton(“Lưu”));btnSave.addActionListener(this);
b4.add(Box.createHorizontalStrut(10));btnSave.setEnabled(false);
b4.add(btnUpdate=new JButton(“Sửa”));btnUpdate.addActionListener(this);
b4.add(Box.createHorizontalStrut(10));
b4.add(btnDelete=new JButton(“Xóa”));btnDelete.addActionListener(this);
b4.add(Box.createHorizontalStrut(10));
b4.add(btnExit=new JButton(“Thoát”));btnExit.addActionListener(this);
}

@Override
public void actionPerformed(ActionEvent e) {
Object o=e.getSource();
if(o.equals(btnExit)){
UpdateDatabase();
System.exit(1);
}
if(o.equals(btnAdd)) {
if(btnAdd.getText().equals(“Thêm”)) {
LockText(false);
btnAdd.setText(“Hủy bỏ”);
btnSave.setEnabled(true);
btnUpdate.setEnabled(false);
btnDelete.setEnabled(false);
}
else {
LockText(true);
btnAdd.setText(“Thêm”);
btnSave.setEnabled(false);
btnUpdate.setEnabled(true);
btnDelete.setEnabled(true);
}
}
else if(o.equals(btnSave)) {
if(btnAdd.isEnabled()) //Nút lưu của nút thêm
{
try {
String id=tfID.getText();
String name=tfName.getText();
if(id.trim().equals(“”)||name.trim().equals(“”)) {
JOptionPane.showMessageDialog(null, “Không cho rỗng”);
return;
}
double price=Double.parseDouble(tfPrice.getText());
Product p=new Product(id,name,price);
String []row= {id,name,price+””};
dsHang.ThemHang(p);
dtm.addRow(row);
}catch (Exception ex) {
JOptionPane.showMessageDialog(null, “Dữ liệu bị lỗi rồi\n” +
“”+ex.getMessage());
}
}
else {//nút lưu của nút sửa

}
}
}
/*** Nạp dữ liệu lúc chương trình khởi động     */
void LoadDatabase() {
dsHang=new ListProducts();//khởi động danh sách
try {
File f=new File(“database.txt”);
if(!f.exists()) f.createNewFile();
//đọc danh mục hàng
Scanner input=new Scanner(new FileInputStream(f));
while(input.hasNextLine()) {
String line=input.nextLine();
if(line.trim()!=””) {
String items[]=line.split(“;”);
//tạo 1 mặt hàng
Product p=new Product();
p.setProductID(items[0]);
p.setProductName(items[1]);
p.setPrice(Double.parseDouble(items[2]));
//đưa vào danh mục
dsHang.ThemHang(p);
dtm.addRow(items);
LockText(true);
btnAdd.setText(“Thêm”);
btnSave.setEnabled(false);
btnUpdate.setEnabled(true);

btnDelete.setEnabled(true);
}
}
input.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//Cập nhật dữ liệu xuống databse khi thoát ứng dụng
void UpdateDatabase() {
try {
PrintWriter out
=new PrintWriter(
new FileOutputStream(“database.txt”),true);
for (int i = 0; i < dsHang.Count(); i++) {
Product p=dsHang.GetProduct(i);
out.println(p);
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, “Không lưu xuống db được\n”+e.toString());
}
}
//Khóa textBox
private void LockText(boolean state) {
tfID.setEditable(!state);
tfName.setEditable(!state);
tfPrice.setEditable(!state);
}

//hàm main
public static void main(String[] args) {
new QuanLyHH_GUI().setVisible(true);
}
}

Trong chương trình này, tôi chỉ hiện thực code cho nút Thêm và nút Lưu phần thêm mới. các thành phần còn lại chúng ta tự phát triển.

Hình ảnh minh họa
TextFileDB

bạn có thể dùng chuột chọn mẫu tin -> dữ liệu sẽ hiển thị lên TextFeld.

Phiên bản Execuable Jar file bạn có thể download tại đây để chạy thử.

Chúc thành công!

18 Responses to “Sử dụng text file để lưu trữ dữ liệu dạng CSDL”

  1. oh,để đọc bài bạn cái, mình đang làm cái chương trình tra cứu các vị trí máy ATM trên mobile. thanks

  2. Đăng Tuyền said

    thầy cho em hỏi là em có 2 file txt theo định dạng:

    file quequan.txt là Tên tỉnh; Mã tỉnh ví dụ: Ha Noi; 1

    file thisinh.txt là Mã; Tên; Mã quê quán; Ngày sinh; Giới tính; Toán; Lý; Hoá

    Ví dụ:
    10001; pham dang tuyen; 1; 23/10/1989; true; 7; 7; 7

    Đây cũng là các thuộc tính của 2 object QueQuan và ThiSinh .Bây giờ em muốn hiển thị trên table là Tên tỉnh thay cho Mã tỉnh bằng cách tham chiếu Mã quê quán đến đối tượng QueQuan và khi ta sửa đổi thông tin trên giao diện ở Tên tỉnh thì khi lưu lại vào file thisinh.txt phần Mã quê quán tương ứng cũng thay đổi thì làm thế nào ạ. Mong tin thầy!

  3. quangtrung said

    xin hoi thay khi em chay bai nay thay sau khi thoát thì database ko luư lại thông tin tep tin đatabase.txt trở lại o byte nguên nhân là tại sao hả thầy

  4. quangtrung said

    oh em da sua lai dc roi nhung tep excuted.jar cua em ko chay dc giong cua thay mà buộc phải chạy trên net bean thay a.em tu hoc mon nay va dang mò mẫm nên ko biết sử dụng netbean thành thạo thầy có thể cho em link dowload tài liệu dc ko ạ.
    viec thu 2 em thay trong netbean có thuộc tính table có thể kéo thả trên form dc mà ko biết in dữ liệu vào đó nó trông giống vb nhưng lại ko có chỗ nào link đến csdl

  5. quangtrung said

    bai mau cua thay giao chay van cho phep nhap hai hang hoa co cung mahang nhu vay la trong phan hashcode
    xu li ko dung thay co the debug lai cho em ko

  6. letinh1000 said

    Chào thầy em có dùng Jtable kéo thả trong NeatBean. và dùng DefaultTableMode để addrow() vào.
    đã hiển thị được nhưng rất chậm….

    /*
    * QuanLyHocVienView.java
    */

    package quanlyhocvien;

    import BLL.DSHV;
    import DLL.DLL;
    import DTO.HocVien;
    import org.jdesktop.application.Action;
    import org.jdesktop.application.ResourceMap;
    import org.jdesktop.application.SingleFrameApplication;
    import org.jdesktop.application.FrameView;
    import org.jdesktop.application.TaskMonitor;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.PrintWriter;
    import java.util.Scanner;
    import javax.swing.Timer;
    import javax.swing.Icon;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.table.DefaultTableModel;

    /**
    * The application's main frame.
    */
    public class QuanLyHocVienView extends FrameView {

    public QuanLyHocVienView(SingleFrameApplication app) {
    super(app);

    initComponents();
    LoadData();

    getFrame().setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    getFrame().addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
    UpdataData();
    System.exit(1);
    }
    });

    // status bar initialization - message timeout, idle icon and busy animation, etc
    ResourceMap resourceMap = getResourceMap();
    int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
    messageTimer = new Timer(messageTimeout, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    statusMessageLabel.setText("");
    }
    });
    messageTimer.setRepeats(false);
    int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
    for (int i = 0; i < busyIcons.length; i++) {
    busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
    }
    busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
    statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
    }
    });
    idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
    statusAnimationLabel.setIcon(idleIcon);
    progressBar.setVisible(false);

    // connecting action tasks to status bar via TaskMonitor
    TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
    taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
    public void propertyChange(java.beans.PropertyChangeEvent evt) {
    String propertyName = evt.getPropertyName();
    if ("started".equals(propertyName)) {
    if (!busyIconTimer.isRunning()) {
    statusAnimationLabel.setIcon(busyIcons[0]);
    busyIconIndex = 0;
    busyIconTimer.start();
    }
    progressBar.setVisible(true);
    progressBar.setIndeterminate(true);
    } else if ("done".equals(propertyName)) {
    busyIconTimer.stop();
    statusAnimationLabel.setIcon(idleIcon);
    progressBar.setVisible(false);
    progressBar.setValue(0);
    } else if ("message".equals(propertyName)) {
    String text = (String)(evt.getNewValue());
    statusMessageLabel.setText((text == null) ? "" : text);
    messageTimer.restart();
    } else if ("progress".equals(propertyName)) {
    int value = (Integer)(evt.getNewValue());
    progressBar.setVisible(true);
    progressBar.setIndeterminate(false);
    progressBar.setValue(value);
    }
    }
    });
    }

    @Action
    public void showAboutBox() {
    if (aboutBox == null) {
    JFrame mainFrame = QuanLyHocVienApp.getApplication().getMainFrame();
    aboutBox = new QuanLyHocVienAboutBox(mainFrame);
    aboutBox.setLocationRelativeTo(mainFrame);
    }
    QuanLyHocVienApp.getApplication().show(aboutBox);
    }

    public void LoadData(){
    dtm=(DefaultTableModel)this.tblDanhSach.getModel();

    try{
    File f=new File(fileName.getFilename());
    if(!f.exists()) f.createNewFile();
    FileInputStream fis=new FileInputStream(f);
    Scanner sc=new Scanner(fis);
    while(sc.hasNextLine()){
    String line=sc.nextLine();
    line.trim();
    String[] items=line.split(";");
    hv.setMaHocVien(items[0]);
    hv.setHoTen(items[1]);
    hv.setNamSinh(Integer.valueOf(items[2]));
    hv.setDiemKT1(Float.valueOf(items[3]));
    hv.setDiemKT2(Float.valueOf(items[4]));
    hv.setDiemThi(Float.valueOf(items[5]));
    dshv.themHocVien(hv);
    dtm.addRow(items);
    }
    sc.close();
    fis.close();

    }catch(Exception e){
    e.printStackTrace();
    }
    }
    //cập nhật dữ liệu
    public void UpdataData(){
    try{
    FileOutputStream fos=new FileOutputStream(fileName.getFilename());
    PrintWriter out=new PrintWriter(fos,true);
    for(HocVien hv1:dshv.getHocViens())
    out.println(hv1.toString());
    out.close();
    fos.close();
    }catch(Exception e){
    e.printStackTrace();
    }

    }

    /** This method is called from within the constructor to
    * initialize the form.
    * WARNING: Do NOT modify this code. The content of this method is
    * always regenerated by the Form Editor.
    */
    @SuppressWarnings("unchecked")
    //
    private void initComponents() {

    mainPanel = new javax.swing.JPanel();
    jPanel1 = new javax.swing.JPanel();
    jLabel1 = new javax.swing.JLabel();
    jLabel2 = new javax.swing.JLabel();
    jLabel3 = new javax.swing.JLabel();
    txtMaHocVien = new javax.swing.JTextField();
    txtHoTen = new javax.swing.JTextField();
    txtNamSinh = new javax.swing.JTextField();
    jPanel2 = new javax.swing.JPanel();
    jLabel4 = new javax.swing.JLabel();
    jLabel5 = new javax.swing.JLabel();
    jLabel6 = new javax.swing.JLabel();
    txtDiemKiemTra1 = new javax.swing.JTextField();
    txtDiemKiemTra2 = new javax.swing.JTextField();
    txtDiemKiemTra3 = new javax.swing.JTextField();
    jButton1 = new javax.swing.JButton();
    jPanel3 = new javax.swing.JPanel();
    jScrollPane1 = new javax.swing.JScrollPane();
    tblDanhSach = new javax.swing.JTable();
    jButton2 = new javax.swing.JButton();
    jButton3 = new javax.swing.JButton();
    jButton4 = new javax.swing.JButton();
    menuBar = new javax.swing.JMenuBar();
    javax.swing.JMenu fileMenu = new javax.swing.JMenu();
    javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
    javax.swing.JMenu helpMenu = new javax.swing.JMenu();
    javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
    statusPanel = new javax.swing.JPanel();
    statusPanelSeparator = new javax.swing.JSeparator();
    statusMessageLabel = new javax.swing.JLabel();
    statusAnimationLabel = new javax.swing.JLabel();
    progressBar = new javax.swing.JProgressBar();

    mainPanel.setName("mainPanel"); // NOI18N

    org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(quanlyhocvien.QuanLyHocVienApp.class).getContext().getResourceMap(QuanLyHocVienView.class);
    jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("jPanel1.border.title"))); // NOI18N
    jPanel1.setName("jPanel1"); // NOI18N

    jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
    jLabel1.setName("jLabel1"); // NOI18N

    jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
    jLabel2.setName("jLabel2"); // NOI18N

    jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
    jLabel3.setName("jLabel3"); // NOI18N

    txtMaHocVien.setText(resourceMap.getString("txtMaHocVien.text")); // NOI18N
    txtMaHocVien.setName("txtMaHocVien"); // NOI18N

    txtHoTen.setName("txtHoTen"); // NOI18N

    txtNamSinh.setName("txtNamSinh"); // NOI18N

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
    jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(jPanel1Layout.createSequentialGroup()
    .addContainerGap()
    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(jPanel1Layout.createSequentialGroup()
    .addComponent(jLabel3)
    .addGap(18, 18, 18)
    .addComponent(txtNamSinh, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addGroup(jPanel1Layout.createSequentialGroup()
    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jLabel1)
    .addComponent(jLabel2))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(txtHoTen, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addComponent(txtMaHocVien, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE))))
    .addContainerGap(28, Short.MAX_VALUE))
    );
    jPanel1Layout.setVerticalGroup(
    jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(jPanel1Layout.createSequentialGroup()
    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel1)
    .addComponent(txtMaHocVien, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel2)
    .addComponent(txtHoTen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel3)
    .addComponent(txtNamSinh, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addContainerGap(26, Short.MAX_VALUE))
    );

    jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("jPanel2.border.title"))); // NOI18N
    jPanel2.setName("jPanel2"); // NOI18N

    jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
    jLabel4.setName("jLabel4"); // NOI18N

    jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
    jLabel5.setName("jLabel5"); // NOI18N

    jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
    jLabel6.setName("jLabel6"); // NOI18N

    txtDiemKiemTra1.setText(resourceMap.getString("txtDiemKiemTra1.text")); // NOI18N
    txtDiemKiemTra1.setName("txtDiemKiemTra1"); // NOI18N

    txtDiemKiemTra2.setName("txtDiemKiemTra2"); // NOI18N

    txtDiemKiemTra3.setName("txtDiemKiemTra3"); // NOI18N

    javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
    jPanel2.setLayout(jPanel2Layout);
    jPanel2Layout.setHorizontalGroup(
    jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(jPanel2Layout.createSequentialGroup()
    .addContainerGap()
    .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(jPanel2Layout.createSequentialGroup()
    .addComponent(jLabel4)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addComponent(txtDiemKiemTra1, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addGroup(jPanel2Layout.createSequentialGroup()
    .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jLabel5)
    .addComponent(jLabel6))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(txtDiemKiemTra3, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addComponent(txtDiemKiemTra2, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE))))
    .addContainerGap(113, Short.MAX_VALUE))
    );
    jPanel2Layout.setVerticalGroup(
    jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(jPanel2Layout.createSequentialGroup()
    .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel4)
    .addComponent(txtDiemKiemTra1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel5)
    .addComponent(txtDiemKiemTra2, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jLabel6)
    .addComponent(txtDiemKiemTra3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addContainerGap(26, Short.MAX_VALUE))
    );

    jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N
    jButton1.setName("jButton1"); // NOI18N

    jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("jPanel3.border.title"))); // NOI18N
    jPanel3.setName("jPanel3"); // NOI18N

    jScrollPane1.setName("jScrollPane1"); // NOI18N

    tblDanhSach.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {

    },
    new String [] {
    "Mã", "Họ tên", "Năm sinh", "Điểm KT1", "Điểm KT2", "Điểm CK", "Điểm TB", "Xếp loại"
    }
    ) {
    Class[] types = new Class [] {
    java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Float.class, java.lang.Float.class, java.lang.Float.class, java.lang.Float.class, java.lang.String.class
    };

    public Class getColumnClass(int columnIndex) {
    return types [columnIndex];
    }
    });
    tblDanhSach.setName("tblDanhSach"); // NOI18N
    jScrollPane1.setViewportView(tblDanhSach);
    tblDanhSach.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("tblDanhSach.columnModel.title0")); // NOI18N
    tblDanhSach.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("tblDanhSach.columnModel.title1")); // NOI18N
    tblDanhSach.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("tblDanhSach.columnModel.title2")); // NOI18N
    tblDanhSach.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("tblDanhSach.columnModel.title3")); // NOI18N
    tblDanhSach.getColumnModel().getColumn(4).setResizable(false);
    tblDanhSach.getColumnModel().getColumn(4).setHeaderValue(resourceMap.getString("tblDanhSach.columnModel.title4")); // NOI18N
    tblDanhSach.getColumnModel().getColumn(5).setHeaderValue(resourceMap.getString("tblDanhSach.columnModel.title5")); // NOI18N
    tblDanhSach.getColumnModel().getColumn(6).setHeaderValue(resourceMap.getString("tblDanhSach.columnModel.title6")); // NOI18N
    tblDanhSach.getColumnModel().getColumn(7).setResizable(false);
    tblDanhSach.getColumnModel().getColumn(7).setHeaderValue(resourceMap.getString("tblDanhSach.columnModel.title7")); // NOI18N

    javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
    jPanel3.setLayout(jPanel3Layout);
    jPanel3Layout.setHorizontalGroup(
    jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 560, Short.MAX_VALUE)
    );
    jPanel3Layout.setVerticalGroup(
    jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 265, javax.swing.GroupLayout.PREFERRED_SIZE)
    );

    jButton2.setText(resourceMap.getString("jButton2.text")); // NOI18N
    jButton2.setName("jButton2"); // NOI18N

    jButton3.setText(resourceMap.getString("jButton3.text")); // NOI18N
    jButton3.setName("jButton3"); // NOI18N

    jButton4.setText(resourceMap.getString("jButton4.text")); // NOI18N
    jButton4.setName("jButton4"); // NOI18N

    javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
    mainPanel.setLayout(mainPanelLayout);
    mainPanelLayout.setHorizontalGroup(
    mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(mainPanelLayout.createSequentialGroup()
    .addContainerGap()
    .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addGroup(mainPanelLayout.createSequentialGroup()
    .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    .addGroup(mainPanelLayout.createSequentialGroup()
    .addComponent(jButton1)
    .addGap(18, 18, 18)
    .addComponent(jButton2)
    .addGap(18, 18, 18)
    .addComponent(jButton3)
    .addGap(18, 18, 18)
    .addComponent(jButton4)))
    .addContainerGap())
    );
    mainPanelLayout.setVerticalGroup(
    mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(mainPanelLayout.createSequentialGroup()
    .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 19, Short.MAX_VALUE)
    .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(jButton1)
    .addComponent(jButton2)
    .addComponent(jButton3)
    .addComponent(jButton4))
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );

    menuBar.setName("menuBar"); // NOI18N

    fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
    fileMenu.setName("fileMenu"); // NOI18N

    javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(quanlyhocvien.QuanLyHocVienApp.class).getContext().getActionMap(QuanLyHocVienView.class, this);
    exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
    exitMenuItem.setName("exitMenuItem"); // NOI18N
    fileMenu.add(exitMenuItem);

    menuBar.add(fileMenu);

    helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
    helpMenu.setName("helpMenu"); // NOI18N

    aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
    aboutMenuItem.setName("aboutMenuItem"); // NOI18N
    helpMenu.add(aboutMenuItem);

    menuBar.add(helpMenu);

    statusPanel.setName("statusPanel"); // NOI18N

    statusMessageLabel.setName("statusMessageLabel"); // NOI18N

    statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

    progressBar.setName("progressBar"); // NOI18N

    javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
    statusPanel.setLayout(statusPanelLayout);
    statusPanelLayout.setHorizontalGroup(
    statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 598, Short.MAX_VALUE)
    .addGroup(statusPanelLayout.createSequentialGroup()
    .addContainerGap()
    .addComponent(statusMessageLabel)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 428, Short.MAX_VALUE)
    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addComponent(statusAnimationLabel)
    .addContainerGap())
    );
    statusPanelLayout.setVerticalGroup(
    statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(statusPanelLayout.createSequentialGroup()
    .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
    .addComponent(statusMessageLabel)
    .addComponent(statusAnimationLabel)
    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addGap(3, 3, 3))
    );

    setComponent(mainPanel);
    setMenuBar(menuBar);
    setStatusBar(statusPanel);
    }//

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel mainPanel;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JProgressBar progressBar;
    private javax.swing.JLabel statusAnimationLabel;
    private javax.swing.JLabel statusMessageLabel;
    private javax.swing.JPanel statusPanel;
    private javax.swing.JSeparator statusPanelSeparator;
    private javax.swing.JTable tblDanhSach;
    private javax.swing.JTextField txtDiemKiemTra1;
    private javax.swing.JTextField txtDiemKiemTra2;
    private javax.swing.JTextField txtDiemKiemTra3;
    private javax.swing.JTextField txtHoTen;
    private javax.swing.JTextField txtMaHocVien;
    private javax.swing.JTextField txtNamSinh;
    // End of variables declaration

    private final Timer messageTimer;
    private final Timer busyIconTimer;
    private final Icon idleIcon;
    private final Icon[] busyIcons = new Icon[15];
    private int busyIconIndex = 0;

    private JDialog aboutBox;

    private DSHV dshv=new DSHV();
    private HocVien hv=new HocVien();
    private DLL fileName=new DLL();
    private DefaultTableModel dtm;
    }

  7. letinh1000 said

    Em dùng hàm UpdateData bên dưới để ghi danh sách tên ra file nhưng sao nó chỉ lấy tên của người cuối cùng…giúp em với cảm ơn

    public void UpdateData(){
    try{
    FileOutputStream fos=new FileOutputStream(fileName.getFilename());
    PrintWriter out=new PrintWriter(fos,true);
    for(HocVien hv1:dshv.getHocViens())
    out.println(hv1.toString());
    out.close();
    fos.close();
    }catch(Exception e){
    e.printStackTrace();
    }

  8. vovanhai said

    code bằng tay đi. nhìn code=>choáng!

  9. Lê Bá Ân said

    Em định dùng file txt để làm database cho 1 tool viết bằng J2ME thì không biết file txt này có thể lưu được bao nhiêu dòng? bởi database của em khá lớn khoảng 4000-5000 dòng.
    Cảm ơn thầy.

  10. haolongvt said

    Bài này nếu làm mảng thì sẽ gọn hơn rất nhiều đúng không thầy :-/

  11. TANZAN said

    Bài rất hay nhưng mình có một câu hỏi nhờ mọi người giúp :Mình muốn lưu giá tri trong ô JtextFiled vào một biến toàn cục có nghĩa là có thể lấy giá trị đó ở một Form khác đại khái câu lệnh như sau:
    Public static String Name=JTextFiled.gettext();
    tại sao nó báo nỗi là JTextFile ko thể dùng static mong mọi người giúp mình với thank nhiều.

  12. ttn112 said

    thầy ơi ý em là đưa cả 1 bảng vào Jcombobox ạ?

  13. Thảo said

    Chào thầy, thầy cho em hỏi ý nghĩa của lệnh ” setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); “. Tại sao ta cần dùng lệnh này, nhiệm vụ của nó là gì a? Em search Google thì nhận được là “If all you want to write your own custom event handler, you need to use this, as well as setting up an event “. Tức là lệnh này dùng khi mình muốn viết 1 sự kiện riêng theo ý mình có đúng không thầy? Em vẫn chưa rõ lắm.

  14. Võ Văn Hải said

    Nghĩa là khi em nhấn nút X (đóng form) nó không làm gì cả.
    Trong jframe, em addWindowListener và em phải implement windowClosing method để xử lý cho việc đóng cửa sổ.
    Ví dụ:

    this.addWindowListener(new WindowAdapter(){
    			public void windowClosing(WindowEvent we){
    				Closed();//xử lý đóng form của em ở đây
    			}
    

    });

  15. phong said

    cho e hỏi cách xóa 1row với.thêm sửa được mà không xóa được 😦 tks

  16. Phạm Xuân said

    thầy cho em hỏi là em có 2 file txt theo định dạng:

    file quequan.txt là Tên tỉnh; Mã tỉnh ví dụ: Ha Noi; 1

    file thisinh.txt là Mã; Tên; Mã quê quán; Ngày sinh; Giới tính; Toán; Lý; Hoá

    Ví dụ:
    10001; pham dang tuyen; 1; 23/10/1989; true; 7; 7; 7

    Đây cũng là các thuộc tính của 2 object QueQuan và ThiSinh .Bây giờ em muốn hiển thị trên table là Tên tỉnh thay cho Mã tỉnh bằng cách tham chiếu Mã quê quán đến đối tượng QueQuan và khi ta sửa đổi thông tin trên giao diện ở Tên tỉnh thì khi lưu lại vào file thisinh.txt phần Mã quê quán tương ứng cũng thay đổi thì làm thế nào ạ. Mong tin thầy!

  17. Võ Văn Hải said

    em đọc file quequan.txt rồi xây dựng 1 HashMap cho nó. khi đọc file thisinh,txt, phân tích đến mã quê quán thị lấy trong hashtable trên ra theo key đọc được rồi điền vào.

  18. tien said

    thay oi cho em hoi, khi nao moi can load database sau khi minh da tao 1 listproduct

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.