2020. 11. 4. 09:35ㆍ교육과정/KOSMO
키워드 : JTable / 비디오샵 비디오관리 완성 / 비디오샵 대여관리 화면 작업 /
****
1. JTable 사용하기
1. 메인에서 생성자함수의 객체 생성
※ Static인 메인에서 생성자함수를 부르면 모든 작업내용이 나올 수 있게 하기 위함
2. 인자를 받지 않는 기본생성자 함수 생성
3. 클래스에서 JFrame을 상속
4. 화면 기본요소 구성 (X 버튼까지 구현)
5. 생성자함수 바깥에서 멤버변수 선언 (이후에 계속 사용될 예정)
6. new키워드를 사용하여 JButton, JTable 객체 생성
7. 화면 구성 (JButton과 JTable을 배치) (JFrame의 기본 레이아웃인 BorderLayout이 자동 적용됨)
※ 이 때, JTable은 화면에 바로 들어갈 수 없기 때문에 JScrollPane에 붙여서 넣어야 한다. ★
8. 테이블모델 클래스 생성
※ AbstractTableModel를 상속하면 JTable의 데이터를 관리할 수 있다.
9. 데이터가 저장될 ArrayList의 객체를 생성
※ ArrayList는 들어올 데이터의 갯수를 모르거나, 데이터 타입을 모르더라도 처리가 된다.
(+) JTable에서 컬럼명이 될 String 타입의 배열 columnNames를 초기화(값을 넣어줌)
(+) ArrayList의 size가 행의 갯수가 되도록 리턴
(+) columnNames의 length가 열의 갯수가 되도록 리턴
(+) getValueAt()는 원하는 행렬의 값을 가져옴
이 때, get()은 Object 타입이므로 적절한 형 변환이 필요함
10. 생성자 함수 내에 테이블모델의 객체를 생성하고, JTable과 연결시킨다.
이 때, 테이블모델이 먼저 생성되고 그 결과물이 JTable에 들어간다.
※ JTable은 내부에 들어가는 요소를 모두 직접 관리해줘야 한다.
변경 없이 기본형으로 간단히 만들고자 할 때는 DefaultTableModel을 사용하면 된다.
처음부터 데이터가 출력되고 버튼 등으로 인한 변동이 없을 경우에 적합함
11. Run(실행) 해보면 테이블의 컬럼명이 A,B,C,D로 나오기 때문에,
컬럼명을 지정해주는 메소드인 getColumnName()에서
col 값을 받아 String배열인 columnNames[]를 리턴하도록 오버라이딩 해준다.
12. 버튼 이벤트를 만들고 그 작동이벤트로 change() 메소드가 수행되게 한다.
13. change() 메소드 작성
※ DB로 사용할 데이터를 만들기 위해 for 반복문 사용
ArrayList data는 5줄짜리 배열 --- temp라는 데이터가 list 안에 저장되는 작업을 5번 수행
data = { temp, temp, temp, temp, temp }
ArrayList temp는 4칸짜리 배열 --- i, j 라는 데이터가 temp 안에 저장되는 작업을 4번 수행
temp = { (i, j), (i, j), (i, j), (i, j) }
최종적으로 data의 형태는 { (i, j), (i, j), (i, j), (i, j) }
{ (i, j), (i, j), (i, j), (i, j) }
{ (i, j), (i, j), (i, j), (i, j) }
{ (i, j), (i, j), (i, j), (i, j) }
{ (i, j), (i, j), (i, j), (i, j) }
이러한 data를 tbl (JTable) 안의 tbModel (MyTableModel) 안의 list (ArrayList)에 저장한다.
그리고 데이터를 가진 tbModel을 tbl에 붙인다. (setModel)
fireTableDataChanged() 메소드를 사용하여 tbModel에 변동이 생겼음을 자바에게 알려준다.
--> 결과적으로 버튼 클릭시 data배열의 데이터가 table에 표 형태로 출력된다.
14. 화면에서 "확인"버튼을 눌렀을 때 작동할 마우스 이벤트를 작성
(클릭시 작동할 메소드만 필요하므로 Adapter 상속)
tbl에서 데이터를 클릭할 때마다 해당되는 행과 열 값을 받아와서 콘솔에서 r : c 형태로 출력
--> 데이터의 좌표나 마찬가지임
<JTableTest 클래스 소스 코드>
package JTable;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
public class JTableTest extends JFrame { // 3.
// 멤버변수 (화면에 쓰일 요소) // 5.
JButton btn;
JTable tbl;
MyTableModel tbModel;
JTableTest() { // 2.
// 객체 생성 // 6.
btn = new JButton("확인");
// tbl = new JTable();
tbModel = new MyTableModel(); // 10.
tbl = new JTable(tbModel); // 10.
// 화면 구성 // 7.
add(btn, BorderLayout.NORTH);
add(new JScrollPane(tbl), BorderLayout.CENTER);
// 화면 출력
setBounds(100,100,600,500); // 4.
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 버튼 이벤트
btn.addActionListener(new ActionListener() { // 12.
@Override
public void actionPerformed(ActionEvent e) {
change(); // 13.
}
}); /** end of 버튼 이벤트 **/
// JTable에 쓰일 마우스 이벤트
tbl.addMouseListener(new MouseAdapter() { // 14.
@Override
public void mouseClicked(MouseEvent e) {
int r = tbl.getSelectedRow();
int c = tbl.getSelectedColumn();
System.out.println(r+":"+c); // r행 c열 콘솔로 확인 가능
}
}); /** end of 마우스 이벤트 **/
} /** end of JTableTest **/
void change() { // 13.
// 나중에 DB에서 데이터를 가져왔다고 가정, 여기서는 숫자열로 생성함
ArrayList data = new ArrayList();
for (int i=0; i<5; i++) {
ArrayList temp = new ArrayList();
for (int j=0; j<4; j++) {
temp.add(i+","+j); // int -> Integer 자동형변환
}
data.add(temp);
}
tbModel.list = data;
tbl.setModel(tbModel);
tbModel.fireTableDataChanged();
} /** end of change **/
// 테이블모델 - JTable의 데이터를 관리하는 클래스
class MyTableModel extends AbstractTableModel { // 8.
ArrayList list = new ArrayList(); // 9.
String [] columnNames = {"하나", "둘", "Third", "4" }; // 제목이 됨
@Override
public int getRowCount() {
return list.size(); // = 행의 갯수
}
@Override
public int getColumnCount() {
return columnNames.length; // = 열의 갯수
}
@Override
public Object getValueAt(int row, int col) {
ArrayList temp = (ArrayList)list.get(row); // get()는 Object 타입이므로 형 변환이 필요함
Object obj = temp.get(col);
return obj;
}
public String getColumnName(int col) { // 11.
return columnNames[col];
}
} /** end of MyTableModel **/
public static void main(String[] args) {
new JTableTest(); // 1.
}
}
2. 비디오샵 - 비디오관리
1. VideoView 클래스에서 입고 버튼 클릭시 registVideo() 호출
(1) 각각의 TextField에 입력된 값을 얻어와서 변수에 저장
(2) VideoVO에 변수에 저장된 값들을 저장
(변수들의 데이터 타입이 통일되지 않았기 때문에 클래스로 묶는 것)
(3) VideoDAO클래스의 insertVideo() 호출하면서 vo와 count값을 넘겨줌
2. VideoDAO 클래스에서
(1) 드라이버 로딩 및 Connection 연결객체 얻어오기
(2) vo에 들어있는 데이터가 삽입되도록 SQL 문장 및 전송객체 만들기
(3) executeUpdate()로 SQL 전송
(4) 전송결과를 result값으로 받아 성공 여부 확인
1. VideoView 클래스에서 검색버튼 클릭시 searchVideo() 호출
(1) 콤보박스와 텍스트필드에서 입력값 얻어와서 변수에 저장
(2) VideoDAO클래스의 searchVideo() 호출하면서 idx와 word값을 넘겨줌
2. VideoDAO 클래스에서
(1) 인자 2개를 받아 String 배열에 저장
(2) Statement 로 SQL문 작성하여 전송
-> SQL문 내에서 자바의 변수를 대입하여 사용할 때,
PrepareStatement에서는 물음표?에 자동으로 ' '를 붙이기 때문에
' colName[idx] ' , ' word' 가 된다.
ex) SELECT vnum, title, dir, act FROM video WHERE ' colName[idx] ' LIKE % ' word' % ;
---> ' 으로 인해 잘못된 SQL 문
(3) 오라클에서 ResultSet으로 받아온 데이터를 ArrayList에 저장
(4) 데이터가 저장된 data를 반환
3. VideoView 클래스에서
(1) searchVideo()의 결과값을 ArrayList data로 받아옴
(2) tbModelVideo 내부의 ArrayList data에 (1)의 데이터를 저장
(3) JTable에 (2)를 넣은 뒤, fireTableDataChanged()로 변경 신호를 보냄
--> 자바에서 데이터 업데이트된 것이 출력되도록 화면을 구성함
1. VideoView 클래스에서
(1) JTable을 클릭했을 때 작동할 마우스 이벤트를 생성
(2) 비디오번호는 DB상에서 맨 앞에 위치한 0번째 컬럼이므로 int col = 0으로 지정
(3) JTable에서 클릭했을 때의 몇 번째 행인지를 int row에 저장
(4) 원하는 위치(좌표)의 데이터를 가져오는 getValueAt() 으로 비디오번호를 추출하여 변수에 저장
(5) searchByPK() 호출하면서 비디오번호가 저장된 변수 vNum 값을 넘겨줌
2. VideoDAO 클래스에서
(1) 인자로 받아온 vNum값을 바탕으로 SQL문 작성 및 전송
(2) vNum에 해당되는 데이터를 ResultSet으로 받아옴
(3) rs에서 각 컬럼명에 해당되는 데이터를 vo에 저장
(4) 데이터가 저장된 vo를 리턴
3. VideoView 클래스에서
(1) searchByPK에서 리턴된 결과를 vo로 받음
(2) vo에 저장된 데이터를 각각의 TextField에 셋팅하여 출력
<VideoVO 클래스 소스 코드>
package videoshop.model.vo;
public class VideoVO {
// 멤버변수 - Video 테이블의 컬럼과 매칭하도록 선언
int vnum;
String title;
String genre;
String dir;
String act;
String sul;
int count;
// 생성자 함수
public VideoVO() {
}
// setter, getter
public int getVnum() {
return vnum;
}
public void setVnum(int vnum) {
this.vnum = vnum;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getGenre() {
return genre;
}
public void setGenre(String genre) {
this.genre = genre;
}
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
}
public String getAct() {
return act;
}
public void setAct(String act) {
this.act = act;
}
public String getSul() {
return sul;
}
public void setSul(String sul) {
this.sul = sul;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
<VideoView 클래스 소스 코드>
package videoshop.view;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.table.AbstractTableModel;
import videoshop.model.VideoDAO;
import videoshop.model.vo.VideoVO;
public class VideoView extends JPanel
{
// member field
JTextField tfVideoNum, tfVideoTitle, tfVideoDirector, tfVideoActor;
JComboBox comVideoJanre;
JTextArea taVideoContent;
JCheckBox cbMultiInsert;
JTextField tfInsertCount;
JButton bVideoInsert, bVideoModify, bVideoDelete;
JComboBox comVideoSearch;
JTextField tfVideoSearch;
JTable tableVideo;
VideoTableModel tbModelVideo;
VideoDAO dao;
//##############################################
// constructor method
public VideoView(){
addLayout(); // 화면설계
initStyle();
eventProc();
connectDB(); // DB연결
}
public void connectDB(){ // DB연결
try {
dao = new VideoDAO();
System.out.println("DB연결 성공 - 비디오관리");
} catch (Exception e) {
System.out.println("DB연결 실패 - 비디오관리");
}
}
public void eventProc(){
ButtonEventHandler hdlr = new ButtonEventHandler();
bVideoInsert.addActionListener(hdlr);
bVideoModify.addActionListener(hdlr);
bVideoDelete.addActionListener(hdlr);
tfVideoSearch.addActionListener(hdlr);
// 다중입고 체크박스 이벤트
cbMultiInsert.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean flag = cbMultiInsert.isSelected();
tfInsertCount.setEditable(flag);
}
}); // end of 다중입고 체크박스 이벤트
/** 검색된 데이터 클릭했을 때 좌측에 비디오정보 출력하기 **/
tableVideo.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int col = 0; // 비디오번호는 0번째 컬럼이라 고정
int row = tableVideo.getSelectedRow();
int vNum = (Integer)tableVideo.getValueAt(row, col);
System.out.println(vNum);
try {
VideoVO vo = dao.searchByPK(vNum);
tfVideoTitle.setText(vo.getTitle());
tfVideoDirector.setText(vo.getDir());
tfVideoActor.setText(vo.getAct());
taVideoContent.setText(vo.getSul());
comVideoJanre.setSelectedItem(vo.getGenre());
tfVideoNum.setText(Integer.toString(vo.getVnum()));
} catch (Exception e1) {
System.out.println("검색 실패:" + e.toString());
e1.printStackTrace();
}
}
}); // end of 비디오정보 출력하기
} // end of eventproc
// 버튼 이벤트 핸들러 만들기
class ButtonEventHandler implements ActionListener{
public void actionPerformed(ActionEvent ev){
Object o = ev.getSource();
if(o==bVideoInsert){
registVideo(); // 비디오 등록
clearTextField();
}
else if(o==bVideoModify){
modifyVideo(); // 비디오 정보 수정
}
else if(o==bVideoDelete){
deleteVideo(); // 비디오 정보 삭제
}
else if(o==tfVideoSearch){
searchVideo(); // 비디오 검색
}
}
}
// 입력창 클리어
public void clearTextField() {
tfVideoTitle .setText(null);
tfVideoActor .setText(null);
tfVideoDirector .setText(null);
taVideoContent.setText(null);
// tfInsertCount.setText("1",5);
}
/** 입고 클릭시 - 비디오 정보 등록 **/
public void registVideo(){
// 1. 화면에서 사용자 입력값 얻어오기
// 2. VedioVO의 멤버변수로 1번값들을 지정
// 3. 모델단(VedioDAO)의 insertVideo() 호출
String genre = (String)comVideoJanre.getSelectedItem();
String title = tfVideoTitle.getText();
String actor = tfVideoActor.getText();
String director = tfVideoDirector.getText();
String content = taVideoContent.getText();
int count = Integer.parseInt(tfInsertCount.getText());
VideoVO vo = new VideoVO();
vo.setGenre(genre);
vo.setTitle(title);
vo.setAct(actor);
vo.setDir(director);
vo.setSul(content);
vo.setCount(count);
try {
dao.insertVideo(vo, count);
} catch (Exception e) {
System.out.println("입고실패:" + e.toString());
e.printStackTrace();
}
}
public void initStyle(){ // 입력하지 못하게 만듬.
tfVideoNum.setEditable(false);
tfInsertCount.setEditable(false);
tfInsertCount.setHorizontalAlignment(JTextField.RIGHT);
}
// 수정 클릭시 - 비디오 정보 수정
public void modifyVideo(){
JOptionPane.showMessageDialog(null, "수정");
}
// 삭제 클릭시 - 비디오 정보 삭제
public void deleteVideo(){
JOptionPane.showMessageDialog(null, "삭제");
}
/** 비디오현황검색 **/
public void searchVideo(){
int idx = comVideoSearch.getSelectedIndex();
String word = tfVideoSearch.getText();
try {
ArrayList data = dao.searchVideo(idx, word);
tbModelVideo.data = data;
tableVideo.setModel(tbModelVideo);
tbModelVideo.fireTableDataChanged();
} catch (Exception e) {
System.out.println("검색실패:" + e.toString());
e.printStackTrace();
}
}
// 화면설계 메소드
public void addLayout(){
//멤버변수의 객체 생성
tfVideoNum = new JTextField();
tfVideoTitle = new JTextField();
tfVideoDirector = new JTextField();
tfVideoActor = new JTextField();
String []cbJanreStr = {"멜로","엑션","스릴","코미디"};
comVideoJanre = new JComboBox(cbJanreStr);
taVideoContent = new JTextArea();
cbMultiInsert = new JCheckBox("다중입고");
tfInsertCount = new JTextField("1",5);
bVideoInsert = new JButton("입고");
bVideoModify = new JButton("수정");
bVideoDelete = new JButton("삭제");
String []cbVideoSearch = {"제목","감독"};
comVideoSearch = new JComboBox(cbVideoSearch);
tfVideoSearch = new JTextField(15);
tbModelVideo = new VideoTableModel();
tableVideo = new JTable(tbModelVideo);
//*********************************************************************
// 화면 구성
setLayout(new GridLayout(1,2));
// 왼쪽 영역
JPanel pLeft = new JPanel();
pLeft.setBorder(new TitledBorder("비디오정보 입력"));
pLeft.setLayout(new BorderLayout());
// 왼쪽 중앙 영역
JPanel pLeftCenter = new JPanel();
pLeftCenter.setLayout(new BorderLayout());
JPanel pLeftCenterNorth = new JPanel();
pLeftCenterNorth.setLayout(new GridLayout(5,2));
pLeftCenterNorth.add(new JLabel("비디오번호"));
pLeftCenterNorth.add(tfVideoNum);
pLeftCenterNorth.add(new JLabel("장르"));
pLeftCenterNorth.add(comVideoJanre);
pLeftCenterNorth.add(new JLabel("제목"));
pLeftCenterNorth.add(tfVideoTitle);
pLeftCenterNorth.add(new JLabel("감독"));
pLeftCenterNorth.add(tfVideoDirector);
pLeftCenterNorth.add(new JLabel("배우"));
pLeftCenterNorth.add(tfVideoActor);
JPanel pLeftCenterCenter = new JPanel();
pLeftCenterCenter.setLayout(new BorderLayout());
pLeftCenterCenter.add(new JLabel("설명"),BorderLayout.WEST);
pLeftCenterCenter.add(taVideoContent, BorderLayout.CENTER);
pLeftCenter.add(pLeftCenterNorth, BorderLayout.NORTH);
pLeftCenter.add(pLeftCenterCenter, BorderLayout.CENTER);
// 왼쪽 아래 영역
JPanel pLeftSouth = new JPanel();
pLeftSouth.setLayout(new GridLayout(2,1));
JPanel pLeftSouth1 = new JPanel();
pLeftSouth1.setBorder(new TitledBorder("다중입력시 선택하세요"));
pLeftSouth1.add(cbMultiInsert);
pLeftSouth1.add(tfInsertCount);
pLeftSouth1.add(new JLabel("개"));
JPanel pLeftSouth2 = new JPanel();
pLeftSouth2.setLayout(new GridLayout(1,3));
pLeftSouth2.add(bVideoInsert);
pLeftSouth2.add(bVideoModify);
pLeftSouth2.add(bVideoDelete);
pLeftSouth.add(pLeftSouth1);
pLeftSouth.add(pLeftSouth2);
pLeft.add(pLeftCenter, BorderLayout.CENTER);
pLeft.add(pLeftSouth, BorderLayout.SOUTH);
// 오른쪽 영역
JPanel pRight = new JPanel();
pRight.setBorder(new TitledBorder("비디오검색"));
pRight.setLayout(new BorderLayout());
JPanel pRightNorth = new JPanel();
pRightNorth.add(comVideoSearch);
pRightNorth.add(tfVideoSearch);
pRight.add(pRightNorth, BorderLayout.NORTH);
pRight.add(new JScrollPane(tableVideo), BorderLayout.CENTER);
add(pLeft);
add(pRight);
}
//화면에 테이블 붙이는 메소드
class VideoTableModel extends AbstractTableModel {
ArrayList data = new ArrayList();
String [] columnNames = {"비디오번호","제목","감독","배우"};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.size();
}
public Object getValueAt(int row, int col) {
ArrayList temp = (ArrayList)data.get( row );
return temp.get( col );
}
public String getColumnName(int col){
return columnNames[col];
}
}
}
<VideoDAO 클래스 소스 코드>
package videoshop.model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import videoshop.model.vo.VideoVO;
public class VideoDAO{
Connection con;
String url = "jdbc:oracle:thin:@192.168.0.17:1521:orcl";
String user = "scott";
String pass = "tiger";
public VideoDAO() throws Exception{
// 1. 드라이버로딩
// 2. Connection 연결객체 얻어오기
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(url,user, pass);
}
/** VideoView의 registVideo()에서 작동할 메소드 **/
public void insertVideo(VideoVO vo, int count) throws Exception {
PreparedStatement ps = null;
try {
// 3. sql 문장 만들기
String sql = "INSERT INTO video "
+ "(vnum, title, genre, dir, act, sul, cnt) "
+ "VALUES (video_num.NEXTVAL, ?,?,?,?,?,?)";
// 4. sql 전송객체 (PreparedStatement)
ps = con.prepareStatement(sql);
ps.setString(1, vo.getTitle());
ps.setString(2, vo.getGenre());
ps.setString(3, vo.getDir());
ps.setString(4, vo.getAct());
ps.setString(5, vo.getSul());
ps.setInt (6, vo.getCount());
// 5. sql 전송
int result = 0;;
for (int i=0; i<count; i++) {
result = ps.executeUpdate();
}
System.out.println(result+"행을 입력");
} finally {
// 6. 닫기 ( 연결객체 닫지 않음 )
try { ps.close(); } catch(Exception e) {}
}
} // end of insertVideo
/** VideoView의 searchVideo()에서 작동할 메소드 **/
public ArrayList searchVideo(int idx, String word) throws Exception {
String[] colName = {"title", "dir"};
String sql = "SELECT vnum, title, dir, act FROM video WHERE "
+ colName[idx] + " LIKE '%" + word + "%'";
// sql문 내에 자바의 변수를 사용할 경우에는 자동 '' 문제로 ps를 사용할 수 없다.
System.out.println(sql);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
ArrayList data = new ArrayList();
while (rs.next()) {
ArrayList temp = new ArrayList();
temp.add(rs.getInt("vnum"));
temp.add(rs.getString("title"));
temp.add(rs.getString("dir"));
temp.add(rs.getString("act"));
data.add(temp);
}
rs.close();
st.close();
return data;
}
/** 검색된 데이터를 클릭했을 때 좌측에 비디오정보 출력하기**/
public VideoVO searchByPK(int vNum) throws Exception {
VideoVO vo = new VideoVO();
PreparedStatement ps = null;
try {
String sql = "SELECT * FROM video WHERE vnum = ?";
ps = con.prepareStatement(sql);
ps.setInt(1, vNum);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
vo.setTitle (rs.getString("TITLE"));
vo.setDir (rs.getString("DIR"));
vo.setAct(rs.getString("ACT"));
vo.setSul(rs.getString("SUL"));
vo.setGenre(rs.getString("GENRE"));
vo.setVnum(rs.getInt("VNUM"));
}
} finally {
try { ps.close(); } catch(Exception e) {}
}
return vo;
} // end of searchByPK
}
3. 비디오샵 - 대여관리
>> 화면구성 + 버튼 이벤트
<RentView 클래스 소스 코드>
package videoshop.view;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
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.border.TitledBorder;
import javax.swing.table.AbstractTableModel;
public class RentView extends JPanel
{
// 멤버 변수
JTextField tfRentTel, tfRentCustName, tfRentVideoNum, tfReturnVideoNum;
JButton bRent, bReturn;
JTable tableRent;
RentTableModel tableRentList;
public RentView(){
addLayout();
eventProc();
} // end of 생성자함수
public void eventProc() {
ButtonEventHandler hdlr = new ButtonEventHandler();
bRent.addActionListener(hdlr);
bReturn.addActionListener(hdlr);
} // end of eventProc
class ButtonEventHandler implements ActionListener {
public void actionPerformed(ActionEvent ev) {
Object o = ev.getSource();
if (o==bRent) {
rentVideo();
}
else if (o==bReturn) {
returnVideo();
}
}
}// end of 버튼 이벤트 핸들러
public void rentVideo() {
JOptionPane.showMessageDialog(null, "대여");
}
public void returnVideo() {
JOptionPane.showMessageDialog(null, "반납");
}
public void addLayout() {
tfRentTel = new JTextField(20);
tfRentCustName = new JTextField(20);
tfRentVideoNum = new JTextField(20);
tfReturnVideoNum = new JTextField(20);
bRent = new JButton("대여");
bReturn = new JButton("반납");
tableRentList = new RentTableModel();
tableRent = new JTable(tableRentList);
//**********************************************//
setLayout(new BorderLayout());
JPanel pNorth = new JPanel();
pNorth.setLayout(new GridLayout(1,2));
JPanel pNorthLeft = new JPanel();
pNorthLeft.setBorder(new TitledBorder("대여"));
pNorthLeft.setLayout(new GridLayout(4,2));
pNorthLeft.add(new JLabel("전 화 번 호"));
pNorthLeft.add(tfRentTel);
pNorthLeft.add(new JLabel("고 객 명"));
pNorthLeft.add(tfRentCustName);
pNorthLeft.add(new JLabel("비디오 번호"));
pNorthLeft.add(tfRentVideoNum);
pNorthLeft.add(bRent);
JPanel pNorthRight= new JPanel();
pNorthRight.setBorder(new TitledBorder("반납"));
pNorthRight.add(new JLabel("비디오 번호"));
pNorthRight.add(tfReturnVideoNum);
pNorthRight.add(bReturn);
pNorth.add(pNorthLeft);
pNorth.add(pNorthRight);
JPanel pCenter = new JPanel();
pCenter.setLayout(new BorderLayout());
pCenter.add(new JScrollPane(tableRent), BorderLayout.CENTER);
add(pNorth, BorderLayout.NORTH);
add(pCenter, BorderLayout.CENTER);
} // end of addLayout
class RentTableModel extends AbstractTableModel {
ArrayList data = new ArrayList();
String [] columnNames
= {"비디오번호", "비디오제목", "고 객 명", "전화번호", "반납예정일", "반납여부"};
public int getRowCount() {
return data.size();
}
public int getColumnCount() {
return columnNames.length;
}
public Object getValueAt(int row, int col) {
ArrayList temp = (ArrayList)data.get(row);
return temp.get(col);
}
public String getColumnName(int col) {
return columnNames[col];
}
}
}