Java getActionCommand()

2023. 4. 6. 23:45Java

프로젝트 내 src 내 javabasic 패키지 내 SwingJDBC.java

package javabasic;
/**
 * 2차원 배열로 데이타를 저장하다가 크기가 모잘라서 오류가 난다.
 * 벡터를 이용하였으나 JTable 에서 인자로 벡터만 받으며
 * 벡터 배열 형태를 받지 않아 오류가 난다
 * 2차원 배열과 같은 의미를 지니도록 벡터 내부에 값이 벡터가 되도록 하였지만
 * JTable 생성자 함수 인자에서 벡터 배열 형태를 가지는 메서드가 없다.
 * showData() 메서드에서 배열 크기를 자동으로 늘려주도록 만들었지만
 * 수정과 삭제를 눌렀을 때 테이블을 다시 그려주는 repaint() 메서드가
 * 제대로 작동하지 않는다.
 */
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

@SuppressWarnings("unchecked")
public class SwingJDBC extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2732383441775678655L;
	private ResultSet rs = null;
	private Statement stmt = null;
	private PreparedStatement pst = null;

	private JButton[] btn = new JButton[4];
	private JLabel[] label = new JLabel[8];
	private JTextField[] tf = new JTextField[8];
	private JTable table;
	private JScrollPane jp = new JScrollPane();

	// 선언만 해놓는다. 생성은 생성자안에서 한다.
	private JPanel labelTextP[] = new JPanel[4];// 레이블과 텍스트필드를 묶는 패널

	private Vector<String>[] dataA = new Vector[8];
	private String[][] data = new String[50][8];
	private String[][] dataT;
	private String[] colName = { "empno     ", "ename     ", "job       ", "mgr       ", "hiredate  ", "sal       ",
			"comm      ", "deptno    " };
	private Vector<String> colNameV = new Vector<String>();
	private String[] str = { "", "", "", "", "", "", "", "" };// 처음 초기에 실제 값은 널값으로 처리

	// 생성자
	public SwingJDBC() throws Exception {
		super("사원정보");

		for (int i = 0; i < dataA.length; i++) {
			dataA[i] = new Vector<String>();
		}

		colNameV.add(0, "empno     ");
		colNameV.add(1, "ename     ");
		colNameV.add(2, "job       ");
		colNameV.add(3, "mgr       ");
		colNameV.add(4, "hiredate  ");
		colNameV.add(5, "sal       ");
		colNameV.add(6, "comm      ");
		colNameV.add(7, "deptno    ");
		
		// DB에 접속
		Connection conn = DbConn.getConnection();// scott계정
		stmt = conn.createStatement();

		// 레이블과 텍스트필드, 버튼 컴포넌트를 포함하는 패널
		JPanel inputPanel = new JPanel();
		inputPanel.setLayout(new GridLayout(5, 1));

		// 레이블 작성 로직
		for (int i = 0; i < 8; i = i + 1) {
			label[i] = new JLabel(colName[i]);
		}

		// 텍스트 필드 생성
		for (int i = 0; i < 8; i = i + 1) {
			tf[i] = new JTextField(15);
		}

		for (int i = 0; i < 4; i = i + 1) {
			labelTextP[i] = new JPanel();
		}

		// labelTextP패널에 레이블과 텍스트 필드를 담는 로직
		int j = -1;
		for (int i = 0; i < 8; i = i + 1) {
			if (i % 2 == 0) {
				j = j + 1; // j++;
			}
			labelTextP[j].add(label[i]);
			labelTextP[j].add(tf[i]);
		}

		JPanel btnPanel = new JPanel(); // 버튼을 담는 패널

		btn[0] = new JButton("선택");
		btn[1] = new JButton("입력");
		btn[2] = new JButton("수정");
		btn[3] = new JButton("삭제");

		// 패널에 버튼을 담는 로직
		for (int i = 0; i < 4; i = i + 1) {
			btn[i].addActionListener(eh);
			btnPanel.add(btn[i]);
		}

		inputPanel.add(labelTextP[0]);
		inputPanel.add(labelTextP[1]);
		inputPanel.add(labelTextP[2]);
		inputPanel.add(labelTextP[3]);
		inputPanel.add(btnPanel); // 버튼 패널 삽입

		table = new JTable(data, colName);
		jp = new JScrollPane(table);

		jp.addMouseListener(new MouseAdapter() {
		});// 이벤트는 없고 단지 선택했다는 동작만 해주시면 된다 선택해서 파란색으로뜬다.

		// container역할을 하는 패널구해오기
		Container cp = this.getContentPane();
		cp.setLayout(new GridLayout(2, 1));

		cp.add(jp);
		cp.add(inputPanel);

		// X버튼 눌렀을 때 닫힐 수 있다
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setBounds(100, 100, 500, 500); // 프레임의 크기 설정
		setVisible(true);
		showData();
	}// 생성자

	public void showData() {
		table.removeAll();
		System.out.println("showData 에서 data.length : " + data.length);
		try {
			for (int i = 0; i < data.length; i = i + 1) {
				for (int j = 0; j < 8; j = j + 1) {
					data[i][j] = "";
				}
			} // for문
//			System.out.println("dataA 길이 : " + dataA.length);
//			for (int i = 0; i < dataA.length; i = i + 1) {
//				for (int j = 0; j < 50; j = j + 1) {
//					dataA[i].add(j, "");
//				}
//			}

//			rs = stmt.executeQuery("select count(*) from emp");
//			rs.next();
//			System.out.println(rs.getInt(1));
//			if (rs.getInt(1) > 50) {
//				for (int i = 0; i < dataA.length; i = i + 1) {
//					dataA[i].ensureCapacity(625);
//				}
//			}

			rs = stmt.executeQuery("select * from emp");
			
			System.out.println("sql 문을 실행하였습니다.");
			
			int i = 0;
			int j = 1;
			int pos = 0;
			while (rs.next()) {
				data[i][0] = rs.getString(1);
				data[i][1] = rs.getString(2);
				data[i][2] = rs.getString(3);
				data[i][3] = rs.getString(4);
				data[i][4] = rs.getString(5);
				data[i][5] = rs.getString(6);
				data[i][6] = rs.getString(7);
				data[i++][7] = rs.getString(8);
				if (i > data.length - 1) {
					System.out.println("현재 i 값 : " + i);
					System.out.println("data.length 값 : " + data.length);
					j = j + 1;
					dataT = new String[data.length * j][8];
					
					pos = data.length;
					
					for (int k = 0; k < data.length; k = k + 1) {
						dataT[k][0] = data[k][0];
						dataT[k][1] = data[k][1];
						dataT[k][2] = data[k][2];
						dataT[k][3] = data[k][3];
						dataT[k][4] = data[k][4];
						dataT[k][5] = data[k][5];
						dataT[k][6] = data[k][6];
						dataT[k][7] = data[k][7];
					}
					
					System.out.println("dataT.length 값 : " + dataT.length);
					System.out.println("pos 값 : " + pos);
					data = new String[dataT.length][8];
					
					System.out.println("data 배열 크기를 늘린 후 data.length 값 : " + data.length);
					
					for (int l = 0; l < pos; l = l + 1) {
						data[l][0] = dataT[l][0];
						data[l][1] = dataT[l][1];
						data[l][2] = dataT[l][2];
						data[l][3] = dataT[l][3];
						data[l][4] = dataT[l][4];
						data[l][5] = dataT[l][5];
						data[l][6] = dataT[l][6];
						data[l][7] = dataT[l][7];
					}
				}
//				dataA[0].add(i, rs.getString(1));
//				dataA[1].add(i, rs.getString(2));
//				dataA[2].add(i, rs.getString(3));
//				dataA[3].add(i, rs.getString(4));
//				dataA[4].add(i, rs.getString(5));
//				dataA[5].add(i, rs.getString(6));
//				dataA[6].add(i, rs.getString(7));
//				dataA[7].add(i++, rs.getString(8));
			} // while
			System.out.println("1번째 로우 값 : " + data[1][0] + data[1][1] + data[1][2] + data[1][3] + data[1][4] + data[1][5] + data[1][6] + data[1][7]);
			table.repaint();
			System.out.println("table 을 다시 그렸습니다.");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}// showData

	// 내부클래스를 바로 생성해서 사용한다
	EventHandler eh = new EventHandler();

	// 이벤트핸들러 내부클래스로 정의
	// 이벤트핸들러가 중개역할을 해준다
	class EventHandler implements ActionListener {
		public void actionPerformed(ActionEvent ae) {
			if (ae.getActionCommand().equals("선택")) {
				// 테이블의 선택한 로우값을 얻어온다.
				int row = table.getSelectedRow();
				System.out.println("선택한 로웃값 : " + row);

				for (int i = 0; i < 8; i = i + 1) {
//					System.out.println("data[" + row + "][" + i + "] 값 : " + data[row][i]);
					tf[i].setText(data[row][i]);
				}
			} else if (ae.getActionCommand().equals("입력")) {
				try {
					for (int i = 0; i < 8; i = i + 1) {
						if (tf[i].getText().equals("")) {
							if (i == 0 || i == 3 || i == 5 || i == 6 || i == 7)
								str[i] = "''";// 숫자형의 데이타값을 널값일때 처리해주는방법 안그러면오류남다
							else
								str[i] = "";// 숫자형이 아닌 데이타칼럼에 널값을 넣을 때의 방법
						} else {// 널값이 아닐때는
							str[i] = tf[i].getText();
						}
					} // for문
					stmt.executeQuery("insert into emp values(" + str[0] + ",'" + str[1] + "','" + str[2] + "',"
							+ str[3] + ",'" + str[4] + "'," + str[5] + "," + str[6] + "," + str[7] + ")");
					stmt.execute("commit");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					System.out.println("입력 오류!!!");
				} // try catch문

				// 화면에 출력
				showData();// repaint처리

				// 텍스트 필드에 있는 내용을 삭제
				for (int i = 0; i < 8; i = i + 1) {
					tf[i].setText("");
				}
			} else if (ae.getActionCommand().equals("수정")) {
				try {
					for (int i = 0; i < 8; i = i + 1) {
						if (tf[i].getText().equals("")) {
							if (i == 0 || i == 3 || i == 5 || i == 6 || i == 7)
								str[i] = "''";
							else
								str[i] = "";
						} else {
							str[i] = tf[i].getText();
						} // if
					} // for

					// 오라클 Date형식에 맞게 문자열을 잘라낸다.
					if (str[4].length() > 0) {
						str[4] = str[4].substring(0, 10);
					} // if

					stmt.executeUpdate("update emp set empno = " + str[0] + ", ename='" + str[1] + "', job='" + str[2]
							+ "'," + "mgr=" + str[3] + ", hiredate='" + str[4] + "',sal=" + str[5] + ", comm=" + str[6]
							+ ", deptno=" + str[7] + " where empno = " + str[0]);
					stmt.executeQuery("commit");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					System.out.println("수정 오류!!!");
				} // try catch
					// 화면에 수정된 내용 출력
				showData();
				for (int i = 0; i < 8; i = i + 1) {
					tf[i].setText("");// 널값으로처리해서돌려준다
				} // for
			} else if (ae.getActionCommand().equals("삭제")) {
				try {
					stmt.executeQuery("delete from emp where" + " empno = " + tf[0].getText());
					stmt.executeQuery("commit");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					System.out.println("삭제시 에러 발생!!!!");
				}
				// 삭제된 내용을 테이블에 반영해서 화면 출력
				showData();
				for (int i = 0; i < 8; i = i + 1) {
					tf[i].setText("");
				}
			} // if문
		}// actionPerformed()
	}////// EventHandler Class//////

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		new SwingJDBC();
	}

}

 

String java.awt.event.ActionEvent.getActionCommand()

getActionCommand() 메서드는 고 action(행동)과 연관된 명령 문자열을 반환한다.

 


값을 담는 이차원 배열 data 크기를 가변적으로 했더니 수정 이나 삭제 버튼을 누른 후에 테이블을 다시 페인트 할 때

그려지지가 않는다. 왜 그런지는 모르겠다. 이차원 배열 data 크기를 고정으로 두면

제대로 작동한다.

'Java' 카테고리의 다른 글

Java setAutoCommit(boolean autoCommit)  (0) 2023.05.10
Java ResultSetMetaData  (0) 2023.04.04
Java Singleton Type Class  (0) 2023.03.30
Java afterLast()  (0) 2023.03.28
Java JDBC™ 4.2 API  (0) 2023.02.28