### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
리펙토링을 하는게 신입이 하는 일이다
리펙토링 하는 가장 효율적인 방법 => 메서드
최대한 중복을 제거
----------------------------------- 
***. Swing - AWT는 C와 JAVA를 혼합해서 만듬, 그리고 OS와 호환성이 안좋았음 초반에 만들어 진거라서
-> AWT보다 많을 기능과 OS에 적합하게 만들어짐

SWING은 MVC 패턴이다.
Model View Controller

JSP 프로젝트 MVC 패턴으로 만듬
Model은 데이터
View는 어떻게 보여줄까?
Model과 View를 분리 시켰다! 왜? 같은 데이터를 중복해서 쓰면 문제가 생김
그래서 보여주는 기능을 따로 분리해서 모양따로, 데이터 따로 나눔
하나의 데이터를 통해서 다양한 모양을 표현 할 수 있게 해주는 것
컨트롤러는 이 두개 사이에서 조정하는 역할을 함
컨트롤러의 역할은 우리가 사용할 수 없음

----------------------------------- 
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
jdk-8u40-windows-i586-demos.zip
압축품
JFC vs MFC

~\jdk1.8.0_40\demo\jfc\SwingSet2
java -jar SwingSet2.jar
----------------------------------- 
자바의 마스코트, duke 이미지 카페에서 받음
day17 프로젝트 우클릭 - new - folder - resources
폴더 안에 다운 받은 이미지 넣음
----------------------------------- 
iconfinder.com
무료 아이콘을 크기별로 받을 수 있음
-----------------------------------  
-----------------------------------  
-----------------------------------  
###################################
3. 소스코드
-----------------------------------
3-1
/day16/src/awt/menu/MenuTest3.java
 
package awt.menu;
 
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.PrintWriter;
/*
public class MenuTest3 extends Frame implements MouseListener,ActionListener {
     PopupMenu pmenu;
     MenuItem newfile,openfile,closefile,savefile,exit;
     FileDialog fopen, fsave;
     public MenuTest3() {
          pmenu = new PopupMenu();
          newfile = new MenuItem("새파일");
          openfile = new MenuItem("파일열기");
          closefile = new MenuItem("파일닫기");
          savefile = new MenuItem("파일저장");
          exit = new MenuItem("종료");
          fopen = new FileDialog(this, "파일 열기", FileDialog.LOAD);
          fsave = new FileDialog(this, "파일 저장", FileDialog.SAVE);
          pmenu.add(newfile);
          pmenu.add(openfile);
          pmenu.add(savefile);
          pmenu.add(closefile);
          pmenu.addSeparator();
          pmenu.add(exit);
          add(pmenu);
          addMouseListener(this);
          exit.addActionListener(this);
          newfile.addActionListener(this);
          openfile.addActionListener(this);
          closefile.addActionListener(this);
          savefile.addActionListener(this);         
     }
     @Override
     public void actionPerformed(ActionEvent e) {         
          if (e.getSource() == exit) {
               dispose();
          }else if (e.getSource() == newfile) {
              
          }else if (e.getSource() == openfile) {
               fopen.setVisible(true);    
               if (fopen.getFile() != null) {
                    try {
                         FileReader reader = new FileReader(fopen.getDirectory()
                                   + "\\"
                                   + fopen.getFile());
                         BufferedReader br = new BufferedReader(reader);
                         String str;
                         while ((str = br.readLine()) != null) {
                              //area.append(str + "\n");
                         }
                         br.close();
                         reader.close();
                    } catch (Exception e1) {
                         e1.printStackTrace();
                    }
               }
              
          }else if (e.getSource() == closefile) {
              
          }else if (e.getSource() == savefile) {
               fsave.setVisible(true);
               if (fsave.getFile() != null) {
                    try {
                         PrintWriter pw = new PrintWriter(fsave.getDirectory()
                                   + "\\"
                                   + fsave.getFile());
                         //pw.print(area.getText());
                         pw.close();
                    } catch (Exception e1) {
                         e1.printStackTrace();
                    }
               }
          }
     }
     public static void main(String[] args) {
          // TODO 메뉴 세번째 예제
          MenuTest3 et = new MenuTest3();
          et.setSize(300, 400);
          et.setVisible(true);
     }
     @Override
     public void mouseClicked(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
          pmenu.show(this, e.getX(), e.getY());         
     }
     @Override
     public void mouseEntered(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
         
     }
     @Override
     public void mouseExited(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
         
     }
     @Override
     public void mousePressed(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
         
     }
     @Override
     public void mouseReleased(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
         
     }
}
*/
 
