Về đóng gói file jar

Đúng rồi a. lúc e chạy file jar thì form main của e k lấy được dữ liệu nên nó hiện lỗi Null point exeption. Dưới đây là code nút button đăng nhập trên form login của em

Đây là chỗ e khai báo biến login

public class frmLogin extends javax.swing.JFrame {
    String Username = "", PassWord = "", TenNguoiDung = "";
    int manhanvien=0;
    boolean vaitro=true;
    boolean motadmin = true;
    TaiKhoanServices logsv = new TaiKhoanServices();
    ArrayList<Model.ModelTaiKhoan> ListLogin = null;
    public static frmLogin login;
    Connection cn = null;

    public frmLogin() {
        this.setTitle("Giao Diện Đăng Nhập");
        initComponents();
        login = this;
        cn = KetNoiSQL.ketnoi();
//      if (cn==null)
//          JOptionPane.showMessageDialog(this, "Chưa Kết nối đến DB");
//      else {
//          JoptionPane.showMessageDialog(thí, "Đã Kết nối đến DB");
//      }
        btnLogin.setMnemonic(KeyEvet.VK_ENTER);

        this.setResizable(false);
        this.setLocationRelativeTo(null);
}

Bạn nên đưa mã nguồn từng frmXXX có liên quan lên đây, thay vì chụp hình. Vi phạm quy định diễn đàn rồi.

Theo mô tả của bạn thì frmLogin đã hiện, và bạn đã đăng nhập (qtv), frmMain cũng hiện lên sau khi đăng nhập thành công. Nhưng không lấy được dữ liệu từ frmLogin, do phát sinh ngoại lệ: NullPointerException.
Do frmLogin.login = null vì lý do nào đó, tốt nhất hãy chép mã nguồn lên đấy (không chụp hình).

3 Likes

Lỗi là bạn chưa biết cách hoạt động của form. Và bạn muốn dùng được nó bạn phải khởi tạo lên.
Vd: formLogin login = new formLogin()
Sau đó bạn mới truy cập đc vào txtName…

1 Like

Cảm ơn anh đã nhắc nhở. Em là newbie nên chưa rõ quy định. Mong anh bỏ qua.
Đây là mã nguồn 2 form login và giao diện chính của em. Mong mọi người hướng dẫn.

Form Login của em:

package GiaoDien;

import Model.ModelTaiKhoan;
import Sevices.BanSevices;
import Sevices.KetNoiSQL;
import Sevices.TaiKhoanSevices;
import java.awt.event.KeyEvent;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author dungq
 */
public class frmLogin extends javax.swing.JFrame {

 String Username = "", PassWord = "", TenNguoiDung = "";
int manhanvien=0;
  boolean vaitro= true;
  boolean motadmin = true;
    TaiKhoanSevices logsv = new TaiKhoanSevices();
    ArrayList<Model.ModelTaiKhoan> ListLogin = null;
    public static frmLogin login;
    Connection cn = null;

    public frmLogin() {
        this.setTitle("Giao Diện Đăng Nhập");
        initComponents();
        login = this;
        cn = KetNoiSQL.ketnoi();
//        if (cn == null) {
//            JOptionPane.showMessageDialog(this, "Chưa Kết nối đến DB");
//        } else {
//            JOptionPane.showMessageDialog(this, "Đã Kết nối đến DB");
//        }
        btnLogin.setMnemonic(KeyEvent.VK_ENTER);

        this.setResizable(false);
        this.setLocationRelativeTo(null);

    }

