갈림길 이정표

[java] JDialog 본문

카테고리 없음

[java] JDialog

이몽뇽 2020. 8. 7. 09:15
package pack1;

import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class DbTest8CRUD extends JFrame implements ActionListener {

	JButton btnIns, btnUpd, btnDel, btnExt;
	String[][] datas = new String[0][4];
	String[] titles = { "코드", "상품명", "수량", "단가" };
	DefaultTableModel model = new DefaultTableModel(datas, titles); // 멤버선언할 때 미리 입력 layout 배치 때 안해도 됨
	JTable table = new JTable(model);
	JLabel lblCount = new JLabel("건수: 0");

	Connection conn;
	PreparedStatement pstmt;
	ResultSet rs;

	public DbTest8CRUD() {
		super("상품자료");

		layoutInit();
		accDb();

		
		setResizable(false);
		setBounds(300, 300, 400, 300);
		setVisible(true);


//		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); (이거는 바로 종료)
		addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				int re = JOptionPane.showConfirmDialog(DbTest8CRUD.this, "정말 종료할까요?", "종료",
						JOptionPane.OK_CANCEL_OPTION);

				if (re == JOptionPane.OK_OPTION) {
					try {
						if (rs != null)
							rs.close();
						if (pstmt != null)
							pstmt.close();
						if (conn != null)	
							conn.close();
					} catch (Exception e2) {

					}
					setDefaultCloseOperation(EXIT_ON_CLOSE);
					//System.exit(0);
				} else {
					setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
				}
			}
		});

	}

	private void layoutInit() {
		btnIns = new JButton("추가");
//		btnUpd = new JButton("수정");
		btnDel = new JButton("삭제");
		btnExt = new JButton("종료");

		btnIns.addActionListener(this);
//		btnUpd.addActionListener(this);
		btnDel.addActionListener(this);
		btnExt.addActionListener(this);

		JPanel panel = new JPanel();
		panel.add(btnIns);
//		panel.add(btnUpd);
		panel.add(btnDel);
		panel.add(btnExt);

		add("North", panel);

		table.getColumnModel().getColumn(0).setPreferredWidth(30); // 테이블의 열의 폭 조정
		JScrollPane scroll = new JScrollPane(table);

		add("Center", scroll);

		add("South", lblCount);

	}

	private void accDb() {
		try {
			Class.forName("org.mariadb.jdbc.Driver");

			dispData();
		} catch (Exception e) {
			System.out.println("accDb err: " + e);
		}
	}

	private void dispData() {
		model.setNumRows(0); // table 초기화

		try { // 추가 할 떄, 삭제 할 때 각 각 불러야 되기 때문
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "369369");
			String sql = "SELECT * FROM sangdata"; // mariaDB는 Index 기본 Order by 되어 있음
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();

			int count = 0;

			while (rs.next()) {
				String[] temp = { rs.getString("code"), rs.getString("sang"), rs.getString("su"), rs.getString("dan") };
				model.addRow(temp);
				count++;
			}
			lblCount.setText("건수: " + count);

		} catch (Exception e) {
			System.out.println("dispData err: " + e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
			} catch (Exception e2) {

			}
		}

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==btnIns) {	//상품 추가
			InsertForm insertform = new InsertForm(this);	//modal 이라서 insertform 불러오지 않으면 상품 등록 불가 //this 의 의미?
			dispData(); 	//추가 후 목록 보기
		}
//		else if(e.getSource()==btnUpd) {	//상품 수정 (생략) → 추가랑 다른 점: 선택한 줄의 데이터 프레임에 미리 출력됨
//			
//		}
		else if(e.getSource()==btnDel) {	//상품 삭제
			String del = JOptionPane.showInputDialog(this, "삭제할 코드 번호 입력");	//input 넣고 사라지는 프레임 창
			if (del == null) return;
			try {
				conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "369369");

				String sql = "DELETE FROM sangdata WHERE code=?";
				pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, del);
				
				if(pstmt.executeUpdate() == 0) {
					JOptionPane.showMessageDialog(this, "삭제 가능한 상품이 없습니다.");
					return;
				}