//#2 리펙토링 해보자. 나중에 MouseListener를 Adapter로 바꿔라
/*
public class MenuTest3 extends Frame implements MouseListener,ActionListener {
     PopupMenu pmenu;
     MenuItem newfile,openfile,closefile,savefile,exit;
     FileDialog fopen, fsave;
     TextArea area;
     public MenuTest3() {
          pmenu = new PopupMenu();
          area = new TextArea();
         
          itemAdd("새파일", pmenu);
          itemAdd("파일열기", pmenu);
          itemAdd("파일닫기", pmenu);
          itemAdd("파일저장", pmenu);
          itemAdd("종료", pmenu);
         
          fopen = new FileDialog(this, "파일 열기", FileDialog.LOAD);
          fsave = new FileDialog(this, "파일 저장", FileDialog.SAVE);
          add(pmenu);
          //add(area);
          addMouseListener(this);    
     }
     @Override
     public void actionPerformed(ActionEvent e) {         
          if (e.getActionCommand().equals("종료")) {
               dispose();
          }else if (e.getActionCommand().equals("새파일")) {
              
          }else if (e.getActionCommand().equals("파일열기")) {
               fopen.setVisible(true);    
               if (fopen.getFile() != null) {
                    try {
                         FileReader reader = new FileReader(fopen.getDirectory()
                                   + "\\"
                                   + fopen.getFile());
                         BufferedReader br = new BufferedReader(reader);
                         String str;
                         while ((str = br.readLine()) != null) {
                              area.append(str + "\n");
                         }
                         br.close();
                         reader.close();
                    } catch (Exception e1) {
                         e1.printStackTrace();
                    }
               }              
          }else if (e.getActionCommand().equals("파일닫기")) {
              
          }else if (e.getActionCommand().equals("파일저장")) {
               fsave.setVisible(true);
               if (fsave.getFile() != null) {
                    try {
                         PrintWriter pw = new PrintWriter(fsave.getDirectory()
                                   + "\\"
                                   + fsave.getFile());
                         pw.print(area.getText());
                         pw.close();
                    } catch (Exception e1) {
                         e1.printStackTrace();
                    }
               }
          }
     }
    
     private void itemAdd(String title, PopupMenu p){
          MenuItem  mi = new MenuItem(title);
          mi.addActionListener(this);
          p.add(mi);
     }
     public static void main(String[] args) {
          // TODO 메뉴 세번째 예제
          MenuTest3 et = new MenuTest3();
          et.setSize(300, 400);
          et.setVisible(true);
     }
     @Override
     public void mouseClicked(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
          pmenu.show(this, e.getX(), e.getY());         
     }
     @Override
     public void mouseEntered(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
         
     }
     @Override
     public void mouseExited(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
         
     }
     @Override
     public void mousePressed(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
         
     }
     @Override
     public void mouseReleased(java.awt.event.MouseEvent e) {
          // TODO Auto-generated method stub
         
     }
}
*/
//#2 어뎁터 변경
class MouseAdapterProc extends MouseAdapter{
     Frame f;
     PopupMenu p;
     public MouseAdapterProc(Frame f,PopupMenu p ) {
          this.f = f;
          this.p = p;
     }
 
