Java 일지 #8 Frame(2)
8.삭제, 수정 구현
-변수 수정
*기존 코드에서는 변수를 사용하는 순간에 만들었는데 이런 것 보다는 상단에 사용할 변수를 만들어 두자
//변수 만들기 초기값은 0, null
private JLabel a1 = null;
private JButton button1 =null;
private JButton button2 =null;
private MyTable table = null;
**ex)
기존 code => JLabel a1 = new JLabel("위쪽");
변수 생성 후 code => a1 = new JLabel("위쪽");
*기존 MyPanel3.java의 목록 불러오기 코드 수정
ItemDB db = new ItemDB();
List<Item> list = db.findAllItems();
MyTable table = new MyTable(list);
JScrollPane jscp1 = new JScrollPane(table);
this.add(jscp1, BorderLayout.CENTER);
에서
List<Item> list = db.findAllItems();
MyTable table = new MyTable(list);
해당 code 삭제
**MyTable.java code 수정
MyTable 생성자 수정
기존 code
// 생성자 새로 생성
public MyTable(List<Item> list) {
this.list = list;
// 스스로 데이터를 추가하는 방법
this.setModel(setData());
}
에서
// 생성자 새로 생성
public MyTable() {
this.db = new ItemDB();
this.list = db.findAllItems();
// 스스로 데이터를 추가하는 방법
this.setModel(setData());
}
으로 수정하기
-수정, 삭제 버튼 활성화(MyPanel3.java)
*버튼 클릭 시 나타날 반응 구현
//여기가 버튼 클릭 같은 이벤트 발생 시 자동으로 호출되는 메소드
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button1 ) { //수정버튼 클릭
System.out.println("수정");
}
else if(e.getSource() == button2) { //삭제버튼 클릭
System.out.println("삭제");
}
}
*기존 버튼에 이벤트 사용 등록 입력
JPanel p1 = new JPanel(); //임시 패널
p1.setLayout(new FlowLayout()); //순차적으로 배치
button1 = new JButton("수정");
button2 = new JButton("삭제");
button1.addActionListener(this); //이벤트 사용등록
button2.addActionListener(this); //이벤트 사용등록
p1.add(button1);
p1.add(button2);
this.add(p1, BorderLayout.SOUTH); //아래쪽
*버튼 활성화 확인
-삭제 구현
**삭제, 수정을 하게 되면 내용이 변경되는데 기존의 코드를 사용하면 할 때마다 다시 불러와야 한다.
그래서 삭제, 수정 코드 입력 시 마지막에 새로운 데이터를 불러오는 코드도 같이 입력해 주자.
*삭제 코드 입력(MyTable.java)
//데이터 삭제
public void deleteItems() {
//선택된 라인의 정보, 개수
int[] rows = this.getSelectedRows();
if(rows.length <= 0){ //선택하지 않고 삭제 버튼 클릭 시
JOptionPane.showMessageDialog(this, "항목을 선택하세요", "항목선택", JOptionPane.WARNING_MESSAGE);
}
for(int row : rows){
String code = this.getModel().getValueAt(row, 0).toString();
db.deleteItem(Integer.parseInt(code) );
//메소드 호출방법
//클래스 obj = new클래스()
//obj.메소드()
//새로운 데이터를 가져와서 다시 생성
this.list = db.findAllItems();
this.setModel(setData());
}
}
**중간에 if문을 삽입해 선택하지 않고 삭제 버튼 클릭 시 경고창이 나타나도록 한다.
**삭제 완료 후 데이터를 새롭게 불러올 수 있게 한다.
*삭제 코드 입력(MyPanel.java)
//여기가 버튼 클릭 같은 이벤트 발생 시 자동으로 호출되는 메소드
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button1 ) { //수정버튼 클릭
System.out.println("수정");
}
else if(e.getSource() == button2) { //삭제버튼 클릭
System.out.println("삭제");
}
}
이전의 코드에서 System.out.println("삭제"); 부분을 지우고
else if(e.getSource() == button2) { //삭제버튼 클릭
//확인 0, 취소 2
int ret = JOptionPane.showConfirmDialog(null,"삭제하시겠습니까?","삭제",JOptionPane.OK_CANCEL_OPTION);
if(ret == 0){
table.deleteItems();
}
}
}
로 대체 한다.
**삭제 시 바로 삭제되지 않고 삭제 할 지를 묻는 알림창을 넣어 준다.
*삭제 구현
-수정 구현
*수정 코드 입력(MyTable.java)
//데이터 수정
public void updateItems() {
for(int i=0; i<this.getRowCount(); i++){
String code = this.getModel().getValueAt(i, 0).toString();
String name = this.getModel().getValueAt(i, 1).toString();
String text = this.getModel().getValueAt(i, 2).toString();
String price = this.getModel().getValueAt(i, 3).toString();
String quantity = this.getModel().getValueAt(i, 4).toString();
Item item = new Item( //Item.java의 타입과 동일하게 입력
Integer.parseInt(code),
name,
text,
Integer.parseInt(price),
Long.parseLong(quantity) );
db.updateItem(item);
}
//새로운 데이터를 가져와서 다시 생성
this.list = db.findAllItems();
this.setModel(setData());
}
**Item에서 code 등 정보를 받을 때 Item.java와 타입을 동일하게 입력해야 한다.
*수정 코드 입력(MyPanel.java)
//여기가 버튼 클릭 같은 이벤트 발생 시 자동으로 호출되는 메소드
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button1 ) { //수정버튼 클릭
System.out.println("수정");
}
else if(e.getSource() == button2) { //삭제버튼 클릭
System.out.println("삭제");
}
}
삭제와 마찬가지로 System.out.println("수정"); 을 지우고
if(e.getSource() == button1 ) { //수정버튼 클릭
table.updateItems();
}
을 입력한다.
*수정 구현(id 10016)