---
title: "Java 정리 40"
date: "2019-01-11"
tags: ["Java"]
status: archived
verified: false
---

---

## 배열로 컴포넌트 생성

![01](/md/legacy-assets/java/40/01.webp)

* **JButton 10개로 10개의 이벤트 처리 구현**
    * 김정윤 - 서울은 춥다
    * 박영민 - 각자 해보세요
    * 노진경 - 담배 피러 가자
    * 김희철 - 집에 가고 싶다
    * 김정운 - 재찬이가 좋아요
    * 이재찬 - 조퇴하고 싶다..
    * 이재현 - 형 제가 캐리할게요
    * 공선의 - 수영하고 싶다.
    * 김건하 - 점심 먹으러 가자
    * 오영근 - 주말에 공부해라
* 버튼 10개를 만들고 각각 Label주고 이벤트를 붙여야 함
  * **배열을 사용하여 구현하면 간단해진다.**

```java
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;
    }
}
```

```java
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();
     }
}
```

![02](/md/legacy-assets/java/40/02.webp)



## JTable에 컴포넌트 넣기

![03](/md/legacy-assets/java/40/03.webp)

* JTable에 ImageIcon, String을 rowData로 추가하여 위와 같은 결과를 보이시오.
    * 일반적으로 JTable에 ImageIcon을 Object형태로 넣으면 아래와 같은 결과가 나온다.

![04](/md/legacy-assets/java/40/04.webp)


* **이미지가 아니고 왜 문자열이 나왔을까?**
    * 객체(ImageIcon)를 집어넣으면 toString()이 붙어서 문자열 출력된다.
        * **입력된 객체가 그대로 출력되도록 변경이 필요**
        * **Override로 부모(JTable)의 기능을 수정**해야 한다

```java
jt = new JTable(dtm) {
     @Override
     public Class<?> getColumnClass(int column) {
          // 어떤 행이든 간에 입력된 column의 class를  반환하도록 한 것
          return getValueAt(0, column).getClass();
     }
};
```

```java
@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에 저장하기

![05](/md/legacy-assets/java/40/05.webp)

* **명함 정보 저장하기**
    * 이름, 주소, 이미지를 입력받고 JTable에 추가
    * 이미지는 FileDialog로 선택
    * 입력을 누르면 DB에 저장되고 테이블 아이템으로 추가
* **이미지를 DB에 어떻게 저장하지?**
    * 이미지를 DB에 넣고 싶으면 **BLOB**을 사용하면 됨
        * 그러나 **가능하면 DB에 파일을 저장하지 않는다.**
    * **이미지는 경로와 파일명만 DB에 저장한다.**
        * 경로도 중복되므로 파일명만 저장하도록 한다.
        * 실제 파일은 storage에 복사하여 저장
* **클래스 다이어그램**
    * 껍데기 보여주는 **View**
    * 이벤트 처리하는 클래스가 **Controller**
    * DB와 통신하는 클래스를 **DAO**
        * DB와 통신할때 주고받는 **DTO(VO)**

![06](/md/legacy-assets/java/40/06.webp)


* 예제를 위한 DB Table 생성
  * 테스트의 용이성을 위해 가데이터를 추가해준다.

```sql
--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 먼저 생성**

![07](/md/legacy-assets/java/40/07.webp)


* 구현한 [namecard 패키지](https://github.com/younggeun0/SSangYoung/tree/master/dev/workspace/sistJavaStudy2/src/date190111/namecard)