     @Override
     public void mouseClicked(MouseEvent e) {         
          p.show(f, e.getX(), e.getY());    
     }         
}
public class MenuTest3 extends Frame implements ActionListener {
     /**
     *
     */
     private static final long serialVersionUID = 1L;
     PopupMenu pmenu;
     MenuItem newfile,openfile,closefile,savefile,exit;
     FileDialog fopen, fsave;
     TextArea area;
     public MenuTest3() {
          pmenu = new PopupMenu();
          area = new TextArea();
         
          itemAdd("새파일", pmenu);
          itemAdd("파일열기", pmenu);
          itemAdd("파일닫기", pmenu);
          itemAdd("파일저장", pmenu);
          itemAdd("종료", pmenu);
         
          fopen = new FileDialog(this"파일 열기", FileDialog.LOAD);
          fsave = new FileDialog(this"파일 저장", FileDialog.SAVE);
 
          add(pmenu);
          //add(area);
          addMouseListener(new MouseAdapterProc(this,pmenu));    
     }
 
     @Override
     public void actionPerformed(ActionEvent e) {         
          if (e.getActionCommand().equals("종료")) {
               dispose();
          }else if (e.getActionCommand().equals("새파일")) {
              
          }else if (e.getActionCommand().equals("파일열기")) {
               fopen.setVisible(true);    
               if (fopen.getFile() != null) {
                    try {
                         FileReader reader = new FileReader(fopen.getDirectory()
                                   + "\\"
                                   + fopen.getFile());
                         BufferedReader br = new BufferedReader(reader);
                         String str;
                         while ((str = br.readLine()) != null) {
                              area.append(str + "\n");
                         }
                         br.close();
                         reader.close();
                    } catch (Exception e1) {
                         e1.printStackTrace();
                    }
               }              
          }else if (e.getActionCommand().equals("파일닫기")) {
              
          }else if (e.getActionCommand().equals("파일저장")) {
               fsave.setVisible(true);
               if (fsave.getFile() != null) {
                    try {
                         PrintWriter pw = new PrintWriter(fsave.getDirectory()
                                   + "\\"
                                   + fsave.getFile());
                         pw.print(area.getText());
                         pw.close();
                    } catch (Exception e1) {
                         e1.printStackTrace();
                    }
               }
          }
     }
    
     private void itemAdd(String title, PopupMenu p){
          MenuItem  mi = new MenuItem(title);
          mi.addActionListener(this);
          p.add(mi);
     }
 
     public static void main(String[] args) {
          // TODO 메뉴 세번째 예제
          MenuTest3 et = new MenuTest3();
          et.setSize(300400);
          et.setVisible(true);
     }    
}
----------------------------------- 
3-2
/day17/src/swing/SwingTest1.java
 
package swing;
 
import java.awt.FlowLayout;
import java.awt.Image;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
 
public class SwingTest1 extends JFrame{
     JButton b1;
     ImageIcon icon1, icon2;
     public SwingTest1() {
          setLayout(new FlowLayout());
          icon1 = new ImageIcon(getClass().getResource("/resources/duke_box.gif"));
          icon2 = new ImageIcon(getClass().getResource("/resources/duke_flip.gif"));
          b1 = new JButton("버튼");
          b1.setIcon(icon1);
          b1.setPressedIcon(icon2);
          add(b1);
          setSize(300,400);
          setVisible(true);
          this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
 
     public static void main(String[] args) {
          // TODO Swing 첫번째 예제
          new SwingTest1();
     }
}
----------------------------------- 
3-3
/day17/src/swing/SwingTest2.java
 
package swing;
 
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Image;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.BevelBorder;
import javax.swing.border.EtchedBorder;
 
public class SwingTest2 extends JFrame{
     JButton b1;
     ImageIcon icon1;
     JLabel label;
     public SwingTest2() {
          setLayout(new FlowLayout());
          icon1 = new ImageIcon(getClass().getResource("/resources/duke_pencil.gif"));
          b1 = new JButton("버튼");
          label = new JLabel("스윙 라벨입니다.", icon1, JLabel.CENTER);
          add(b1);
          add(label);
         
          label.setBorder(new EtchedBorder(Color.RED,Color.GRAY));
          b1.setBorder(new BevelBorder(BevelBorder.LOWERED));
     }
 
