Java getActionCommand()
2023. 4. 6. 23:45ㆍJava
프로젝트 내 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 |