문제, 앞서 만들어 보았던 EngKoreanCard와 MyDictionary 클래스를 이용하여 GUI를 갖춘 플리시카드 어플리케이션을 만드시오.
-code 설명 (설계 진행 순서대로)
▶package에 따른class
|
1. univ.inu.embedded.flashcard 패키지의 Flashcard 클래스 작성
#JFrame을 상속
#멤버 변수
ο JButton형의 chkBtn(check 버튼)과 nextBtn(next 버튼)
ο JTextField형의 engField(영어단어 표시)와 korField(우리말 뜻 표시): engField는 편집불가능으로 설정
ο MyDictionary형의 myDictionary: EngKoreanCard들을 담고 있는 객체
ο EngKoreanCard형의 curCard 영어단어와 한글 뜻을 담고 있는 객체
Flashcard 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package univ.inu.embedded.flashcard; import univ.incheon.embedded.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class Flashcard extends JFrame{ JButton chkBtn=new JButton("check"); JButton nextBtn=new JButton("next"); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JLabel l1=new JLabel("영어단어"); JLabel l2=new JLabel("우리말 뜻"); JTextField engField=new JTextField(20); JTextField korField=new JTextField(20); MyDictionary myDictionary=new MyDictionary(); EngKoreanCard curCard=null; public Flashcard(MyDictionary _newmd){ Container c=this.getContentPane(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); c.setLayout(new FlowLayout()); myDictionary=_newmd; curCard=myDictionary.getRandomCard(); engField.setText(curCard.getEngWord()); engField.setEditable(false); p1.add(l1); p1.add(engField); p1.setSize(100,30); p2.add(l2); p2.add(korField); p2.setSize(100,30); chkBtn.setSize(50,30); chkBtn.addActionListener(new ButtonListener()); nextBtn.setSize(50,30); nextBtn.addActionListener(new ButtonListener()); p3.add(chkBtn); p3.add(nextBtn); c.add(p1); c.add(p2); c.add(p3); this.setSize(400,200); this.setVisible(true); } } | cs |
Flashcard 클래스는 JFrame을 상속받아 3개의 panel을 포함합니다. Flashcard 클래스의 생성자는 MyDictionary 타입의 객체를 받고 EngKoreanCard 클래스 타입의 curCard은 random으로 나오는 카드의 현재 카드를 저장하기 위한 변수입니다. Panel1은 “영어단어”-label 하나와 engField-TextField 하나를 포함하는데 영어단어가 나오는 필드에서는 편집이 불가해야 하기 때문에 engField.setEditable(false);가 필요합니다. Panel2는 “우리말 뜻”-label 하나와 korField-TextField 하나를 포함합니다. 마지막으로 panel3는 check하는 chkBtn과 next 넘기는 nextBtn을 포함합니다. 위의 3가지 panel이 현재 frame에 추가됩니다. 여기서 frame의 사이즈는 가로-400, 세로-200이고FlowLayout으로 설정합니다. |
EngKoreanCard 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package univ.incheon.embedded; import java.util.*; public class EngKoreanCard { private String english; private String korean; public EngKoreanCard(String en) { english=en; } public void addKoreanWord(String ko) { korean=ko; } public String getEngWord() { return english; } public String getKorWord() { return korean; } } | cs |
영어 단어와 한글 뜻을 저장하기 위한 EngKoreanCard클래스입니다. 영어와 한글 뜻은 en, ko로 받아서 저장합니다. getEngWord메소드는 해당 객체의 영어 단어를 반환합니다. getKorWord메소드는 해당 객체의 한글 뜻을 반환합니다. |
MyDictionary 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package univ.incheon.embedded; import java.util.*; public class MyDictionary { private Random randomGenerator = new Random(); public int cnt=0; Vector<EngKoreanCard> wordList=new Vector<EngKoreanCard>(); public void addCard(EngKoreanCard _card) { wordList.add(_card); cnt++; } public EngKoreanCard getCardByEng(String _english) { Iterator<EngKoreanCard> it = wordList.iterator(); EngKoreanCard cur=null; while(it.hasNext()){ cur=it.next(); if(cur.getEngWord().equals(_english)){ return cur; } } return null; } public EngKoreanCard getCardByKorean(String _korean) { Iterator<EngKoreanCard> it = wordList.iterator(); EngKoreanCard cur=null; while(it.hasNext()){ cur=it.next(); if(cur.getKorWord().equals(_korean)){ return cur; } } return null; } public EngKoreanCard getRandomCard() { int temp=randomGenerator.nextInt(cnt); EngKoreanCard value=wordList.get(temp); return value; } } | cs |
addCard 메소드로 카드를 추가하는데 현재 몇 개의 카드가 있는지 확인하기 위해 변수 cnt를 증가시킵니다. 기존에 있는 단어들을 random으로 뽑아 해당 객체를 반환하는 getRandomCard메소드입니다. nextInt메소드에 입력하는 정수 인자는 cnt로, cnt는 추가를 해줄 때 마다 증가시킨 정수 변수입니다. |
2. Flashcard 클래스의 내부클래스로 ButtonListener 클래스 작성
#interface ActionListener를 구현
#클릭된 버튼의 종류를 구별 (ActionEvent 클래스의 getSource() 메소드를 이용)
#Check 버튼의 경우, 입력된 한글 뜻과 curCard 객체에 있는 한글 뜻을 비교하여 정답일 경우, "정답"을 korField에 표시하고 오답일 경우, "다시 한 번 해보세요"를 표시.
#Next 버튼의 경우, myDictionary에서 새로운 EngKoreanCard를 뽑아 curCard에 대입하고, 영어 뜻을 engField에 표시하고, korField는 클리어 (MyDictionary클래스의 getRandomCard() 메소드를 이용)
Flashcard 클래스의 ButtonListener 내부 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class ButtonListener implements ActionListener{ public void actionPerformed(ActionEvent E) { if(E.getSource()==chkBtn){ String temp=korField.getText(); temp=temp.trim(); if(curCard.getKorWord().equals(temp) && korField.getText()!=null){ korField.setText("정답"); } else{ korField.setText("다시 한번 해보세요."); } } else if(E.getSource()==nextBtn){ korField.setText(null); curCard=myDictionary.getRandomCard(); engField.setText(curCard.getEngWord()); } } } | cs |
Check / Next 버튼이 눌릴 때 각자의 action을 실행하기 위한 리스너 ButtonListener를 추가합니다. 만약 눌린 버튼이 check 버튼이라면 해당 영어단어에 대한 한글 뜻을 getKorWord로 받아오고 현재 사용자가 답을 적은 korField에서 적혀있는 단어를 가져옵니다. 가져온 단어를 temp변수에 저장을 하는데 띄어쓰기를 무시한 문자열과 비교하기위해 trim메소드를 사용하여 저장합니다. Temp가 정답인지 확인을 하기위해 equals메소드를 사용하여 getKorWord와 같은 문자열인지 비교합니다. 입력한 문자열이 null값이 아니고 같은 문자열이라면 정답이기 때문에 KorField에 “정답”을 표시하고 반대로 null값을 받아오거나 틀린 문자열이라면 “다시 한번 해보세요.”를 표시합니다. 만약 눌린 버튼이 next 버튼이라면 KorField에 무언가가 적혀있을 수 있으므로 setText메소드를 사용하여 null로 지워줍니다. 그리고 다시 그 다음의 단어를 표시하기위해 myDoictionary객체의 getRandomCard메소드를 사용하여 random으로 뽑은 다음 단어를 curCard에 넣어주고 engField에 표시해줍니다. |
1, 2번의 테스트클래스 TestWithGUI 클래스 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package univ.inu.embedded; import univ.incheon.embedded.*; import univ.inu.embedded.flashcard.*; import java.util.*; public class TestWithGUI { public static void main(String [] args) { MyDictionary md=new MyDictionary(); EngKoreanCard b=new EngKoreanCard("banana"); b.addKoreanWord("바나나"); EngKoreanCard a=new EngKoreanCard("apple"); a.addKoreanWord("사과"); EngKoreanCard m=new EngKoreanCard("mango"); m.addKoreanWord("망고"); EngKoreanCard c=new EngKoreanCard("cherry"); c.addKoreanWord("체리"); EngKoreanCard k=new EngKoreanCard("kiwi"); k.addKoreanWord("키위"); md.addCard(a); md.addCard(b); md.addCard(c); md.addCard(m); md.addCard(k); Flashcard fc=new Flashcard(md); } } | cs |
영어단어와 한글 뜻을 위한 객체 EngKoreanCard 클래스로 단어 5가지를 생성하고 그 영어단어들를 저장하기 위한 MyDictionary 객체 md를 생성한 후에 단어객체들을 addCard 메소드를 사용하여 추가합니다. 주관식 영어단어 퀴즈를 내는 GUI 클래스 Flashcard fc를 생성하고 fc를 생성할 때 영어단어들의 정보가 담겨있는 MyDictionary 객체 md를 Flashcard(md)로 생성자에 넘겨줍니다. |
1,2번 결과
1번 |
|
|
-“영어단어” label과 수정이 불가능한 EngField -“우리말 뜻” label과 답을 적는 KorField -답을 적은 후 확인하는 check button, 그 다음의 단어로 넘어가기 위한 next button |
2번 |
|
|
-맞춰야 하는 단어는 “apple” -trim을 사용했기 때문에 띄어쓰기도 무시하므로 확인을 위해 “—사과—“입력 |
|
-check button을 눌렀을 때 정답확인 -“apple” – “사과” : 정답 |
|
-next button을 눌렀을 때 그 다음차례 단어 표시 -맞춰야 하는 단어는 “banana” |
|
-check button을 눌렀을 때 정답 확인 |
|
-“banana” – “체리” : 다시 한번 해보세요. |
3. 정답률을 표시하는 Smart GUI 작성 : 적당한 위치에 (정답수/전체문제수)*100으로 표시하고, 정답률이 높아질 수록 밝은 색으로 GUI를 칠하고, 낮아질 수록 어두운 색으로 변화.
Flashcard 클래스 수정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | package univ.inu.embedded.flashcard; import univ.incheon.embedded.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class Flashcard extends JFrame{ JButton chkBtn=new JButton("check"); JButton nextBtn=new JButton("next"); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JLabel l1=new JLabel(" 영어단어"); JLabel l2=new JLabel("우리말 뜻"); *JLabel l3=new JLabel(" 0 %"); JTextField engField=new JTextField(20); JTextField korField=new JTextField(20); MyDictionary myDictionary=new MyDictionary(); EngKoreanCard curCard=null; Container c=this.getContentPane(); *int correct=0; *int wrong=0; *int r=70,g=170,b=70; *float totalQ=0; public Flashcard(MyDictionary newmd){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); c.setLayout(new FlowLayout()); myDictionary=newmd; curCard=myDictionary.getRandomCard(); engField.setText(curCard.getEngWord()); engField.setEditable(false); p1.add(l1); p1.add(engField); p1.setSize(100,30); p2.add(l2); p2.add(korField); p2.setSize(100,30); chkBtn.setSize(50,30); chkBtn.addActionListener(new ButtonListener()); nextBtn.setSize(50,30); nextBtn.addActionListener(new ButtonListener()); p3.add(chkBtn); p3.add(nextBtn); *l3.setBackground(new Color(0,0,0)); c.add(p1); c.add(p2); c.add(p3); c.add(l3); *c.setBackground(new Color(r,g,b)); this.setSize(400,200); this.setVisible(true); } public class ButtonListener implements ActionListener{ public void actionPerformed(ActionEvent E) { if(E.getSource()==chkBtn){ String temp=korField.getText(); temp=temp.trim(); if(curCard.getKorWord().equals(temp) && korField.getText()!=null){ korField.setText("정답"); *correct++; *totalQ+=1; *float cur=(correct/totalQ)*100; *int curr=(int) cur; *l3.setText(curr+" %"); *r=r+correct*30; *g=g+correct*10; *b=b+correct*30; *c.setBackground(new Color(r,g,b)); } else{ korField.setText("다시 한번 해보세요."); *wrong++; *totalQ+=1; *float cur=(correct/totalQ)*100; *int curr=(int) cur; *l3.setText(curr+" %"); *r=r-wrong*30; *g=g-wrong*10; *b=b-wrong*30; *c.setBackground(new Color(r,g,b)); } } else if(E.getSource()==nextBtn){ korField.setText(null); curCard=myDictionary.getRandomCard(); engField.setText(curCard.getEngWord()); } } } } | cs |
*수정된 부분만 설명하겠습니다! 줄 맨앞에 *표시가 되어있는 부분이 수정된 부분입니다. 3번은 정답률을 표시해야하고 그 정답률에 따라서 맞추면 창의 색이 밝아지고 틀리면 창의 색이 어두워집니다. L3는 정답률을 표시하는 label이고 처음에는 0%를 나타냅니다. 정답률을 나타내기 위해서는 우선 맞출 때 증가하는 int형 변수 correct와 틀릴 때 증가하는 int형 변수 wrong, 현재까지 나온 문제 개수는 나타내는 float형 변수 totalQ를 선언합니다. totalQ를 int형이 아닌 float형으로 선언한 이유는 정답률을 표시할 때는 소수점자리까지 표시가 되는데 정답률의 분모가 되는 totalQ가 int형이면 계산이 되지 않기 때문에 float형으로 선언을 합니다. Int r, g, b는 background의 색을 표현하기 위한 변수입니다. 클래스 Color.~으로 색을 표현하게 되면 밝기표현하는데 제한이 있기 때문에 new Color(r,g,b)로 직접 색의 값을 넣어 객체를 생성하였습니다. 만약 check button을 사용하여 답을 확인하고 정답이라면 일단 totalQ와 correct변수를 증가시킵니다. 그리고 정답률을 표시하기 위해서 correct/totalQ를 int형으로 캐스팅하고 l3에 나타냅니다. 답을 맞추면 밝기가 증가되야 하므로 background에 r=r+correct*30,g=g+correct*10,b=b+correct*30,c.setBackground(new Color(r,g,b))로 다시 설정을 해줍니다. 반대로 답이 정답이 아니라면 totalQ변수를 증가시키고 wrong변수를 감소시킵니다. 마찬가지로 그리고 정답률을 표시하기 위해서 correct/totalQ를 int형으로 캐스팅하고 l3에 나타냅니다. 답을 틀리면 밝기가 감소되야 하므로 background에 r=r-correct*30,g=g-correct*10,b=b-correct*30,c.setBackground(new Color(r,g,b))로 다시 설정을 해줍니다. |
3번 결과
맞힐 때 |
|
|
-맞춰야 하는 단어는 “banana” -“바나나” 입력 -현재 정답률 0% |
|
-정답을 맞추면 “정답” 표시 -현재 정답률 100% ⇒ (1/1)*100 |
|
-맞춰야 하는 단어는 “cherry” -“체리” 입력 -현재 정답률 100% ⇒ (1/1)*100 |
|
-정답을 맞추면 “정답” 표시 -현재 정답률 100% ⇒ (2/2)*100 |
|
-맞춰야 하는 단어는 “kiwi” -“키위” 입력 -현재 정답률 100% ⇒ (2/2)*100 |
|
-정답을 맞추면 “정답” 표시 -현재 정답률 100% ⇒ (3/3)*100 |
Background의 밝기가 점점 밝아짐을 확인하였습니다. |
틀릴 때 |
|
|
-맞춰야 하는 단어는 “mango” -“키위” 입력 -현재 정답률 100% ⇒ (3/3)*100 |
|
-정답을 틀리면 “다시 한번 해보세요.” 표시 -현재 정답률 75% ⇒ (3/4)*100 |
|
-맞춰야 하는 단어는 “apple” -“망고” 입력 -현재 정답률 75% ⇒ (3/4)*100 |
|
-정답을 틀리면 “다시 한번 해보세요.” 표시 -현재 정답률 60% ⇒ (3/5)*100 |
|
-맞춰야 하는 단어는 “banana” -“사과” 입력 -현재 정답률 60% ⇒ (3/5)*100 |
|
-정답을 틀리면 “다시 한번 해보세요.” 표시 -현재 정답률 50% ⇒ (3/6)*100 |
Background의 밝기가 점점 어두워짐을 확인하였습니다. |
틀리고 맞힐 때 |
|
|
-맞춰야 하는 단어는 “mango” -“망고” 입력 -현재 정답률 50% ⇒ (3/6)*100 |
|
-정답을 맞추면 “정답” 표시 -현재 정답률 55% ⇒ (4/7)*100 |
맞히고 틀릴 때 |
|
|
-맞춰야 하는 단어는 “kiwi” -“사과” 입력 -현재 정답률 55% ⇒ (4/7)*100 |
|
-정답을 틀리면 “다시 한번 해보세요.” 표시 -현재 정답률 50% ⇒ (4/8)*100 |
4. 객관식 영어단어장 : 주어진 영어단어에 대해서, 4개의 한글 예시를 제시. 그 중 하나는 반드시 정답이고, 나엄지는 임의로 추출. 이 때. 동일 단어가 선택되지 않도록 유의. 4개 번호를 버튼으로 구현하여 정답을 입력하도록 수정.
SelectedFlashcard 클래스 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | package univ.inu.embedded.flashcard; import univ.incheon.embedded.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class SelectedFlashcard extends JFrame{ JPanel p=new JPanel(); ButtonGroup bg=new ButtonGroup(); JButton nextBtn=new JButton("Next"); JRadioButton r1=new JRadioButton(); JRadioButton r2=new JRadioButton(); JRadioButton r3=new JRadioButton(); JRadioButton r4=new JRadioButton(); JRadioButton correct=null; JLabel l=new JLabel(" 영어단어 : "); JTextField engField=new JTextField(15); MyDictionary myDictionary=new MyDictionary(); EngKoreanCard curCard=null; Container c=this.getContentPane(); Vector<String> list=null; public SelectedFlashcard(MyDictionary _newmd){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); c.setLayout(new FlowLayout()); myDictionary=_newmd; curCard=myDictionary.getRandomCard(); engField.setText(curCard.getEngWord()); engField.setEditable(false); p.add(l); p.add(engField); nextBtn.addActionListener(new MyListener()); list=myDictionary.getRandomCardToSelected(curCard); r1.setText(list.get(0)); r1.addActionListener(new MyListener()); r2.setText(list.get(1)); r2.addActionListener(new MyListener()); r3.setText(list.get(2)); r3.addActionListener(new MyListener()); r4.setText(list.get(3)); r4.addActionListener(new MyListener()); if(list.get(0).equals(curCard.getKorWord())) { correct=r1; } else if(list.get(1).equals(curCard.getKorWord())) { correct=r2; } else if(list.get(2).equals(curCard.getKorWord())) { correct=r3; } else if(list.get(3).equals(curCard.getKorWord())) { correct=r4; } bg.add(r1); bg.add(r2); bg.add(r3); bg.add(r4); c.add(p); c.add(r1); c.add(r2); c.add(r3); c.add(r4); c.add(nextBtn); this.setSize(300,150); this.setVisible(true); } public class MyListener implements ActionListener{ public void actionPerformed(ActionEvent E) { if(E.getSource()==nextBtn){ curCard=myDictionary.getRandomCard(); engField.setText(curCard.getEngWord()); list=myDictionary.getRandomCardToSelected(curCard); bg.clearSelection(); r1.setText(list.get(0)); r2.setText(list.get(1)); r3.setText(list.get(2)); r4.setText(list.get(3)); if(list.get(0).equals(curCard.getKorWord())) { correct=r1; } else if(list.get(1).equals(curCard.getKorWord())) { correct=r2; } else if(list.get(2).equals(curCard.getKorWord())) { correct=r3; } else if(list.get(3).equals(curCard.getKorWord())) { correct=r4; } } else { if(E.getSource()==correct){ System.out.println("Correct!"); curCard=myDictionary.getRandomCard(); engField.setText(curCard.getEngWord()); list=myDictionary.getRandomCardToSelected(curCard); bg.clearSelection(); r1.setText(list.get(0)); r2.setText(list.get(1)); r3.setText(list.get(2)); r4.setText(list.get(3)); if(list.get(0).equals(curCard.getKorWord())) { correct=r1; } else if(list.get(1).equals(curCard.getKorWord())) { correct=r2; } else if(list.get(2).equals(curCard.getKorWord())) { correct=r3; } else if(list.get(3).equals(curCard.getKorWord())) { correct=r4; } } else{ System.out.println("Wrong!"); } } } } } | cs |
객관식으로 문제를 내기위해서 radio button을 사용하였습니다. 먼저 MyDictionary 클래스를 이용하여 random으로 card를 뽑아서 curCard변수에 저장합니다. MyDictionary 클래스에서 4개의 radio button을 채우기 위한 getRandomCardToSelected 메소드를 사용합니다. getRandomCardToSelected 메소드는 정답을 표현한 총 4개의 String형의 단어를 가지고 있는 vector를 반환합니다. Correct는 현재 선택된 radio button이 정답인지 확인을 하기 위해 정답인 radio button을 저장하는 변수입니다. MyListener는 random으로 단어를 EngField에 표시가 되면 radio button을 누르고 해당 action을 하기 위한 리스너입니다. 먼저 Next button을 누르면 random으로 뽑은 다은 단어를 나타냅니다. Next button을 누르지 않고 답을 확인하는 차례라면 정답을 맞추면 콘솔 창에 “correct”를 표시하고 바로 다음 단어를 나타냅니다. 다음 단어를 나타내기 위해서 우선 random으로 다음 영어단어를 표시할 card를 뽑아옵니다. 그 다음에 4개의 radio button을 채우기 위해 MyDictionary 클래스의 getRandomCardToSelected 메소드를 사용하는데 정답도 포함해야하므로 현재 정답인 curCard의 getKorWord 메소드를 사용하여 정답 한글 뜻을 같이 넘겨줍니다. 그렇게 getRandomCardToSelected 메소드에서 받아온 vector를 radio button에 채워줍니다. 반대로 정답을 맞추지 못하면 다음 단어를 나타내지 않고 콘솔 창에 “wrong”을 표시합니다. |
MyDictionary 클래스 수정 (추가∙수정된 부분과 필요한 부분만 설명하겠습니다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | package univ.incheon.embedded; import java.util.*; public class MyDictionary { private Random randomGenerator = new Random(); public int cnt=0; Vector<EngKoreanCard> wordList=new Vector<EngKoreanCard>(); public void addCard(EngKoreanCard _card) { wordList.add(_card); cnt++; } , , ,(생략) public Vector<String> getRandomCardToSelected(EngKoreanCard ans) { Vector<String> randomCard=new Vector<String>(); randomCard.setSize(4); int f=randomGenerator.nextInt(4); //답이 위치한 index for(int i=0;i<4;i++) { if(i!=f) { int temp=randomGenerator.nextInt(cnt); String value=wordList.get(temp).getKorWord(); while((randomCard.contains(value)) || (value.equals(ans.getKorWord()))) { temp=randomGenerator.nextInt(cnt); value=wordList.get(temp).getKorWord(); } randomCard.add(i,value); } else { randomCard.add(i,ans.getKorWord()); } } return randomCard; } } | cs |
getRandomCardToSelected 메소드는 정답인 단어를 포함한 4개의 단어를 표시하기위해 vector를 넘겨두는 메소드입니다. 먼저 메소드는 정답인 단어를 넘겨받습니다. 그 다음에 그 단어가 위치하기 위한 자리를 index로 표시를 하고 그 index를 random클래스의 객체 randomGenerator.nextInt(4)로 받아옵니다. 그리고 그 위치는 다른 단어가 들어가면 안되므로 변수 f에 저장을 합니다. 4개를 vector에 저장해야하므로 for문으로 4번 돌아주면서 나머지 단어들을 채워줍니다. 4번으로 도는데 정답인 단어의 위치 f와 같아지면 vector의 그 위치에 정답인 단어를 넣어줍니다. 정답인 단어의 위치가 아니라면 먼저 Random 클래스를 이용하여 위치를 정하고 단어들의 정보를 가지고 있는 WordList에서 그 위치의 단어를 가져옵니다. Vector에 넣기전에 해당단어가 중복되지 않는지 확인을 하고 중복되지 않는다면 vector에 추가시켜줍니다. 같은 방법으로 4개의 단어가 모두 채워진다면 vector를 반환시켜줍니다. |
4번의 테스트클래스 TestWithGUI 클래스 수정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class TestWithGUI { public static void main(String [] args) { MyDictionary md=new MyDictionary(); EngKoreanCard b=new EngKoreanCard("banana"); b.addKoreanWord("바나나"); EngKoreanCard a=new EngKoreanCard("apple"); a.addKoreanWord("사과"); EngKoreanCard m=new EngKoreanCard("mango"); m.addKoreanWord("망고"); EngKoreanCard c=new EngKoreanCard("cherry"); c.addKoreanWord("체리"); EngKoreanCard k=new EngKoreanCard("kiwi"); k.addKoreanWord("키위"); md.addCard(a); md.addCard(b); md.addCard(c); md.addCard(m); md.addCard(k); SelectedFlashcard sfc=new SelectedFlashcard(md); } } | cs |
객관식 영어단어 퀴즈를 내는 GUI 클래스 SelectedFlashcard sfc를 생성하고 sfc를 생성할 때 영어단어들의 정보가 담겨있는 MyDictionary 객체 md를 SelectedFlashcard(md)로 생성자에 넘겨줍니다. |
4번 결과
맞힐 때 |
|
|
-맞춰야 하는 단어는 “mango” -“망고” radio button Click! -정답이므로 콘솔 창에 correct! 표시, 그 다음 단어로 바로 넘어갑니다. |
|
-맞춰야 하는 단어는 “cherry” -“체리” radio button Click! -정답이므로 콘솔 창에 correct! 표시, 그 다음 단어로 바로 넘어갑니다. |
|
-맞춰야 하는 단어는 “banana” |
틀릴 때 |
|
|
-맞춰야 하는 단어는 “banana” -“망고” radio button Click! -오답이므로 콘솔 창에 wrong! 표시 |
|
-next button click! -맞춰야 하는 단어는 “apple” -“체리” radio button Click! -오답이므로 콘솔 창에 wrong! 표시 |
'그 외 공부' 카테고리의 다른 글
[opencv c++ 영상 다루기 공부] *첫번째* opencv의 시작, opencv 설치 및 visual studio 설정★ (0) | 2015.08.11 |
---|---|
[객체기반SW설계] #TEST, JAVA TextAnalyzer (0) | 2015.08.06 |
[객체기반SW설계] #Mission 2, JAVA 영어단어 프로그램 (0) | 2015.08.06 |
[객체기반SW설계] #Mission 1, JAVA 친구정보 프로그램 (0) | 2015.08.06 |
[SW기초실습1] #Mission 4, linux에서 문자,숫자 DLL 프로그램 (0) | 2015.08.04 |