     public static void main(String[] args) {
          // TODO Swing 두번째 예제
          SwingTest2 st = new SwingTest2();
          st.setSize(300,400);
          st.pack();//내용에 맞게 사이즈를 조절해줌
          st.setVisible(true);
          st.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
}
----------------------------------- 
3-4
/day17/src/swing/SwingTest3.java
 
package swing;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
 
public class SwingTest3 extends JFrame implements ActionListener, KeyListener {
     JButton btn;
     JTextField field;
     JLabel label;
 
     public SwingTest3() {
          // 화면상의 길이
          field = new JTextField(30);
          btn = new JButton("확인");
          label = new JLabel("안녕하세요......");
          add("Center", field);
          add("East", btn);
          add("South", label);
          btn.addActionListener(this);
          field.addKeyListener(this);
     }
 
     @Override
     public void actionPerformed(ActionEvent e) {
          if (e.getSource() == btn) {
               label.setText(field.getText());
               field.setText("");
          }
     }
 
     public static void main(String[] args) {
          // TODO Swing 세번째 예제
          SwingTest3 st = new SwingTest3();
          st.pack();// 내용에 맞게 사이즈를 조절해줌
          st.setVisible(true);
          st.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
 
     @Override
     public void keyTyped(KeyEvent e) {
          // TODO Auto-generated method stub
          if (e.getKeyChar() == KeyEvent.VK_ENTER) {
               if (field.getText().isEmpty()) {
                    //JOptionPane.showMessageDialog(null, "반드시 데이터를 입력해야 합니다.");
                    //String str = JOptionPane.showInputDialog("이유를 적어봐");
                    int num = JOptionPane.showConfirmDialog(null"아무거나 선택하시오""타이틀 입력", JOptionPane.YES_NO_CANCEL_OPTION);
                    return;
               }    
               label.setText(field.getText());
               field.setText("");         
          }
     }
 
     @Override
     public void keyPressed(KeyEvent e) {
          // TODO Auto-generated method stub
     }
 
     @Override
     public void keyReleased(KeyEvent e) {
          // TODO Auto-generated method stub
 
     }
}
----------------------------------- 
3-
/day17/src/swing/SwingTest4.java
 
package swing;
 
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
 
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
 
public class SwingTest4 extends JFrame {
     JTree tree;
     JLabel label;
 
     public SwingTest4() {
          // MODEL
          DefaultMutableTreeNode root = new DefaultMutableTreeNode("커피");
          DefaultMutableTreeNode step1 = new DefaultMutableTreeNode("자바 커피");
          DefaultMutableTreeNode step2 = new DefaultMutableTreeNode("원두 커피");
          DefaultMutableTreeNode step2_1 = new DefaultMutableTreeNode("아메리카노");
          DefaultMutableTreeNode step2_2 = new DefaultMutableTreeNode("헤이즐넛");
          DefaultMutableTreeNode step2_3 = new DefaultMutableTreeNode("라떼");
 
          root.add(step1);
          root.add(step2);
          step2.add(step2_1);
          step2.add(step2_2);
          step2.add(step2_3);
          tree = new JTree(root);
          tree.addMouseListener(new MouseHandler());
          // add(tree);
 
          // #1 1개의 scroll 추가
          // JScrollPane scroll = new JScrollPane(tree);
 
          // #2 여러개의 scroll 추가 방법
          JScrollPane scroll = new JScrollPane();
          scroll.getViewport().add(tree);
          add(scroll);
 
          label = new JLabel("여기에 선택한 항목이 나타납니다.");
          add("South", label);
     }
 
     class MouseHandler extends MouseAdapter {
 
          @Override
          public void mousePressed(MouseEvent e) {
               int selRow = tree.getRowForLocation(e.getX(), e.getY());
              
               //선택한 위치에 tree의 경로를 가져옴
               TreePath tp = tree.getPathForLocation(e.getX(), e.getY());
              
               if-!= selRow){
                    //label.setText(String.valueOf(selRow));
                    //#3 더블클릭 체크
                    if (e.getClickCount() == 2) {
                         label.setText(tp.getLastPathComponent().toString());
                    }
               }              
          }
 
     }
 
