Tổng kết Hướng đối tượng – Lập trình Giao diện với Java

Trong bài viết này kynangcntt.info sẽ hướng dẫn các bạn giải quyết bài tập.

 

YÊU CẦU:

1. Định nghĩa IMedia với phương thức tính tiền thuê trả về số tiền thuê = số ngày thuê * 5000

2. Xây dựng lớp MultiMediaItem với các thuộc tính và phương thức như hình, hiện thức giao diện IMedia.

3 Định nghĩa các lớp CD và DVD kế thừa lớp MultiMediaItem với các thuộc tính và phương thức như hình.

4. Định nghĩa lớp QuanLyThueDia sử dụng JTable như hình trên cho phép thực hiện các chức năng sau:

a. Thêm mới việc thuê đĩa

b. Cập nhật thông tin thuê đĩa

c. Xóa một đĩa trong danh sách các đĩa được thuê.

d. Thực hiện tìm kiếm gần đúng dựa trên tiêu đề và nhãn đĩa được chỉ định

e. Tính tổng tiền thu được từ việc cho thuê đĩa có tiêu đề được chỉ định.

BÀI GIẢI:

Trước hết các bạn tạo Interface IMedia như sau:

package khamphacntt.com.vn;

/**
 *
 * @author khamphacntt.com.vn
 */
public interface IMedia {
    double tinhTienThue();
    final double DON_GIA = 5000;
}

Tiếp đến các bạn định nghĩa lớp MultiMediaItem hiện thực interface IMedia:

package khamphacntt.com.vn;

import java.util.Date;

/**
 *
 * @author khamphacntt.com.vn
 */
public class MultiMediaItem implements IMedia{
    private String tieuDe,ngonNgu;
    private Date ngayThue;

    public MultiMediaItem() {
    }

    public MultiMediaItem(String tieuDe, String ngonNgu, Date ngayThue) {
        this.tieuDe = tieuDe;
        this.ngonNgu = ngonNgu;
        this.ngayThue = ngayThue;
    }

    public String getTieuDe() {
        return tieuDe;
    }

    public void setTieuDe(String tieuDe) {
        this.tieuDe = tieuDe;
    }

    public String getNgonNgu() {
        return ngonNgu;
    }

    public void setNgonNgu(String ngonNgu) {
        this.ngonNgu = ngonNgu;
    }

    public Date getNgayThue() {
        return ngayThue;
    }

    public void setNgayThue(Date ngayThue) {
        this.ngayThue = ngayThue;
    }
    
    private long tinhSoNgayThue(){
        return (new Date().getTime() - ngayThue.getTime())/(24*60*60*1000) + 1;
    }

    @Override
    public double tinhTienThue() {
        return tinhSoNgayThue() * DON_GIA;
    }
    
}

Tiếp tục định nghĩa lớp CD kế thừa lớp MultiMediaItem:

package khamphacntt.com.vn;

import java.util.Date;

/**
 *
 * @author khamphacntt.com.vn
 */
public class CD extends MultiMediaItem{
    private double thoiGian;

    public CD() {
    }

    public CD(double thoiGian, String tieuDe, String ngonNgu, Date ngayThue) {
        super(tieuDe, ngonNgu, ngayThue);
        this.thoiGian = thoiGian;
    }

    public double getThoiGian() {
        return thoiGian;
    }

    public void setThoiGian(double thoiGian) {
        this.thoiGian = thoiGian;
    }
        
}

Tương tự như vậy chúng ta tiếp tục định nghĩa lớp DVD kế thừa lớp MultiMediaItem:

package khamphacntt.com.vn;

import java.util.Date;

/**
 *
 * @author khamphacntt.com.vn
 */
public class DVD extends MultiMediaItem{
    private String daoDien;

    public DVD() {
    }

    public DVD(String daoDien, String tieuDe, String ngonNgu, Date ngayThue) {
        super(tieuDe, ngonNgu, ngayThue);
        this.daoDien = daoDien;
    }

    public String getDaoDien() {
        return daoDien;
    }

    public void setDaoDien(String daoDien) {
        this.daoDien = daoDien;
    }
        
}

Cuối cùng chúng ta định nghĩa lớp QuanLyThueDia kế thừa từ JFrame như sau:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package khamphacntt.com.vn;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author khamphacntt.com.vn
 */