    /**
     * 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() {

        jPanel1 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        tfUsername = new javax.swing.JTextField();
        btnLogin = new javax.swing.JButton();
        btnExit = new javax.swing.JButton();
        pfPassword = new javax.swing.JPasswordField();
        jLabel5 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));

        jLabel2.setText("Tên Đăng Nhập:");

        jLabel3.setText("Mật Khẩu:");

        btnLogin.setIcon(new javax.swing.ImageIcon(getClass().getResource("/fatcow-hosting-icons-3000/16x16/lock_go.png"))); // NOI18N
        btnLogin.setText("Đăng Nhập");
        btnLogin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLoginActionPerformed(evt);
            }
        });
        btnLogin.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                btnLoginKeyReleased(evt);
            }
        });

        btnExit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/fatcow-hosting-icons-3000/16x16/cancel.png"))); // NOI18N
        btnExit.setText("Thoát Ra");
        btnExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExitActionPerformed(evt);
            }
        });

        jLabel5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/IMG/coffee-icon (1).png"))); // NOI18N

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addGap(25, 25, 25)
                .addComponent(jLabel5)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 26, Short.MAX_VALUE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2)
                            .addComponent(jLabel3))
                        .addGap(45, 45, 45)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(tfUsername)
                            .addComponent(pfPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(26, 26, 26)
                        .addComponent(btnLogin)
                        .addGap(18, 18, 18)
                        .addComponent(btnExit)))
                .addGap(24, 24, 24))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(29, 29, 29)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(tfUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(pfPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnLogin)
                    .addComponent(btnExit))
                .addContainerGap())
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel5)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel1.setText("ĐĂNG NHẬP");

        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(228, 228, 228)
                        .addComponent(jLabel1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(37, 37, 37)
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(43, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(24, Short.MAX_VALUE)
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(38, 38, 38))
        );

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

    private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) {                                         

        try {
             String sql = "Select * from nguoidung where username=? and password=?";
            PreparedStatement pstm = null;
            ResultSet rs = null;
            String a = tfUsername.getText();
            String b = new String(pfPassword.getPassword());
            pstm = cn.prepareStatement(sql);
            pstm.setString(1, tfUsername.getText());
            pstm.setString(2, new String(pfPassword.getPassword()));
            rs = pstm.executeQuery();
            String username = "";
            String password = "";
            while (rs.next()) {
                username = rs.getString("username");
                password = rs.getString("password");
            }
            ListLogin = logsv.LayTenNguoiDungTheoTenDangNhap(username);
            Username = username;
            PassWord = password;

            if (tfUsername.getText().isEmpty() && pfPassword.getText().isEmpty()) {
                JOptionPane.showMessageDialog(this, "Hãy Điền Tài Khoản và mật khẩu", "Lỗi", 2);
            } else if (a.equals("")) {
                JOptionPane.showMessageDialog(this, "Bạn Chưa Nhập Username", "Lỗi", 2);
            } else if (b.equals("")) {
                JOptionPane.showMessageDialog(this, "Bạn chưa Nhập PassWord", "Lỗi", 2);
            } else if (username.equals(a) && password.equals(b)) {
                Username = ListLogin.get(0).getTendangnhap();
                TenNguoiDung = ListLogin.get(0).getTennguoidung();
                manhanvien = ListLogin.get(0).getManhanvien();
                vaitro = ListLogin.get(0).isVaitro();
                if (vaitro == true) {
                    new frmMain().setVisible(true);
                } else {
                    new frmMain_User().setVisible(true);
                }
                tfUsername.setText("");
                pfPassword.setText("");
            } else {
                JOptionPane.showMessageDialog(this, "Sai Tài Khoản Hoặc Mật Khẩu", "Lỗi", 2);
            }
            pstm.close();
            rs.close();

        } catch (Exception e) {
           
            JOptionPane.showMessageDialog(this, " Gặp lỗi: " + e);
            e.printStackTrace();
        }

    }                                        

    private void btnExitActionPerformed(java.awt.event.ActionEvent evt) {                                        

        int kq = JOptionPane.showConfirmDialog(this, "Bạn có muốn thoát không?", "Xác Nhận",
                JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
        if (kq == JOptionPane.YES_OPTION) {

            dispose();
        } else if (kq == JOptionPane.NO_OPTION) {

        } else {
            JOptionPane.showMessageDialog(this, "");
        }
    }                                       

    private void btnLoginKeyReleased(java.awt.event.KeyEvent evt) {                                     
        // TODO add your handling code here:
    }                                    

    // Variables declaration - do not modify                     
    private javax.swing.JButton btnExit;
    private javax.swing.JButton btnLogin;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPasswordField pfPassword;
    private javax.swing.JTextField tfUsername;
    // End of variables declaration                   

    public String layuserName() {
        String tendangnhap = Username;
        return tendangnhap;
    }

    public boolean ItnhatMotAdmin() {

        ArrayList<ModelTaiKhoan> ListTk = new ArrayList<>();
        ModelTaiKhoan login = new ModelTaiKhoan();

        try {
            ListTk = logsv.DeItNhatMotAdmin();
            if (ListTk.size() == 1) {
                motadmin = false;
            } else {
                motadmin = true;
            }
            System.out.println("222" + ListTk);
        } catch (Exception e) {
        }
        return motadmin;
    }
}

Phía dưới là code form main

Không phải bọn mình làm khó bạn, chỉ cần thực hiện đúng quy định thì mọi người sẽ cùng giúp bạn hết sức có thể.

Xem hướng dẫn ở #8 và làm theo, sau đó sửa lại nội dung của bạn.

1 Like

Form main của em :

package GiaoDien;

import Model.ModelBan;
import Model.ModelHoaDon;
import Model.ModelTaiKhoan;
import Model.ModelThucDon;
import Sevices.BanSevices;
import Sevices.HoadonSevice;
import Sevices.KetNoiSQL;
import Sevices.TaiKhoanSevices;
import Sevices.ThucDonSevices;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Locale;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableModel;

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

    KetNoiSQL cn = new KetNoiSQL();
    BanSevices bansv = new BanSevices();
    ThucDonSevices thucdonsv;
    HoadonSevice hoadonsv;
    TaiKhoanSevices loginsv;
    ArrayList<ModelTaiKhoan> ListLogin;
    ArrayList<ModelBan> ListBan;
    ArrayList<ModelBan> ListMaban;
    ArrayList<ModelBan> TenBanTheoBtn;
    ArrayList<ModelHoaDon> listhoadon = new ArrayList<>();
    ArrayList<ModelThucDon> ListThucDon;
    DefaultTableModel model = new DefaultTableModel();

    public static String tenban = "", Thanhtien = "", tendangnhap = "", tennguoidung = "", Vaitro = " ", tendouong = "";
    public static int tt = 0, maban = 0, madouong = 0, manhanvien = 0, mabangiaodien = 0, mahoadon = 0, vitri = 0;
    public static frmMain main;
    public static boolean trangthai = true;

    frmMain() {
        initComponents();
        main = this;
        giaodienban();
        nguoidung();
        addcombo();
        if (listhoadon.size() > 0) {
            vitri = 0;
            display(vitri);
        }
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
    }
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          

/// ĐÂY LÀ PHẦN CODE SWING - DO QUÁ DÀI NÊN EM ĐÃ XÓA BỚT ĐỂ REPLY DC
}//

    private void CboMonActionPerformed(java.awt.event.ActionEvent evt) {                                       
        // TODO add your handling code here:
    }                                      

    private void BtnThemMonActionPerformed(java.awt.event.ActionEvent evt) {                                           

        String hoten = "^[0-9 ]+$";
        if (maban == 0) {
            JOptionPane.showMessageDialog(null, "Hãy Chọn Bàn!");
        } else if (tfSoLuong.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "Không được để trống số lượng");
        } else {
            if (!tfSoLuong.getText().matches(hoten)) {
                JOptionPane.showMessageDialog(null, "Sai ĐỊnh Dạng Số Lượng");
            } else {
                tendouong = CboMon.getSelectedItem().toString();
            }
            ListThucDon = thucdonsv.Laymadouongtheotendouong(tendouong);
            madouong = ListThucDon.get(0).getMadouong();
            try {
                ModelHoaDon hd = new ModelHoaDon();
                hd.setMaban(maban);
                hd.setMadouong(madouong);
                hd.setManhanvien(manhanvien);
                hd.setSoluong(Integer.parseInt(tfSoLuong.getText()));
                hoadonsv.ThemHoaDon(hd);
                tblHoaDon.removeAll();
                addtable();
                tblHoaDon.updateUI();
                tfThanhtien.setText((thanhtien()));
                vitri = listhoadon.size() - 1;
                display(vitri);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }                                          

    private void mnuQlyTaiKhoanActionPerformed(java.awt.event.ActionEvent evt) {                                               
        new frmQlyTaiKhoan().setVisible(true);

    }                                              

    private void mnuCapNhatThongTinActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        new frmCapNhatThongTin().setVisible(true);
    }                                                  

    private void btnQlyBanActionPerformed(java.awt.event.ActionEvent evt) {                                          
        new frmQlyBan().setVisible(true);
    }                                         

    private void btnQlyThucDonActionPerformed(java.awt.event.ActionEvent evt) {                                              
        new frmQlyThucDon().setVisible(true);
    }                                             

    private void btnQlyHoaDonActionPerformed(java.awt.event.ActionEvent evt) {                                             
        new frmThongKeHoaDon().setVisible(true);
    }                                            

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
    }                                        

    private void btnThanToanActionPerformed(java.awt.event.ActionEvent evt) {                                            

        if (maban == 0) {
            JOptionPane.showMessageDialog(null, "Hãy Chọn Bàn Thanh Toán");
        } else {
            int hoi = JOptionPane.showConfirmDialog(this, "Bạn có muốn thanh toán không?");
            if (hoi == JOptionPane.YES_OPTION) {
                System.out.println("List hoa don la " + listhoadon);
                if (listhoadon.isEmpty()) {
                    JOptionPane.showMessageDialog(this, "Hóa đơn trống! ");
                    System.out.println("List hoa don la " + listhoadon);
                } else {
                    new frmThanhToan().setVisible(true);
                    ModelHoaDon hd = new ModelHoaDon();
                    hd.setMaban(maban);
                    hoadonsv.XoaHoaDonTheoBan(hd);
                    tblHoaDon.removeAll();
                    addtable();
                    tblHoaDon.updateUI();
                    tfThanhtien.setText((thanhtien()));
                }
                giaodienban();
                addtable();

            }
        }

//            new frmThanhToan().setVisible(true);

    }                                           

    private void btnChuyenBanActionPerformed(java.awt.event.ActionEvent evt) {                                             
        // TODO add your handling code here:
    }                                            

    private void btCapnhatTinhTrangActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        btCapnhatTinhTrang.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                giaodienban();
                addtable();

            }
        });
    }                                                  

    private void tblHoaDonMouseClicked(java.awt.event.MouseEvent evt) {                                       
        try {
            int row = tblHoaDon.getSelectedRow();
            if (row >= 0) {
                vitri = row;
                display(vitri);
                System.out.println("Vi tri la " + vitri);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Gặp Lỗi: " + e);
        }
    }                                      

    private void BtnCapNhatActionPerformed(java.awt.event.ActionEvent evt) {                                           
        String hoten = "^[0-9 ]+$";

        if (tfSoLuong.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "Không được để trống số lượng");
        } else {
            if (!tfSoLuong.getText().matches(hoten)) {
                JOptionPane.showMessageDialog(null, "Sai ĐỊnh Dạng Số Lượng");
            } else {
                tendouong = CboMon.getSelectedItem().toString();
            }
            ListThucDon = thucdonsv.Laymadouongtheotendouong(tendouong);
            madouong = ListThucDon.get(0).getMadouong();
            if (madouong == 0) {
                JOptionPane.showMessageDialog(null, "Hãy Chọn Món Cần Cập Nhật!");
            } else {
                ModelHoaDon hd = listhoadon.get(vitri);
                mahoadon = hd.getMahoadon();
                try {
                    hd = new ModelHoaDon();
                    hd.setMaban(maban);
                    hd.setMadouong(madouong);
                    hd.setManhanvien(manhanvien);
                    hd.setSoluong(Integer.parseInt(tfSoLuong.getText()));
                    hd.setMahoadon(mahoadon);

                    int x = hoadonsv.SuaMon(hd);
                    if (x > 0) {
                        tblHoaDon.removeAll();
                        addtable();
                        tblHoaDon.updateUI();
                        tfThanhtien.setText((thanhtien()));
                        display(vitri);
                    }
                } catch (Exception e) {
                    e.printStackTrace();

                }
            }

        }
    }                                          

    private void jButton14ActionPerformed(java.awt.event.ActionEvent evt) {                                          
        dispose();
    }                                         
    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(KetNoi.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(KetNoi.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(KetNoi.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(KetNoi.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 frmMain().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton BtnCapNhat;
    private javax.swing.JButton BtnThemMon;
    private javax.swing.JComboBox<String> CboMon;
    private javax.swing.JMenu MnuAdmin;
    private javax.swing.JMenu MnuCapNhatThongTin;
    private javax.swing.JButton btCapnhatTinhTrang;
    private javax.swing.JButton btnChuyenBan;
    private javax.swing.JButton btnGopban;
    private javax.swing.JButton btnQlyBan;
    private javax.swing.JButton btnQlyHoaDon;
    private javax.swing.JButton btnQlyThucDon;
    private javax.swing.JButton btnThanToan;
    private javax.swing.JFrame frmThanhToan;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton11;
    private javax.swing.JButton jButton14;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel21;
    private javax.swing.JLabel jLabel22;
    private javax.swing.JLabel jLabel24;
    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.JMenuBar jMenuBar1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane6;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JToolBar.Separator jSeparator3;
    private javax.swing.JTable jTable5;
    private javax.swing.JTextField jTextField10;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JLabel lbBan;
    private javax.swing.JLabel lbTenNguoiDung;
    private javax.swing.JLabel lbVaitro;
    private javax.swing.JMenuItem mnuCapNhatThongTin;
    private javax.swing.JMenuItem mnuQlyTaiKhoan;
    private javax.swing.JPanel pnBan;
    private javax.swing.JTable tblHoaDon;
    private javax.swing.JTextField tfSoLuong;
    private javax.swing.JTextField tfThanhtien;
    // End of variables declaration                   

    public void giaodienban() {
        ListBan = bansv.GetBan(0);
        if (ListBan != null) {
            pnBan.removeAll();
            JButton[] btn = new JButton[ListBan.size()];
            for (int i = 0; i < ListBan.size(); i++) {
                btn[i] = new JButton();
                btn[i].setName(String.valueOf(ListBan.get(i).getMaban()));
                String mb = ListBan.get(i).getTenban();
                btn[i].setText(mb);
                btn[i].setIcon(new javax.swing.ImageIcon(getClass().getResource("/IMG/Household-Table-Icon.png.")));
                Border border = new LineBorder(Color.white);
//                btn[i].setBorder(border);
                btn[i].setBackground(Color.WHITE);
                btn[i].setFont(new java.awt.Font("Tahoma", 1, 10));
                btn[i].setForeground(Color.BLACK);
                String tendangnhap = "";
                tendangnhap = frmLogin.login.Username;

                tenban = ListBan.get(i).getTenban();
                mabangiaodien = ListBan.get(i).getMaban();
                setTinhtrangBan();
                tt = ListBan.get(i).getTinhtrang();
                if (tt == 1) {
                    btn[i].setBackground(Color.decode("#ff6699"));

                }

                btn[i].addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        TenBanTheoBtn = bansv.GetBan(Integer.parseInt(e.getComponent().getName()));
                        if (TenBanTheoBtn != null) {
                            tenban = TenBanTheoBtn.get(0).getTenban();
                            tt = TenBanTheoBtn.get(0).getTinhtrang();
                            maban = TenBanTheoBtn.get(0).getMaban();
                        }
                        listhoadon = hoadonsv.GetHoaDonTheoTenBan(tenban);
                        lbBan.setText(tenban);
                        if (tt == 1) {
                            lbBan.setForeground(Color.red);
                        } else {
                            lbBan.setForeground(Color.black);
                        }
                        lbBan.setFont(new java.awt.Font("Tahoma", 1, 20));
                        tblHoaDon.removeAll();
                        tblHoaDon.setVisible(true);
                        addtable();
                        tblHoaDon.updateUI();
                        tfThanhtien.setText((thanhtien()));
                    }
                });
                btn[i].setPreferredSize(new Dimension(120, 120));
                pnBan.add(btn[i]);

            }
            pnBan.updateUI();
        }

    }

    private void addtable() {
        model = (DefaultTableModel) tblHoaDon.getModel();
        hoadonsv = new HoadonSevice();
        listhoadon = hoadonsv.GetHoaDonTheoTenBan(tenban);
        model.setRowCount(0);
        for (ModelHoaDon x : listhoadon) {
            model.addRow(new Object[]{x.getMahoadon(), x.getTennhanvien(), x.getMon(), x.getDongia(), x.getSoluong(), x.getThanhtien()});
        }
    }

    public void addcombo() {
        CboMon.removeAllItems();
        thucdonsv = new ThucDonSevices();
        ListThucDon = thucdonsv.LayDanhSachDoUong();
        for (ModelThucDon x : ListThucDon) {
            CboMon.addItem(x.getTenmon());
        }
    }

    public String thanhtien() {
        int rowsCount = tblHoaDon.getRowCount();
        int Thanhtien = 0;
        for (int i = 0; i < rowsCount; i++) {
            Thanhtien = Thanhtien + Integer.parseInt(tblHoaDon.getValueAt(i, 5).toString());

        }
        Locale localeVN = new Locale("vi", "VN");
        NumberFormat currencyVN = NumberFormat.getCurrencyInstance(localeVN);
        String str1 = currencyVN.format(Thanhtien);
        return str1;
    }

    public void nguoidung() {
        tennguoidung = frmLogin.login.TenNguoiDung;
        manhanvien = frmLogin.login.manhanvien;
        lbTenNguoiDung.setText(tennguoidung);
        boolean vaitrodangnhap = frmLogin.login.vaitro;
        if (vaitrodangnhap == true) {
            Vaitro = "Maganer";
            lbVaitro.setForeground(Color.decode("#EE2C2C"));
        } else {
            Vaitro = "Staff";
        }
        lbVaitro.setText(Vaitro);
    }

    private void setTinhtrangBan() {

        ModelBan ban = new ModelBan();
        hoadonsv = new HoadonSevice();
        listhoadon = hoadonsv.GetHoaDonTheoTenBan(tenban);
        if (listhoadon.size() > 0) {
            ban.setTinhtrang(1);
            ban.setMaban(mabangiaodien);
            bansv.settinhtrangban(ban);
        }
        if (listhoadon.isEmpty()) {
            ban.setTinhtrang(0);
            ban.setMaban(mabangiaodien);
            bansv.settinhtrangban(ban);
        }

    }

    private void display(int vitri) {
        ModelHoaDon hd = listhoadon.get(vitri);
        tfSoLuong.setText(Integer.toString(hd.getSoluong()));
        tblHoaDon.setRowSelectionInterval(vitri, vitri);
    }

    public boolean LayTrangThaiChoFormBan() {
        listhoadon = hoadonsv.GetHoaDonTheoTenBan(frmQlyBan.qlyban.Settenban());
        if (listhoadon.isEmpty()) {
            trangthai = false;
        } else {
            trangthai = true;
        }
        return trangthai;
    }

//    public boolean LayTrangThaiChoFormTaiKhoan() {
//
//    }
    public boolean LayTrangThaiChoFormTaiKhoan() {
        listhoadon = hoadonsv.GetHoaDonTheoMaNhanVien(frmQlyTaiKhoan.qlyTK.MaNhanVien());
        if (listhoadon.isEmpty()) {
            trangthai = false;
        } else {
            trangthai = true;
        }
        return trangthai;
    }

    public boolean LayTrangThaiChoFormThucDon() {
        int madouong = frmQlyThucDon.qlyThucDon.TraveMaDouong();
        System.out.println(" ma do uong  " + madouong);
        listhoadon = hoadonsv.GetHoaDonTheoMaThucDon(frmQlyThucDon.qlyThucDon.TraveMaDouong());
        System.out.println("list hoa don " + listhoadon);
        if (listhoadon.isEmpty()) {
            trangthai = false;
        } else {
            trangthai = true;
        }
        return trangthai;
    }

}

Do code em quá dài nên không thể reply được nên em đã cắt bớt phần swing đi. Chỉ còn phần em code
Dưới đây là code đầy đủ:

https://drive.google.com/file/d/1lXScsbKFeN3aE-d4E8jVGophPcOf01VH/view?usp=sharing

Em cảm ơn!

Cảm ơn anh đã nhắc nhở và giúp em. Em sẽ tìm đọc nội quy và tuân thủ ạ

Có thể là bạn chưa chọn đúng phương thức main() chạy đầu tiên.
Mỗi khi tạo 1 giao diện, nó tạo kèm với phương thức main(), để có thể chạy thử. Bạn tạo nhiều giao diện, nó sẽ tạo nhiều main().
Nhưng khi dựng tập tin jar thì nó chỉ chọn duy nhất 1 main() để chạy.

Trường hợp này, bạn nên chọn main() của frmLogin.
Chuột phải vào dự án (Project) > Properties > Run > Chọn main để chạy từ danh sách (xổ xuống). Có thể là của frmLogin
Vào main() của lớp mà bạn chọn, sửa thành:

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new frmLogin().setVisible(true);
            }
        });

Nếu đã có sẵn thì không cần sửa. :rofl:

5 Likes

Em nghĩ không phải do lỗi này. mà là do em đóng gói có vấn đề chứ vài ngày nữa em phải nộp dự án r. Đập đi xây lại thì hỏng :cry:
Đây là toàn bộ project:
https://drive.google.com/file/d/1itp2tZcDVDqeAuv3c4wWI50lM8CenZX0/view?usp=sharing
Và database của e:
https://drive.google.com/file/d/1rHgs47GuR4u7--lMPwGa_9k8pJhRHnPs/view?usp=sharing

Bạn đang dùng jdk máy và netbeans máy thế?

Tức là nó vẫn chạy đúng theo trình tự: frmLogin > Đăng nhập thành công > frmMain?

  • Nó xảy ra lỗi khi bạn thao tác gì?
  • Lúc đó frmLogin vẫn hiển thị, hay ẩn mất rồi?

Không cần “đập đi xây lại” đâu, biết chỗ lỗi, sửa là xong!

1 Like

Mình đang dùng JDK 1.8 và netbean 8.2 b

Em bắt lỗi dc thì code của e chạy đến dòng new frmMain().setVisible(true) trong nút đăng nhập ở giao diện đăng nhập rồi. Nhưng vì lý do nào đó frmMain của em không nhận được tham số truyền từ formLogin sang nên nó báo lỗi null point exeption. Mà trong netbean chạy vẫn ổn

Bạn xóa 2 dòng này ở phương thức frmMain.giaodienban()

String tendangnhap = "";
tendangnhap = frmLogin.login.Username;

Dòng này mình thấy nó vô nghĩa. Khai báo cục bộ/gán, nhưng không dùng đến. Bạn có khai báo trường tendangnhap toàn cục, nhưng khai báo cục bộ làm nó vô nghĩa.
Sau đó dựng lại jar và chạy thử, nếu vẫn lỗi, có thể do thứ khác, có thể là kết nối với CSDL có vấn đề.

Nếu vẫn lỗi. Thông báo lỗi đầy đủ (StackTrace) là thế nào?


Bạn nên tạo 1 phương thức cho frmMain (và các frmXXX khác tương tự), để khi gọi thì chỉ cần truyền thông tin đăng nhập và hiện lên. Ví dụ nhé:

// frmMain.java

// truyền tham số là tên đăng nhập
public void show(String username){
    this.tendangnhap = username;
// xóa từ hàm dựng và chuyển vào đây
        giaodienban();
        nguoidung();
        addcombo();
        if (listhoadon.size() > 0) {
            vitri = 0;
            display(vitri);
        }
// hiện
    this.setVisible(true);
// làm gì đó nữa....
}

// ---
// frmLogin

// thay thế chỗ hiện frmMain bằng:
new frmMain().show(this.Username);

Thế đấy, bạn nên truyền tham số (thông tin đăng nhập) thông qua phương thức, thay vì dùng giá trị tĩnh (frmLogin.login, …)


Chú ý:

Bạn nên để ý đến việc khai báo toàn cục/cục bộ.
Nếu tên trường cục bộ trùng với tên trường toàn cục (như phía trên). Có thể dẫn đến nhầm lẫn, việc gán giá trị có thể bị sai lệch.

2 Likes

Thực ra 2 dòng đó e định xây dựng lúc đầu nhưng không dùng nữa mà quên xóa đi, em đã xóa trên code.
Kết nối CSDL thì không phải do em gõ sai mật khẩu thì vấn hiện thông báo sai mật khẩu.
Em cũng xây dựng một phương thức ở form login để return lại biến tendangnhap sau đó em gán biến dạng Username = frmLogin.login.laytendangnhap() ở form Main nhưng không hiệu quả.
Đây là lỗi khi e chạy file jar Capture

Còn đây là lỗi khi e chạy riêng form Main trong project mà không chạy qua form đăng nhập:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at GiaoDien.frmMain.giaodienban(frmMain.java:833)
        at GiaoDien.frmMain.<init>(frmMain.java:63)
        at GiaoDien.frmMain$17.run(frmMain.java.765)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
        ...

Em nghĩ là file jar nó đã gọi form Main mà không lấy giá trị từ form Login

Do thông báo lỗi hiện lên chung chung (chỉ tên ngoại lệ) nên khó biết do dòng nào gây ra. Bạn thêm vào chỗ bắt ngoại lệ đăng nhập frmLogin như sau:

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String es = sw.toString();
JOptionPane.showMessageDialog(this, " Gặp lỗi: " + es);
2 Likes

Hic lỗi này hơi khác so với em dự đoán :sweat_smile::

Gặp lỗi: java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(Unknown Source)
        at GiaoDien.frmMain.giaodienban(frmMain.java:826)
        at GiaoDien.frmMain.<init>(frmMain.java:63)
        at GiaoDien.frmLogin.btnLoginActionPerformed(frmLogin.java:214)
        at GiaoDien.frmLogin.access$000(frmLogin.java:26)
        at GiaoDien.frmLogin$1.actionPerformed(frmLogin.java:85)
        at java.swing.AbstractButton.fireActionPerformed(Unknown Source)
        ...

Đây là dòng 826 của em:

btn[i].setIcon(new javax.swing.ImageIcon(getClass().getResource("/IMG/Household-Table-Icon.png.")));

Em nghĩ đường dẫn để lấy icon của em có vấn đề. Anh có thể cho em lời khuyên không
Sau khi tắt dòng lấy icon đó đi thì file jar của em đã chạy ổn :yum:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?