     public static void main(String[] args) {
          // TODO Swing 네번째 예제
          SwingTest4 st = new SwingTest4();
          // st.setSize(300,400);
          st.pack();// 내용에 맞게 사이즈를 조절해줌
          st.setVisible(true);
          st.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
 
}
-----------------------------------  
3-6
/day17/src/swing/SwingTest5.java
 
package swing;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableModel;
 
class MouseAdapterTest extends MouseAdapter {
     JFrame t;
     public MouseAdapterTest(JFrame t) {
          this.t = t;
     }
     @Override
     public void mouseClicked(MouseEvent e) {
          SwingTest5 sw5 = (SwingTest5) t;
          TableModel model = sw5.table.getModel();
 
          if (sw5.table.getSelectedRow() != -|| sw5.table.getSelectedColumn() != -1) {
               System.out.println(model.getValueAt(sw5.table.getSelectedRow(),
                         sw5.table.getSelectedColumn()));
          }
     }
}
public class SwingTest5 extends JFrame implements ActionListener {
     JTable table;
     JButton btn;
     String title[] = { "이름""나이""성별" };
     Object data[][] = { { "홍길동"24"남자" },
               { "임꺽정"25"남자" },
               { "신사임당"27"여자" } };
 
     public SwingTest5() {
          table = new JTable(data, title);
          table.addMouseListener(new MouseAdapterTest(this));
          btn = new JButton("출력");
          btn.addActionListener(this);
          JScrollPane scroll = new JScrollPane();
          scroll.getViewport().add(table);
          add("Center", scroll);
          add("South", btn);
 
     }
 
     @Override
     public void actionPerformed(ActionEvent e) {
          TableModel model = table.getModel();
          /*
          for (int i = 0; i < model.getRowCount(); i++) {
               System.out.print(model.getColumnName(i)+"\t");
          }
          System.out.println(---------------------------------);
          for (int i = 0; i < model.getColumnCount(); i++) {              
               for (int j = 0; j < model.getRowCount(); j++) {
                    System.out.print(model.getValueAt(i, j)+"\t");
               }
               System.out.println();
          }
          System.out.println(table.getSelectedRow()+":"+table.getSelectedColumn());
          */
          if(e.getSource() == btn){
               if(table.getSelectedRow() != -|| table.getSelectedColumn() != -1){
                    System.out.println(model.getValueAt(table.getSelectedRow(), table.getSelectedColumn()));
               }
          }
 
     }
 
     public static void main(String[] args) {
          // TODO Swing 다섯번째 예제
          SwingTest5 st = new SwingTest5();
          // st.setSize(300,400);
          st.pack();// 내용에 맞게 사이즈를 조절해줌
          st.setVisible(true);
          st.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
 
}
-----------------------------------  
3-7
/day17/src/swing/SwingTest6.java
 
package swing;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
 
class MouseActionDemo extends MouseAdapter{
     JFrame f;
     public MouseActionDemo(JFrame f) {
          this.f = f;
     }
     @Override
     public void mouseClicked(MouseEvent e) {
          SwingTest6 st6 = (SwingTest6)f;
          if( e.getSource() == st6.tName ){
               st6.tName.setText("");
          }else if( e.getSource() == st6.tAge ){
               st6.tAge.setText("");
          }else if( e.getSource() == st6.tGender ){
               st6.tGender.setText("");
          }
     }
}
public class SwingTest6 extends JFrame implements ActionListener{
     JTable table;
     JButton btnAdd, btnDel;
     JScrollPane scroll;
     String title[] = { "이름""나이""성별" };
     JTextField tName, tAge, tGender;
     JPanel panel;
 