public class QuanLyThueDia extends javax.swing.JFrame {
    private DefaultTableModel dtmBangDia;
    private ArrayList<MultiMediaItem> bangDias;
    private int selectedIndex = -1;
    
    /**
     * Creates new form QuanLyThueDia
     */
    public QuanLyThueDia() {
        initComponents();
        myInit();
    }

    /**
     * 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")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        cboLoaiDia = new javax.swing.JComboBox();
        jLabel3 = new javax.swing.JLabel();
        txtTieuDe = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        cboNgonNgu = new javax.swing.JComboBox();
        jLabel5 = new javax.swing.JLabel();
        txtNgayThue = new javax.swing.JFormattedTextField();
        jLabel6 = new javax.swing.JLabel();
        txtThoiGian = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        txtDaoDien = new javax.swing.JTextField();
        jLabel8 = new javax.swing.JLabel();
        lblTongTien = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        tblBangDia = new javax.swing.JTable();
        jPanel1 = new javax.swing.JPanel();
        btnTongTien = new javax.swing.JButton();
        btnTimKiem = new javax.swing.JButton();
        btnCapNhat = new javax.swing.JButton();
        btnThem = new javax.swing.JButton();
        btnXoa = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
        jLabel1.setForeground(new java.awt.Color(255, 0, 0));
        jLabel1.setText("QUẢN LÝ THUÊ ĐĨA");

        jLabel2.setText("Loại đĩa:");

        cboLoaiDia.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "CD", "DVD" }));
        cboLoaiDia.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cboLoaiDiaItemStateChanged(evt);
            }
        });

        jLabel3.setText("Tiêu đề:");

        jLabel4.setText("Ngôn ngữ:");

        cboNgonNgu.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Việt Nam", "Hàn Quốc", "Nhật Bản", "Anh", "Thái", "Đức", "Pháp" }));

        jLabel5.setText("Ngày thuê:");

        jLabel6.setText("Thời gian:");

        jLabel7.setText("Đạo diễn:");

        jLabel8.setText("Tổng tiền:");

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

            },
            new String [] {
                "STT", "Loại đĩa", "Tiêu đề", "Ngôn ngữ", "Ngày thuê", "Thời gian", "Đạo diễn", "Tiền thuê"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tblBangDia.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tblBangDiaMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(tblBangDia);

        btnTongTien.setText("Tổng tiền");
        btnTongTien.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTongTienActionPerformed(evt);
            }
        });

        btnTimKiem.setText("Tìm kiếm");
        btnTimKiem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTimKiemActionPerformed(evt);
            }
        });

        btnCapNhat.setText("Cập nhật");
        btnCapNhat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCapNhatActionPerformed(evt);
            }
        });

        btnThem.setText("Thêm");
        btnThem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnThemActionPerformed(evt);
            }
        });

        btnXoa.setText("Xóa");
        btnXoa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnXoaActionPerformed(evt);
            }
        });

        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()
                .addComponent(btnThem, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnCapNhat, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btnXoa, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnTimKiem, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnTongTien, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnThem)
                    .addComponent(btnCapNhat)
                    .addComponent(btnTimKiem)
                    .addComponent(btnXoa)
                    .addComponent(btnTongTien))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(383, 383, 383)
                        .addComponent(jLabel1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(37, 37, 37)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel3)
                            .addComponent(jLabel2)
                            .addComponent(jLabel4)
                            .addComponent(jLabel5))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtNgayThue, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(cboNgonNgu, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jLabel8))
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(txtTieuDe, javax.swing.GroupLayout.PREFERRED_SIZE, 280, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(jLabel7))
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(cboLoaiDia, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(266, 266, 266)
                                        .addComponent(jLabel6)))
                                .addGap(18, 18, 18)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(txtThoiGian, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(txtDaoDien, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE)
                                    .addComponent(lblTongTien, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(216, 216, 216)
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(cboLoaiDia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6)
                    .addComponent(txtThoiGian, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(txtTieuDe, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel7)
                    .addComponent(txtDaoDien, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(cboNgonNgu, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel8)
                    .addComponent(lblTongTien))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel5)
                    .addComponent(txtNgayThue, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    private void cboLoaiDiaItemStateChanged(java.awt.event.ItemEvent evt) {                                            
        // TODO add your handling code here:
        if (cboLoaiDia.getSelectedIndex()==0) {
            txtThoiGian.setEnabled(true);
            txtDaoDien.setEnabled(false);
        } else {
            txtThoiGian.setEnabled(false);
            txtDaoDien.setEnabled(true);
        }
    }                                           

    private CD taoCD(){
        return new CD(Double.parseDouble(txtThoiGian.getText().trim()), txtTieuDe.getText().trim(), cboNgonNgu.getSelectedItem().toString(), convertStringToDate(txtNgayThue.getText().trim()));
    }
    
    private DVD taoDVD(){
        return new DVD(txtDaoDien.getText().trim(), txtTieuDe.getText().trim(), cboNgonNgu.getSelectedItem().toString(), convertStringToDate(txtNgayThue.getText().trim()));
    }
    
    private void btnThemActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        switch (cboLoaiDia.getSelectedIndex()) {
            case 0:
                bangDias.add(taoCD());
                break;
            case 1:
                bangDias.add(taoDVD());
                break;
        }
        loadDataIntoTable();
    }                                       

    private void setAllComponent(String loaiDia,String tieuDe,String ngonNgu,String ngayThue,String thoiGian,String daoDien,String tongTien){
        //Thiết lập cho cboLoaiDia
        if (loaiDia.equalsIgnoreCase("dvd")) {
            cboLoaiDia.setSelectedIndex(1);
        }else{
            cboLoaiDia.setSelectedIndex(0);
        }
        
        txtTieuDe.setText(tieuDe);
        
        //Thiết lập cho cboNgonNgu
        for (int i = 0; i < cboNgonNgu.getItemCount(); i++) {
            if (ngonNgu.equalsIgnoreCase(cboNgonNgu.getItemAt(i).toString())) {
                cboNgonNgu.setSelectedIndex(i);
            }
        }
        
        txtNgayThue.setText(ngayThue);
        
        txtThoiGian.setText(thoiGian);
        txtDaoDien.setText(daoDien);
        lblTongTien.setText(tongTien);
        
    }
    
    private String getValueInTable(int columnIndex){
        return dtmBangDia.getValueAt(selectedIndex, columnIndex).toString();
    }
    
    private void tblBangDiaMouseClicked(java.awt.event.MouseEvent evt) {                                        
        // TODO add your handling code here:
        selectedIndex = tblBangDia.getSelectedRow();
        
        setAllComponent(
                getValueInTable(1),
                getValueInTable(2),
                getValueInTable(3),
                getValueInTable(4),
                getValueInTable(5),
                getValueInTable(6),
                ""
        );
    }                                       

    private void btnCapNhatActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        if (selectedIndex!=-1) {
            if (cboLoaiDia.getSelectedIndex()==0) {
                bangDias.set(selectedIndex, taoCD());
            } else {
                bangDias.set(selectedIndex, taoDVD());
            }
            selectedIndex = -1;
            loadDataIntoTable();
        }
        
    }                                          

    private void btnXoaActionPerformed(java.awt.event.ActionEvent evt) {                                       
        // TODO add your handling code here:
        if (selectedIndex!=-1) {
            bangDias.remove(selectedIndex);
            selectedIndex = -1;
            loadDataIntoTable();
        }
        
    }                                      
    private void timTheoTieuDeCD(String tieuDeSearch){
        clearOldData();
        int stt = 0;
        String loaiDia,tieuDe,ngonNgu,ngayThue,thoiGian,daoDien,tienThue;
        
        for (MultiMediaItem item : bangDias) {
            if ((item instanceof CD) && item.getTieuDe().toLowerCase().contains(tieuDeSearch.toLowerCase()) ) {
                stt++;
                tieuDe = item.getTieuDe();
                ngonNgu = item.getNgonNgu();
                ngayThue = convertDateToString(item.getNgayThue());
                tienThue = Double.toString(item.tinhTienThue());
                CD cd = (CD) item;
                loaiDia = "CD";
                daoDien = "";
                thoiGian = Double.toString(cd.getThoiGian());
                
                dtmBangDia.addRow(new Object[]{
                    Integer.toString(stt),loaiDia,tieuDe,ngonNgu,ngayThue,thoiGian,daoDien,tienThue
                });
            }
        }
    }
    private void btnTimKiemActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        switch (cboLoaiDia.getSelectedIndex()) {
            case 0:
                timTheoTieuDeCD(txtTieuDe.getText().trim());
                break;
            case 1:
                timTheoTieuDeDVD(txtTieuDe.getText().trim());
                break;
        }
    }                                          

    private void btnTongTienActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
        double tongTien = 0;
        for (MultiMediaItem item : bangDias) {
            if (item.getTieuDe().equalsIgnoreCase(txtTieuDe.getText().trim())) {
                tongTien += item.tinhTienThue();
            }
        }
        lblTongTien.setText(Double.toString(tongTien));
    }                                           

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(QuanLyThueDia.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(QuanLyThueDia.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(QuanLyThueDia.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(QuanLyThueDia.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new QuanLyThueDia().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btnCapNhat;
    private javax.swing.JButton btnThem;
    private javax.swing.JButton btnTimKiem;
    private javax.swing.JButton btnTongTien;
    private javax.swing.JButton btnXoa;
    private javax.swing.JComboBox cboLoaiDia;
    private javax.swing.JComboBox cboNgonNgu;
    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.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lblTongTien;
    private javax.swing.JTable tblBangDia;
    private javax.swing.JTextField txtDaoDien;
    private javax.swing.JFormattedTextField txtNgayThue;
    private javax.swing.JTextField txtThoiGian;
    private javax.swing.JTextField txtTieuDe;
    // End of variables declaration                   

    private void myInit() {
        dtmBangDia = (DefaultTableModel) tblBangDia.getModel();
        tblBangDia.setModel(dtmBangDia);
        
        bangDias = new ArrayList<>();
        
        formatInput();
        
        txtDaoDien.setEnabled(false);
    }

    private void formatInput() {
        try {
            MaskFormatter mf;
            
            txtNgayThue.setText("");
            mf = new MaskFormatter("##/##/####");
            mf.setPlaceholderCharacter('_');
            DefaultFormatterFactory factory = new DefaultFormatterFactory(mf);
            txtNgayThue.setFormatterFactory(factory);
        } catch (ParseException ex) {
            Logger.getLogger(QuanLyThueDia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private Date convertStringToDate(String ddMMyyyy) {
        try {
            return new SimpleDateFormat("dd/MM/yyyy").parse(ddMMyyyy);
        } catch (ParseException ex) {
            Logger.getLogger(QuanLyThueDia.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    private void loadDataIntoTable() {
        clearOldData();
        int stt = 0;
        String loaiDia,tieuDe,ngonNgu,ngayThue,thoiGian,daoDien,tienThue;
        
        for (MultiMediaItem item : bangDias) {
            stt++;
            tieuDe = item.getTieuDe();
            ngonNgu = item.getNgonNgu();
            ngayThue = convertDateToString(item.getNgayThue());
            tienThue = Double.toString(item.tinhTienThue());
            
            if (item instanceof CD) {
                CD cd = (CD) item;
                loaiDia = "CD";
                daoDien = "";
                thoiGian = Double.toString(cd.getThoiGian());                
            }else{
                DVD dvd = (DVD) item;
                loaiDia = "DVD";
                daoDien = dvd.getDaoDien();
                thoiGian = "";
                        
            }
            
            dtmBangDia.addRow(new Object[]{
                Integer.toString(stt),loaiDia,tieuDe,ngonNgu,ngayThue,thoiGian,daoDien,tienThue
            });
        }
    }   
    
    

    private void clearOldData() {
        while (tblBangDia.getRowCount()>0) {
            dtmBangDia.removeRow(0);
        }
    }

    private String convertDateToString(Date ngayThue) {
        return new SimpleDateFormat("dd/MM/yyyy").format(ngayThue);
    }

    private void timTheoTieuDeDVD(String tieuDeSearch) {
        clearOldData();
        int stt = 0;
        String loaiDia,tieuDe,ngonNgu,ngayThue,thoiGian,daoDien,tienThue;
        
        for (MultiMediaItem item : bangDias) {
            if ((item instanceof DVD) && 
                 item.getTieuDe().toLowerCase().contains(tieuDeSearch.toLowerCase()) ) {
                stt++;
                tieuDe = item.getTieuDe();
                ngonNgu = item.getNgonNgu();
                ngayThue = convertDateToString(item.getNgayThue());
                tienThue = Double.toString(item.tinhTienThue());
                DVD dvd = (DVD) item;
                loaiDia = "DVD";
                daoDien = dvd.getDaoDien();
                thoiGian = "";
                
                dtmBangDia.addRow(new Object[]{
                    Integer.toString(stt),loaiDia,tieuDe,ngonNgu,ngayThue,thoiGian,daoDien,tienThue
                });
            }
        }
    }
}