• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Java 정리 40

11 Jan 2019

Reading time ~3 minutes

Java 정리 40 - 배열로 컴포넌트 생성, JTable에 컴포넌트 넣기, image file을 DB에 저장하기


배열로 컴포넌트 생성

01

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

02

JTable에 컴포넌트 넣기

03

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

04

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

05

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

06

  • 예제를 위한 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 먼저 생성

07

  • 구현한 namecard 패키지


Java