     public SwingTest6() {
          DefaultTableModel model = new DefaultTableModel(title, 0);
          // jtable을 처음에 제목만으로 초기화 해주는 방법
          table = new JTable(model);
 
          // 위 방법이 아니면, 에러남, 안됨
          // table = new JTable(title);
          scroll = new JScrollPane(table);
          btnAdd = new JButton("추가");
          btnDel = new JButton("삭제");
          tName = new JTextField("이름"6);
          tAge = new JTextField("나이"3);
          tGender = new JTextField("성별"2);
          panel = new JPanel();
          btnAdd.addActionListener(this);
          btnDel.addActionListener(this);
          MouseActionDemo mad = new MouseActionDemo(this);
          tName.addMouseListener(mad);
          tAge.addMouseListener(mad);
          tGender.addMouseListener(mad);
          add("Center", scroll);
          panel.add(tName);
          panel.add(tAge);
          panel.add(tGender);
          panel.add(btnAdd);
          panel.add(btnDel);
          add("South", panel);
     }
 
     @Override
     public void actionPerformed(ActionEvent e) {
          if(e.getSource() == btnAdd){
               String[] data = new String[3];
               data[0= tName.getText();
               data[1= tAge.getText();
               data[2= tGender.getText();
               for (int i = 0; i < data.length; i++) {
                    if(data[i].isEmpty()){
                         JOptionPane.showMessageDialog(null"반드시 데이터를 전부 입력해야 합니다.");
                         return;
                    }
               }
               // 테이블에 추가
               // TableModel 보다 자식인 DefaultTableModel을 사용
               DefaultTableModel model = (DefaultTableModel) table.getModel();
               model.addRow(data);                   
               //마지막 처리
               tName.setText("");
               tAge.setText("");
               tGender.setText("");                        
          }else if(e.getSource() == btnDel){
               //만약 선택하지 않고 삭제 버튼을 누르면, 대화상자
               if(table.getSelectedRow() == -|| table.getSelectedColumn() == -1){
                    JOptionPane.showMessageDialog(null"반드시 데이터를 선택해야 합니다.");
                    return;
               }
               //삭제
               DefaultTableModel model = (DefaultTableModel) table.getModel();
               if(table.getSelectedRowCount() > 0){
                    for (int i = table.getSelectedRowCount()-1; i > ; i--) {
                         model.removeRow(table.getSelectedRow()+i);
                    }
               }
               model.removeRow(table.getSelectedRow());              
          }    
     }
 
     public static void main(String[] args) {
          // TODO Swing 여섯번째 예제
          SwingTest6 st = new SwingTest6();
          st.setSize(300400);
          // st.pack();
          st.setVisible(true);
          st.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
 
}
-----------------------------------
-----------------------------------  
-----------------------------------  
-----------------------------------  
-----------------------------------  

###################################
4. 과제
-----------------------------------
4-1
----------------------------------- 
4-2
----------------------------------- 
4-3
----------------------------------- 
4-4
----------------------------------- 
4-5
###################################
5. 과제 해결
-----------------------------------
5-1
-----------------------------------
5-2
----------------------------------- 
5-3
-----------------------------------
5-4
###################################
6. 기타
-----------------------------------

package tictactoe;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class UI extends JFrame {
     JPanel west, east;
     JButton reset, end_game;
     JLabel lb_win, lb_lose, lb_draw;
     JLabel lb_win_num, lb_lose_num, lb_draw_num;
     Random random;
     final int AI_NUM = 2;
     final int USER_NUM = 1;
     final int INIT = 0;
     int win_cnt = 0, lose_cnt = 0, draw_cnt = 0;
     boolean isUserFirst = true;// true면 user 먼저
     boolean isEnd = false;
     int row_col = 3;
     JButton button[][];
     int[][] tictactoe;
     ImageIcon icon_user, icon_ai;
     public UI(int num) {
          setTitle("TicTacToe");
          if (num > 0)
               row_col = num;
          button = new JButton[row_col][row_col];
          tictactoe = new int[row_col][row_col];
          west = new JPanel();
          east = new JPanel();
          random = new Random();
          west.setLayout(new GridLayout(row_col, row_col));
          //icon_user = new ImageIcon(getClass().getResource("/res/close.png"));
          //icon_ai = new ImageIcon(getClass().getResource("/res/circle.png"));
         
          for (int i = 0; i < button.length; i++) {
               for (int j = 0; j < button[i].length; j++) {
                    button[i][j] = new JButton();
                    button[i][j].setForeground(Color.lightGray);
                    button[i][j].setBackground(Color.lightGray);
                    button[i][j].addActionListener(new ButtonListener());
                    tictactoe[i][j] = INIT;
                    west.add(button[i][j]);
               }
          }
         
          // button[i].setIcon(new ImageIcon(ImageIO.read(new File("F:\\study\\java\\X.png"))));
          reset = new JButton("다시하기");
          end_game = new JButton("종료");
          lb_win = new JLabel("Win(승)", JLabel.CENTER);
          lb_lose = new JLabel("Lose(패)", JLabel.CENTER);
          lb_draw = new JLabel("Draw(비김)", JLabel.CENTER);
          lb_win_num = new JLabel();
          lb_lose_num = new JLabel();
          lb_draw_num = new JLabel();
          lb_win_num.setHorizontalAlignment(JLabel.CENTER);
          lb_lose_num.setHorizontalAlignment(JLabel.CENTER);
          lb_draw_num.setHorizontalAlignment(JLabel.CENTER);

          ButtonListener bl = new ButtonListener();
          reset.addActionListener(bl);
          end_game.addActionListener(bl);

          east.setLayout(new GridLayout(4, 2, 2, 2));
          east.add(reset);
          east.add(end_game);
          east.add(lb_win);
          east.add(lb_win_num);
          east.add(lb_lose);
          east.add(lb_lose_num);
          east.add(lb_draw);
          east.add(lb_draw_num);

          setLayout(new GridLayout(1, 2, 5, 5));
          add(west);
          add(east);
          setBounds(200, 100, 700, 400);
          setVisible(true);
          this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     }

     void ai_random() {
          for (;;) {
               win_check();
               if (isEnd)
                    break;
               else {
                    int i = random.nextInt(row_col);
                    int k = random.nextInt(row_col);
                    if (tictactoe[i][k] == INIT) {
                         //button[i][k].setIcon(icon_ai);
                         button[i][k].setBackground(Color.blue);
                         tictactoe[i][k] = AI_NUM;
                         win_check();
                         break;
                    }
               }
          }
     }

     void ai_up() {

     }

     void win_check() {
          if(!isEnd){
               int user_cnt = 0;
               int ai_cnt = 0;
               int init_cnt = 0;
               //
               for (int i = 0; i < tictactoe.length; i++) {
                    for (int j = 0; j < tictactoe[i].length; j++) {
                         if (tictactoe[i][j] == USER_NUM) {
                              user_cnt++;
                         } else if (tictactoe[i][j] == AI_NUM) {
                              ai_cnt++;
                         } else if (tictactoe[i][j] == INIT) {
                              init_cnt++;
                         }
                    }
                    if (user_cnt == row_col) {
                         end_game(USER_NUM);
                         return;
                    }
                    if (ai_cnt == row_col) {
                         end_game(AI_NUM);
                         return;
                    }
                    ai_cnt = 0;
                    user_cnt = 0;
               }
               user_cnt = 0;
               ai_cnt = 0;
               //
               for (int i = 0; i < tictactoe.length; i++) {
                    for (int j = 0; j < tictactoe[i].length; j++) {
                         if (tictactoe[j][i] == USER_NUM) {
                              user_cnt++;
                         } else if (tictactoe[j][i] == AI_NUM) {
                              ai_cnt++;
                         }
                    }
                    if (user_cnt == row_col) {
                         end_game(USER_NUM);
                         return;
                    }
                    if (ai_cnt == row_col) {
                         end_game(AI_NUM);
                         return;
                    }
                    ai_cnt = 0;
                    user_cnt = 0;
               }
               user_cnt = 0;
               ai_cnt = 0;
               //
               for (int i = 0; i < tictactoe.length; i++) {
                    int j = i;
                    if (tictactoe[j][i] == USER_NUM) {
                         user_cnt++;
                    } else if (tictactoe[j][i] == AI_NUM) {
                         ai_cnt++;
                    }
               }
               if (user_cnt == row_col) {
                    end_game(USER_NUM);
                    return;
               }
               if (ai_cnt == row_col) {
                    end_game(AI_NUM);
                    return;
               }
               user_cnt = 0;
               ai_cnt = 0;
               //
               for (int i = 0; i < tictactoe.length; i++) {
                    int j = tictactoe.length - 1 - i;
                    if (tictactoe[j][i] == USER_NUM) {
                         user_cnt++;
                    } else if (tictactoe[j][i] == AI_NUM) {
                         ai_cnt++;
                    }
               }
               if (user_cnt == row_col) {
                    end_game(USER_NUM);
                    return;
               }
               if (ai_cnt == row_col) {
                    end_game(AI_NUM);
                    return;
               }
               // result
               if (init_cnt == 0) {
                    isUserFirst = !isUserFirst;
                    isEnd = true;
                    draw_cnt++;
                    showMessage("비겼습니다.");
                    lb_draw_num.setText(String.valueOf(draw_cnt));
                    for (int i = 0; i < tictactoe.length; i++) {
                         for (int j = 0; j < tictactoe[i].length; j++) {
                              button[i][j].setEnabled(false);
                         }
                    }
               }
          }
     }

     void end_game(int num) {         
          if(!isEnd){
               if (num == USER_NUM) {
                    win_cnt++;
                    isUserFirst = false;
                    showMessage("이겼습니다.");
                    lb_win_num.setText(String.valueOf(win_cnt));
               } else if (num == AI_NUM) {
                    lose_cnt++;
                    isUserFirst = true;
                    showMessage("졌습니다.");
                    lb_lose_num.setText(String.valueOf(lose_cnt));
               }
               for (int i = 0; i < tictactoe.length; i++) {
                    for (int j = 0; j < tictactoe[i].length; j++) {
                         button[i][j].setEnabled(false);
                    }
               }
          }
          isEnd = true;
     }

     void showMessage(String mes) {
          JOptionPane.showMessageDialog(this, mes);
     }

     private class ButtonListener implements ActionListener {
          @Override
          public void actionPerformed(ActionEvent e) {
               JButton button1 = (JButton) e.getSource();
               // 배열과 Button에 값 및 색상변화, 특정 tictactoe 버튼을 눌렀을때
               for (int i = 0; i < button.length; i++) {
                    for (int k = 0; k < button[i].length; k++) {
                         if (button1 == button[i][k]) {
                              if (tictactoe[i][k] == INIT) {
                                   //button[i][k].setIcon(icon_user);
                                   button1.setBackground(Color.red);
                                   button1.setForeground(Color.black);
                                   button1.setText("USER");
                                   tictactoe[i][k] = USER_NUM;
                                   ai_random();
                              }
                         }
                    }
               }

               // reset
               if (button1 == reset) {
                    for (int i = 0; i < button.length; i++) {
                         for (int k = 0; k < button[i].length; k++) {
                              button[i][k].setEnabled(true);
                              button[i][k].setBackground(Color.lightGray);
                              button[i][k].setForeground(Color.lightGray);                             
                              button[i][k].setText("");
                              tictactoe[i][k] = INIT;
                         }
                    }
                    isEnd = false;
                    if (!isUserFirst) {
                         ai_random();
                    }
               } else if (button1 == end_game) {
                    dispose();
               }
          }
     }

     public static void main(String[] args) {
          if (args.length > 0){
               int num = Integer.parseInt(args[0]);
               if( num > 2 ){
                    if( num % 2 == 1){
                         num +=1;
                         new UI(num);
                    }else{
                         new UI(num);
                    }
               }else{
                    new UI(3);
               }
          }else
               new UI(3);
          /*
          * 난이도 조정
          */
     }

----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day20  (0) 2015.04.20
오픈프레임워크_Day19  (0) 2015.04.20
오픈프레임워크_Day17  (0) 2015.04.20
오픈프레임워크_Day16  (0) 2015.04.20
오픈프레임워크_Day15  (0) 2015.04.20
,