Java 정리 40
11 Jan 2019
Reading time ~3 minutes
Java 정리 40 - 배열로 컴포넌트 생성, JTable에 컴포넌트 넣기, image file을 DB에 저장하기
배열로 컴포넌트 생성
-
JButton 10개로 10개의 이벤트 처리 구현
- 김정윤 - 서울은 춥다
- 박영민 - 각자 해보세요
- 노진경 - 담배 피러 가자
- 김희철 - 집에 가고 싶다
- 김정운 - 재찬이가 좋아요
- 이재찬 - 조퇴하고 싶다..
- 이재현 - 형 제가 캐리할게요
- 공선의 - 수영하고 싶다.
- 김건하 - 점심 먹으러 가자
- 오영근 - 주말에 공부해라
- 버튼 10개를 만들고 각각 Label주고 이벤트를 붙여야 함
- 배열을 사용하여 구현하면 간단해진다.
public class SimpleMsgButtonsView extends JFrame {
private JButton[] jbtName;
private String[] names;
public SimpleMsgButtonsView() {
jbtName = new JButton[10];
names = new String[]{"김정윤", "박영민", "노진경",
"김희철", "김정운", "이재찬", "이재현",
"공선의", "김건하", "오영근" };
setLayout(new GridLayout(5, 2));
SimpleMsgButtonsEvt smbe = new SimpleMsgButtonsEvt(this);
addWindowListener(smbe);
for (int i=0; i<jbtName.length; i++) {
jbtName[i] = new JButton(names[i]);
jbtName[i].addActionListener(smbe);
add(jbtName[i]);
}
setBounds(400, 250, 400, 600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new SimpleMsgButtonsView();
}
public JButton[] getJbtName() {
return jbtName;
}
}
public class SimpleMsgButtonsEvt extends WindowAdapter implements ActionListener {
private SimpleMsgButtonsView smbv;
private String[] msg;
public SimpleMsgButtonsEvt(SimpleMsgButtonsView smbv) {
this.smbv = smbv;
msg = new String[] {
"서울은 춥다.", "각자 해보세요.", "담배피러 가자",
"집에 가고 싶다.", "재찬이가 좋아요", "조퇴하고 싶다",
"형 제가 캐리할게요", "수영하고 싶다", "점심 먹으러 가자",
"주말에 공부해라"
};
}
@Override
public void actionPerformed(ActionEvent e) {
for(int i=0; i<smbv.getJbtName().length; i++) {
if (e.getSource() == smbv.getJbtName()[i]) {
JOptionPane.showMessageDialog(smbv, msg[i]);
break;
}
}
}
@Override
public void windowClosing(WindowEvent e) {
smbv.dispose();
}
}
JTable에 컴포넌트 넣기
- JTable에 ImageIcon, String을 rowData로 추가하여 위와 같은 결과를 보이시오.
- 일반적으로 JTable에 ImageIcon을 Object형태로 넣으면 아래와 같은 결과가 나온다.
-
이미지가 아니고 왜 문자열이 나왔을까?
- 객체(ImageIcon)를 집어넣으면 toString()이 붙어서 문자열 출력된다.
- 입력된 객체가 그대로 출력되도록 변경이 필요
- Override로 부모(JTable)의 기능을 수정해야 한다
- 객체(ImageIcon)를 집어넣으면 toString()이 붙어서 문자열 출력된다.
jt = new JTable(dtm) {
@Override
public Class<?> getColumnClass(int column) {
// 어떤 행이든 간에 입력된 column의 class를 반환하도록 한 것
return getValueAt(0, column).getClass();
}
};
@SuppressWarnings("serial")
public class WebSiteTable extends JFrame {
public WebSiteTable() {
JTable jtbWebSite;
DefaultTableModel dtmWebSite;
JScrollPane jspWebSite;
ImageIcon daumImg = new ImageIcon("C:/.../date190111/images/daum.png");
ImageIcon naverImg = new ImageIcon("C:/.../date190111/images/naver.png");
ImageIcon googleImg = new ImageIcon("C:/.../date190111/images/google.png");
String[] columnNames = new String[] { "로고", "URL", "특징" };
Object[][] rowData = new Object[][]{
{ daumImg, "http://daum.net", "카카오프랜즈" },
{ naverImg, "http://naver.net", "웹툰" },
{ googleImg, "http://google.net", "좋은 검색 엔진" }
};
dtmWebSite = new DefaultTableModel(rowData, columnNames) {
// table 아이템 변경 막기
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
// 입력된 클래스가 그대로 Cell(Column)에 표현되도록 method를 Override해야 함
jtbWebSite = new JTable(dtmWebSite) {
@Override
public Class<?> getColumnClass(int column) {
// row - JTable에 입력된 2차원 배열의 행에 속한다면
// 모든 컬럼을 입력된 형으로 반환한다.
// 다시말해, 어떤 행이든 간에 입력된 column의 class를 반환하도록 한 것
return getValueAt(0, column).getClass();
}
};
jtbWebSite.setRowHeight(60); // 행 높이 조절
jtbWebSite.getTableHeader().setReorderingAllowed(false); // 컬럼(열) 이동 막기
jtbWebSite.getTableHeader().setResizingAllowed(false); // 컬럼(열)너비 변경 막기
jtbWebSite.getColumnModel().getColumn(0).setPreferredWidth(200); // 컬럼(열)너비 조절
jspWebSite = new JScrollPane(jtbWebSite);
add(jspWebSite);
setBounds(400, 300, 600, 280);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new WebSiteTable();
}
}
image file을 DB에 저장하기
-
명함 정보 저장하기
- 이름, 주소, 이미지를 입력받고 JTable에 추가
- 이미지는 FileDialog로 선택
- 입력을 누르면 DB에 저장되고 테이블 아이템으로 추가
-
이미지를 DB에 어떻게 저장하지?
- 이미지를 DB에 넣고 싶으면 BLOB을 사용하면 됨
- 그러나 가능하면 DB에 파일을 저장하지 않는다.
-
이미지는 경로와 파일명만 DB에 저장한다.
- 경로도 중복되므로 파일명만 저장하도록 한다.
- 실제 파일은 storage에 복사하여 저장
- 이미지를 DB에 넣고 싶으면 BLOB을 사용하면 됨
-
클래스 다이어그램
- 껍데기 보여주는 View
- 이벤트 처리하는 클래스가 Controller
- DB와 통신하는 클래스를 DAO
- DB와 통신할때 주고받는 DTO(VO)
- 예제를 위한 DB Table 생성
- 테스트의 용이성을 위해 가데이터를 추가해준다.
--DDL
CREATE TABLE namecard(
name VARCHAR2(30) NOT NULL,
addr VARCHAR2(100) NOT NULL,
img VARCHAR2(255) DEFAULT 'no_image.png',
input_date DATE DEFAULT SYSDATE
);
-- 가데이터 추가
INSERT INTO namecard(name,addr,img)
VALUES('김정윤','서울시 강남구 역삼동 황족','no_image.png');
...
- View 먼저 생성
- 구현한 namecard 패키지