//				else { } 안써도 이미 update 실행 된것
				JOptionPane.showMessageDialog(this, "삭제되었습니다");
				dispData();
			} catch (Exception e2) {
				System.out.println("삭제 오류: " + e2);
			} finally {
				try {
					if (rs != null)
						rs.close();
					if (pstmt != null)
						pstmt.close();
					if (conn != null)
						conn.close();
				} catch (Exception e2) {
					// TODO: handle exception
				}
			}
		} else if(e.getSource()==btnExt) {	//상품 종료
			int re = JOptionPane.showConfirmDialog(DbTest8CRUD.this, "정말 종료할까요?", "종료",
					JOptionPane.OK_CANCEL_OPTION);

			if (re == JOptionPane.OK_OPTION) {
				try {
					if (rs != null)
						rs.close();
					if (pstmt != null)
						pstmt.close();
					if (conn != null)	
						conn.close();
				} catch (Exception e2) {

				}
				System.exit(0);
			} else {
				setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
			}
		}
	}
	
	//추가를 위한 내부 클래스
	class InsertForm extends JDialog implements ActionListener{
		JTextField txtSang = new JTextField();
		JTextField txtSu = new JTextField();
		JTextField txtDan = new JTextField();
		
		JButton btnOk = new JButton("등록");
		JButton btnCncl = new JButton("취소");

		public InsertForm(Frame frame) {
			super(frame, "상품 추가");
			setModal(true);	//modal(sub창 닫기 전까지 다른 작업 못함) & modaless (다중 작업 가능)
			
			JPanel pn1 = new JPanel(new GridLayout(4,2));
			
			pn1.add(new JLabel("품명: ", JLabel.RIGHT));
			pn1.add(txtSang);
			
			pn1.add(new JLabel("수량: ", JLabel.RIGHT));
			pn1.add(txtSu);
			
			pn1.add(new JLabel("단가: ", JLabel.RIGHT));
			pn1.add(txtDan);

			pn1.add(btnOk);
			pn1.add(btnCncl);
			
			btnOk.addActionListener(this);
			btnCncl.addActionListener(this);
			
			add("North", new JLabel("자료 입력하기", JLabel.CENTER));
			add("Center",pn1);
			setBounds(310, 310, 150, 150);
			setVisible(true);
			
			addWindowListener(new WindowAdapter() {
				@Override
				public void windowClosing(WindowEvent e) {
					dispose();	//하나의 Frame만 종료 시키기 위해서는 dispose() 메소드를 사용하여야 한다.
				}
			});
		}
		
		@Override
		public void actionPerformed(ActionEvent e) {
			if(e.getSource()==btnOk) {	//신상품 등록 추가
				//입력자료 검사
				if(txtSang.getText().equals("")) {
					JOptionPane.showMessageDialog(this, "상품명 입력");
					txtSang.requestFocus();
					
					return;	//이후 작업 못하게 함
				} else if(txtSu.getText().equals("")) {
					JOptionPane.showMessageDialog(this, "수량 입력");
					txtSu.requestFocus();
					
					return;	//이후 작업 못하게 함
				} else if(txtDan.getText().equals("")) {
					JOptionPane.showMessageDialog(this, "단가 입력");
					txtDan.requestFocus();
					
					return;	//이후 작업 못하게 함
				}
				
				//수량, 단가는 숫자 (유효성 검사)
				int su = 0;
				try {
					su = Integer.parseInt(txtSu.getText());
				} catch (Exception e2) {
					JOptionPane.showMessageDialog(this, "수량은 숫자만 가능");
					txtSu.requestFocus();
					
					return;	//이후 작업 못하게 함
				}
				
				int dan = 0;
				try {
					dan = Integer.parseInt(txtDan.getText());
				} catch (Exception e2) {
					JOptionPane.showMessageDialog(this, "수량은 숫자만 가능");
					txtDan.requestFocus();
					
					return;	//이후 작업 못하게 함
				}
				
				//등록 가능한 상태
				try {
					conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "369369");
					
					//신상 code 구하기 (하나씩 증가 - (MAX +1))
					int new_code = 0;
					String sql = "SELECT MAX(code) FROM sangdata";
					pstmt = conn.prepareStatement(sql);
					rs = pstmt.executeQuery();
					
					if(rs.next()) {
						new_code = rs.getInt(1);
					}
//					System.out.println(new_code + 1);
					
					sql = "INSERT INTO sangdata VALUES(?,?,?,?)";
					pstmt = conn.prepareStatement(sql);
					pstmt.setInt(1, new_code + 1);
					pstmt.setString(2, txtSang.getText().trim());	//trim(): 앞 뒤 공백지우기 (cf.rtrim, ltrim) 
					pstmt.setInt(3, su);	//이미 위에서 숫자로 바꿈
					pstmt.setInt(4, dan);	//이미 위에서 숫자로 바꿈
					
					if(pstmt.executeUpdate() > 0) {
						JOptionPane.showMessageDialog(this, "등록 성공");
						dispose();
					} else {
						JOptionPane.showMessageDialog(this, "등록 실패!");
					}
					
				} catch (Exception e2) {
					
				} finally {	//DB 필요없을 땐 끊어 주는 것
					try {
						if (rs != null)
							rs.close();
						if (pstmt != null)
							pstmt.close();
						if (conn != null)
							conn.close();
					} catch (Exception e3) {
						// TODO: handle exception
					}
				}
				
			} else if(e.getSource()==btnCncl) {	//입력자료 초기화
				txtSang.setText("");
				txtSu.setText("");
				txtDan.setText("");
				txtSang.requestFocus();
			}
		}
	}

	public static void main(String[] args) {
		new DbTest8CRUD();
	}

}
Comments