private boolean validateForm() {
   if (penjualanDetails == null || penjualanDetails.isEmpty()) {
     JOptionPane.showMessageDialog(
         FrameUtama.getInstance(),
         "Tambahkan dahulu penjualan detail!",
         "Error",
         JOptionPane.ERROR_MESSAGE);
     return false;
   }
   return true;
 }
 private void btnHapusDetailActionPerformed(
     java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btnHapusDetailActionPerformed
   if (selectedPenjualanDetail != null) {
     penjualanDetails.remove(selectedPenjualanDetail);
     tblPenjualanDetail.setModel(new PenjualanDetailTableModel());
     calculateTotal();
     selectedPenjualanDetail = null;
   } else {
     JOptionPane.showMessageDialog(
         FrameUtama.getInstance(),
         "Pilih penjualan detail terlebih dahulu!",
         "Warning",
         JOptionPane.WARNING_MESSAGE);
   }
 } // GEN-LAST:event_btnHapusDetailActionPerformed
 private void btnEditDetailActionPerformed(
     java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btnEditDetailActionPerformed
   if (selectedPenjualanDetail != null) {
     selectedPenjualanDetail = new PenjualanAddDialog().showDialog(selectedPenjualanDetail);
     // notifikasi table bahwa ada perubahan di baris yg sedang dipilih
     tblPenjualanDetail.tableChanged(
         new TableModelEvent(tblPenjualanDetail.getModel(), tblPenjualanDetail.getSelectedRow()));
     calculateTotal();
   } else {
     JOptionPane.showMessageDialog(
         FrameUtama.getInstance(),
         "Pilih penjualan detail terlebih dahulu!",
         "Warning",
         JOptionPane.WARNING_MESSAGE);
   }
 } // GEN-LAST:event_btnEditDetailActionPerformed