[[TableOfContents]] == ì¼ì‹œ == 8ì›” 4ì¼ 13시 05ë¶„ ~ 14시 45ë¶„ == ì°¸ê°€ìž == || ìœ ìž¬ë²” || ì°¸ì„ || || ì´ì§€ìˆ˜ || ì°¸ì„ || || 김용준 || ì°¸ì„ || || ê¹€ì •ë¯¼ || ì°¸ì„ || == ì§„í–‰ ìƒí™© == * Frame, ë ˆì´ë¸”, ë ˆì´ì•„웃과 AWT ì»´í¬ë„ŒíЏ * ìžë°” ìž…ì¶œë ¥ì„ í•˜ë ¤ 했으나 발표ìžì˜ 하드 트롤ë§ìœ¼ë¡œ 발표내용 급 변경 * [김용준]ì˜ í주로 예ìƒì¹˜ 못한 AWT ì»´í¬ë„ŒíŠ¸ì˜ ë°œí‘œ. ~~ê³ í†µìŠ¤ëŸ½ë‹¤.~~ === 발표 ë‚´ìš© === * 핵심 : GUIì˜ ê¸°ë³¸ 구성 * ìžë°” GUIì˜ ê¸°ì´ˆì¸ Frame í´ëž˜ìŠ¤ì™€ ë ˆì´ì•„웃 ë§¤ë‹ˆì €ì— ëŒ€í•´ 다룸 * ìžë°” í¼ì˜ 패키지들 * ìš”ì•½ì„ í•´ë³´ìž {{{ â‘ pacakge1 java.applet : 웹 페ì´ì§€ì— 삽입ë˜ëŠ” ìž‘ì€ ì• í”Œë¦¬ì¼€ì´ì…˜ì¸ ì• í”Œë¦¿ì„ ì§€ì›í•˜ê¸° 위한 API. ì›ì¹™ì 으로 ì• í”Œë¦¬ì¼€ì´ì…˜ê³¼ ì‹œìŠ¤í…œê³¼ì˜ ì¸í„°íŽ˜ì´ìФì´ë‚˜ ê·¸ ìžì²´ê°€ 웹 페ì´ì§€ ìƒì˜ 그래픽 ì˜ì—ì„ ë‚˜íƒ€ë‚´ë¯€ë¡œ UI ì»´í¬ë„ŒíЏ 형태로 ì •ì˜ë˜ì–´ 있다. java.awt : 기본ì ì¸ 2D 그래픽(ìžë°” 2D) ë° í•˜ë¶€ ìœˆë„ ì‹œìŠ¤í…œ ì»´í¬ë„ŒíŠ¸ë¥¼ ê°ì‹¼ 무거운 ì»´í¬ë„ŒíЏ(ì˜ì–´: heavyweight component)를 ë‹´ê³ ìžˆë‹¤. java.awt.color, java.awt.font, java.awt.geom : 색 공간(ì˜ì–´: color space) ë° í”„ë¡œíŒŒì¼, 벡터 그래픽 ì—°ì‚°, 글꼴 등 ìžë°”2Dì˜ ì¼ë¶€ê°€ ë˜ëŠ” API를 ë‹´ê³ ìžˆë‹¤. java.awt.datatransfer, java.awt.dnd : 드래그 앤 드ë¡ê³¼ í´ë¦½ë³´ë“œ ê´€ë ¨ API를 ì •ì˜í•˜ê³ 있다. java.awt.event : 키, 마우스 등 ìž…ë ¥ê³¼ 하부 ìœˆë„ ì‹œìŠ¤í…œê³¼ì˜ í†µì‹ ì„ ìœ„í•œ ì´ë²¤íЏ ë° ë¦¬ìŠ¤ë„ˆ ì¸í„°íŽ˜ì´ìФ ì •ì˜ë¥¼ ë‹´ê³ ìžˆë‹¤. java.awt.im, java.awt.im.spi : 다êµì–´ ìž…ë ¥ì„ ìœ„í•´ 하부 ìœˆë„ ì‹œìŠ¤í…œì—서 ì œê³µí•˜ëŠ” ìž…ë ¥ 방법과 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ í• ìˆ˜ 있게 í•˜ê³ ìžë°”로 ìž…ë ¥ ë°©ë²•ì„ ìž‘ì„±í• ìˆ˜ 있게 한다. java.awt.image, java.awt.image.renderable : ì´ë¯¸ì§€ 처리 ë° ìž…ì¶œë ¥ ê¸°ëŠ¥ì„ ì œê³µí•œë‹¤. java.awt.print : í”„ë¦°íŒ…ì„ ìœ„í•œ ê¸°ëŠ¥ì„ ì œê³µí•œë‹¤ â‘¡pacakge2 javax.swing : 스윙 ì»´í¬ë„ŒíŠ¸ë“¤ê³¼ ê·¸ì— ë”¸ë¦° 모ë¸(ë°ì´í„° í˜¹ì€ ìƒíƒœ) ë° ê¸°íƒ€ API를 ì •ì˜í•œë‹¤. javax.swing.border : ì»´í¬ë„ŒíЏ í…Œë‘리 ê´€ë ¨ APIë“¤ì„ ì •ì˜í•œë‹¤. javax.swing.event : 스윙 ì»´í¬ë„ŒíЏì—서 사용ë˜ëŠ” ì´ë²¤íЏ ê°ì²´ ë° ë¦¬ìŠ¤ë„ˆ ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ ì •ì˜í•œë‹¤. javax.swing.colorchooser, javax.swing.filechooser, javax.swing.table : 색 ì„ íƒ, íŒŒì¼ ì„ íƒ ëŒ€í™” ìƒìž, í…Œì´ë¸” 등 복잡한 ì»´í¬ë„ŒíŠ¸ì— ë”¸ë¦° API를 ì •ì˜í•˜ê³ 있다. javax.swing.plaf, javax.swing.plaf.basic, javax.swing.plaf.metal, javax.swing.plaf.multi : javax.swingì— ì •ì˜ëœ ì»´í¬ë„ŒíŠ¸ë“¤ì— ëŒ€í•´ 룩앤필(look & feel)ì„ êµì²´í•˜ê¸° 위한 ê·œì•½ì„ ì •ì˜í•˜ê³ 있으며, basic, metal, synth, multi ë“±ì˜ ë¶€ 패키지ì—는 ê°ê° 서로 다른 ë£©ì•¤í•„ì„ êµ¬í˜„ì´ í¬í•¨ë˜ì–´ 있다. APIê°€ ê³µê°œëœ ë£©ì•¤í•„ì€ ë‹¤ë¥¸ ë£©ì•¤í•„ì„ ë§Œë“œëŠ”ë° í™œìš©í•˜ë„ë¡ ë§Œë“¤ì–´ì¡Œê¸° 때문ì´ë‹¤. javax.swing.text, javax.swing.text.html, javax.swing.text.html.parser, javax.swing.text.rtf : í…스트 ì»´í¬ë„ŒíŠ¸ë¥¼ 위한 API를 ì •ì˜í•˜ê³ 있으며 ë¶€ 패키지들ì—서는 HTML, RTF ê°™ì€ íŒŒì¼ í˜•ì‹ì„ ì½ê±°ë‚˜ 편집하기 위한 êµ¬í˜„ì´ í¬í•¨ë˜ì–´ 있다. javax.swing.tree javax.swing.undo : Undo ì§€ì›ì„ 위한 API를 ì •ì˜í•˜ê³ 있다. â‘¢package3 java.lang : ìžë°” 언어와 ê´€ë ¨ëœ í•µì‹¬ API. Stringì´ ì´ íŒ¨í‚¤ì§€ì— ì†í•œë‹¤. java.sql : JDBC(Java DataBase Connectivity) ê´€ë ¨ API로 관계형 ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†í•´ì„œ 질ì˜ë¥¼ ë˜ì§€ê³ 결과를 ë°›ì„ ìˆ˜ 있게 ì§€ì›í•œë‹¤. java.text : 문ìžì—´ ë° ë‚ ì§œ, ìˆ«ìž ë“±ì„ í¬ë§·íŒ… í• ìˆ˜ 있ë„ë¡ ì§€ì›í•˜ëŠ” API java.util : 리스트, ë§µ 등 ì½œë ‰ì…˜ API와 기타 ìœ ìš©í•œ íŽ¸ì˜ API javax.print, javax.print.attribute, javax.print.attribute.standard, javax.print.event : javax.sound.midi, javax.sound.midi.spi, javax.sound.sampled, javax.sound.sampled.sip : javax.sql : }}} * java와 javaxì˜ ì°¨ì´ëŠ” 무엇ì¸ê°€? * swing 초기 개발 목ì ì´ ìžë°” 1.1ê³¼ 1.2 ëª¨ë‘ ì‹¤í–‰ ë˜ëŠ” 것ì´ì—ˆë‹¤. 그래서 ìžë°” 1.1ì—서는 ì„ íƒì ë¼ì´ë¸ŒëŸ¬ë¦¬ë¡œ, ìžë°” 1.2ì—는 기본으로 ë“¤ì–´ê°€ëŠ”ë° ë¬¸ì œëŠ” java로 시작하는 패키지 ì´ë¦„ì€ ë‹¤ìš´ë¡œë“œëœ ì½”ë“œì—서는 쓸 수 없어서 javax로 ì´ë¦„ ë¶™ì˜€ë‹¤ê³ í•œë‹¤. * 출처 : [http://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%ED%94%8C%EB%9E%AB%ED%8F%BC,_%EC%8A%A4%ED%83%A0%EB%8D%94%EB%93%9C_%EC%97%90%EB%94%94%EC%85%98] * ì´ ì¤‘ 패키지 1ì€ AWT를 ì‚¬ìš©í• ë•Œ 필요한 패키지들ì´ë‹¤. ì´ ì±…ì—서는 java.applet, java.awt, java.awt.event ì •ë„ë§Œ ì‚¬ìš©í• ì˜ˆì •ì´ë‹¤. * 패키지 2는 JFC를 사용 í• ë•Œ 쓰는 패키지들로 ëŒ€ë¶€ë¶„ì˜ íŒ¨í‚¤ì§€ë¥¼ ì‚¬ìš©í• ì¤„ 알아야 한다. ~~(ì±…ì—서 기대하ë¼ê³ ì„ ì „í¬ê³ 를 í•˜ê³ ìžˆë‹¤.)~~ * 패키지3ì€ ë¶€ìˆ˜ì ì¸ ê²ƒë“¤ì´ë‹¤. java.sql, javax.sqlì€ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 위한 패키지들ì´ê³ ë‚˜ë¨¸ì§€ë„ ê°„ê°„ížˆ 사용한다. * AWT í”„ë ˆìž„ê³¼ ë ˆì´ë¸” * í”„ë ˆìž„ : form 어플리케ì´ì…˜ì˜ 작업대 {{{ package hanjagong_part3; import java.awt.*; public class Round17_Ex01 { public static void main(String[] ar){ Frame f = new Frame(); //f.show(true); //f.setVisible(true); } } }}} * 위 코드는 í”„ë ˆìž„ì„ ì¶œë ¥í•˜ëŠ” 코드ì´ë‹¤. 하지만 ë§‰ìƒ ì‹¤í–‰ì„ ì‹œì¼œë³´ë©´ ì•„ë¬´ê²ƒë„ ë‚˜ì˜¤ì§€ 않는다. * 사용ìžì—게 보여줘야 í• ì§€ ë§ì§€ì— 대한 ì„¤ì •ì´ false(보여주지 않는 것)으로 ë˜ì–´ 있기 때문ì´ë‹¤. * ì´ë¥¼ ì¶œë ¥í•˜ëŠ” 메소드는 java.awt.Componentì˜ show() (í˜¹ì€ show(boolean))ì´ë‹¤. * 위 코드를 ë³´ë©´ showê°€ 가로 ì¤„ì´ ì³ì ¸ 있는 ê²ƒì„ ë³¼ 수 있다 * 간단히 ë§í•´ 소멸 ë˜ì—ˆë‹¤ëŠ” 것ì´ë‹¤. JDK 1.1 ì´í›„ì—는 setVisible(boolean)ì´ë¼ëŠ” 메서드 ëŒ€ì‹ ì‚¬ìš© ëœë‹¤. * 화면 í¬ê¸° ì¡°ì ˆ 메소드 : java.awt.Componentì˜ setSize(int width, int height). 단위는 픽셀 * ê·¸ 외 ì ì •í•œ í¬ê¸°ë¥¼ í• ë‹¹í•˜ë„ë¡ í•˜ëŠ” 메소드로 JVMì˜ pack()ì´ ìžˆë‹¤. * 화면 위치 ì¡°ì ˆ 메소드 : java.awt.Componentì˜ setLocatino(int x, int y) {{{ 화면과 í”„ë ˆìž„ì˜ í¬ê¸° 1. í™”ë©´ì˜ í¬ê¸° Dimension dimen = Toolkit.getDefaultToolkin().getScreenSize(); 2. í”„ë ˆìž„ì˜ í¬ê¸° Dimension dimen1 = f.getSize(); }}} * Dimension í´ëž˜ìФ : íŠ¹ì •í•œ 사ê°í˜• ì˜ì—ì„ ê´€ë¦¬í•˜ê¸°ì— íŽ¸ë¦¬í•˜ë„ë¡ ë§Œë“¤ì–´ì§„ í´ëž˜ìФ * í™”ë©´ì˜ íê³¼ 높ì´ë¥¼ ì–»ì–´ë‚´ë ¤ë©´ ì´ í´ëž˜ìФ ì•ˆì˜ getWidth()와 getHeight()를 사용하면 ëœë‹¤. * ìžê³ 로 ì¢Œí‘œì˜ ì¤‘ì‹¬ì€ ì™¼ìª½ ìƒì¸µì´ë‹¤. * ì œëª© ì„¤ì • ë°©ë²•ì€ ë‘가지가 있다. * 첫번째. Frame f = new Frame("ì œëª©ë¶€ë¶„"); * ë‘번째. f.setTitle("ì œëª©ë³€ê²½"); (java.awt.Frame ì•ˆì— ìžˆëŠ” 메소드 setTitle(String title)ì„ ì‚¬ìš©) {{{ 1. 작업 ì˜ì—ì„ ë¶„í• í•˜ëŠ”ë° í•„ìš”í•œ í´ëž˜ìŠ¤ì™€ 메서드 - LayoutManager í´ëž˜ìФ - jav.awt.Container í´ëž˜ìŠ¤ì˜ setLayout(LayoutManager mgr) 2. 해당 작업 ì˜ì—ì— ì˜¬ë ¤ì§ˆ Component í´ëž˜ìФ 3. 해당 Component í´ëž˜ìŠ¤ë¥¼ 작업 ì˜ì—ì— ì˜¬ë¦´ 메서드 - java.awt.Container í´ëž˜ìŠ¤ì˜ add(Component cmp), add(Component cmp, int pos), add(String posname, Component cmp) 4. Layout ì„¤ì •ì´ nullì¼ ê²½ìš° 위치를 ì§€ì •í•´ 주는 메서드 - java.awt.Component í´ëž˜ìŠ¤ì˜ setBounds(int x, int y, int width, int height), setBounds(Rectangle rec) }}} * Frameê³¼ ìƒìœ„ í´ëž˜ìŠ¤ì˜ ë©¤ë²„ë“¤ * java.awt.Component * Fields || 필드 ì†ì„± || 필드명 || ë‚´ìš© || || static final float || CENTER_ALIGNMENT ||<|5> Componentì˜ ìœ„ì¹˜ ì§€ì •ì— ì‚¬ìš©ë˜ëŠ” 멤버필드(중앙, ìƒ, 하, 좌, ìš° ë°©í–¥) || || static final float || TOP_ALIGNMENT || || static final float || BOTTOM_ALIGNMENT || || static final float || LEFT_ALIGNMENT || || static final float || RIGHT_ALIGNMENT || * methods || Return_type method || ë‚´ìš© || || Color getBackground() || Componentì˜ ë°°ê²½ ìƒ‰ìƒ || || Rectangle getBounds() || Componentì˜ ìœ„ì¹˜ì™€ í¬ê¸° || || Component getComponentAt(int x, int y) || x와 y ìœ„ì¹˜ì˜ Component || || Cursor getCursor() || Componentì— ì ìš©ëœ ì»¤ì„œ || || Font getFont() || Componentì˜ í°íЏ || || Color getForeground() || Componentì˜ ê¸€ìž ìƒ‰ìƒ || || int getheight() || Componentì˜ ë†’ì´ || || Point getLocation() || Componentì˜ ìœ„ì¹˜ || || Dimension getMaximumSize() || Componentì˜ ìµœëŒ€ í¬ê¸° || || Dimension getMininumSize() || Componentì˜ ìµœì†Œ í¬ê¸° || || String getName() || Component ì´ë¦„ || || Container getParent() || Component를 í¬í•¨í•œ Container || || Dimension getPreferredSize() || Componentì˜ ì ì • í¬ê¸° || || Dimension getSize() || Componentì˜ í¬ê¸° || || int getWidth() || Componentì˜ ë„“ì´ || || int getX() || Componentì˜ xì¶• 위치 || || int getY() || Componentì˜ yì¶• 위치 || || boolean hasFocus() || Focusê°€ 위치해 있는지를 í™•ì¸ || || Void invalidate() || Component를 ê°±ì‹ í•˜ì§€ ì•ŠìŒ || || boolean isEnabled || 활성화 ë˜ì—ˆëŠ”ì§€ë¥¼ íŒë‹¨ || || Void requestFocus() || 커서를 위치시킴 || || Void setBackground(Color c) || ë°°ê²½ 색ìƒì„ c로 ì„¤ì • || || Void setBounds(int x, int y, int w, int h) || 위치와 í¬ê¸°ë¥¼ x, y, w, h로 ì„¤ì • || || Void setBounds(Rectangle rec) || 위치와 í¬ê¸°ë¥¼ rec로 ì„¤ì • || || Void setCursor(Cursor cur) || ì»¤ì„œì˜ í˜•íƒœë¥¼ cur로 ì„¤ì • || || Void setEnabled(boolean bool) || 활성화를 true/false로 ì„¤ì • || || Void setFont(Font f) || í°íŠ¸ë¥¼ f로 ì„¤ì • || || Void setForeground(Color c) || ê¸€ìž ìƒ‰ìƒì„ c로 ì„¤ì • || || Void setLocation(int x, int y) || 위치를 x, y로 ì„¤ì • || || Void setLocation(Point p) || 위치를 p로 ì„¤ì • || || Void setName(String name) || ì´ë¦„ì„ name로 ì„¤ì • || || Void setSize(Dimension dimen) || í¬ê¸°ë¥¼ dimen으로 ì„¤ì • || || Void setSize(int width, int height) || í¬ê¸°ë¥¼ width와 height로 ì„¤ì • || || Void setVisible(boolean bool) || Display를 true/false로 ì„¤ì • || || String toString() || Componentì˜ ê³ ìœ ì´ë¦„ || || Void validate() || Component를 ê°±ì‹ í•¨ || * java.awt.Container * methods || Return_type Method || ë‚´ìš© || || Component add(Component comp) || Component 추가 || || Component add(Component comp, int index) || Component를 íŠ¹ì • ìœ„ì¹˜ì— ì¶”ê°€ || || Component add(String name, Component comp) || Component를 íŠ¹ì • ì´ë¦„ì— ì¶”ê°€ || || Component getComponent(int index) || íŠ¹ì • ìœ„ì¹˜ì˜ Component 얻기 || || int getComponentCount() || Componentì˜ ê°œìˆ˜ || || Component [ ] getComponents() || ëª¨ë“ Component 얻기 || || LayoutManager getLayout() || ì ìš©ëœ LayoutManager 얻기 || || Void remove(Component comp) || Component ì œê±° || || Void remove(int index) || íŠ¹ì • ìœ„ì¹˜ì˜ Component ì œê±° || || Void removeAll() || ëª¨ë“ Component ì œê±° || || Void setLayout(LayoutManager mgr) || LayoutManager ì„¤ì • || * 오버ë¼ì´ë”© ëœ ë©”ì„œë“œëŠ” ì œì™¸ * jav.awt.Window * Constructs || Construct || ë‚´ìš© || || Window(Frame owner) || íŠ¹ì • Frameì— ì†Œì†ëœ Window || || Window(Window owner) || íŠ¹ì • Windowì— ì†Œì†ëœ Window || * methods || Return_type Method || ë‚´ìš© || || void dispose() || Window를 소멸시킨다. || || Component getFocusOwner() || 현재 Focusëœ Component를 리턴 || || Window getOwner() || 현재 Windowê°€ í¬í•¨ëœ Window || || void hide() || Window를 숨긴다 || || boolean isActive() || Windowê°€ 활성화 ìƒíƒœì¸ì§€ë¥¼ í™•ì¸ || || boolean isFocused() || Windowì— Focusê°€ 있는지 í™•ì¸ || || void pack() || JVMì´ ì ì • í¬ê¸°ì˜ Window를 íŒë‹¨ || || void show() || Window를 보여준다 || || void toBack() || 현재 Window를 뒤로 숨긴다 || || void toFront() || 현재 Window를 앞으로 보여준다 || * java.awt.Frame * Fields || 필드 ì†ì„± || 필드명 || ë‚´ìš© || || static final int || ICONIFIED || Frameì˜ ì•„ì´ì½˜í™”ëœ ìƒíƒœ 피트를 표시 || || static final int || MAXIMIZED_BOTH || Frameì˜ ìµœëŒ€ í¬ê¸°ì— 관한 ìƒíƒœ 비트 || || static final int || MAXIMIZED_HORIZ || Frameì˜ ê°€ë¡œì¶• 최대 í¬ê¸° 비트 || || static final int || MAXIMIZED_VERT || Frameì˜ ì„¸ë¡œì¶• 최대 í¬ê¸° 비트 || || static final int || NORMAL || 기본 í¬ê¸°ë¥¼ 표시하는 ìƒíƒœ 비트 || * Constructs || Construct || ë‚´ìš© || || Frame() || 기본 Frame ìƒì„±ìž || || Frame(String title) || Titleì„ ì§€ì •í•˜ëŠ” ìƒì„±ìž || * Methods || Return_Type Method || ë‚´ìš© || || satic Frame[ ] getFrames() || ì‹¤í–‰ì¤‘ì¸ ëª¨ë“ Frameì„ ì–»ê¸° || || Image getIconImage() || Frameì˜ ì¢Œì¸¡ ìƒë‹¨ ì´ë¯¸ì§€ 얻기 || || Menubar getMenuBar() || ì„¤ì •ëœ MenuBar ê°ì²´ 얻기 || || int getState() || Frameì˜ í˜„ ìƒíƒœ 얻기 || || String getTitle() || 현 Frameì˜ title 얻기 || || Boolean isResizable() || 현 Frameì˜ í¬ê¸° 변경 가능 ìœ ë¬´ í™•ì¸ || || void setIconImage(Image img) || 좌측 ìƒë‹¨ì˜ ì´ë¯¸ì§€ 변경하여 ì„¤ì • || || void setMenuBar(MenuBar mb) || MenuBar를 ì„¤ì • || || void setResizable(boolean bool) || Frame í¬ê¸° 변경 가능 ìœ ë¬´ ì„¤ì • || || void setState(int state) || Frameì˜ ìƒíƒœ ì„¤ì • || || void setTitle(String title) || Frameì˜ title ì„¤ì • || * AWT ë ˆì´ì•„웃 ë©”ë‹ˆì € * java.awt.Container í´ëž˜ìŠ¤ì˜ setLayout(LayoutManager mgr)메서드를 사용해서 ì ìš© * FlowLayout Manager : ì»´í¬ë„ŒíŠ¸ë¥¼ í”„ë ˆìž„ìƒì— ì›ëž˜ì˜ í¬ê¸°ëŒ€ë¡œ 차례로 배치하는 ë ˆì´ì•„웃 ë§¤ë‹ˆì € * ìƒì„±ìž : FlowLayout(), FlowLayout(int pos) // pos = CENTER, LEFT, RIGHT * GridLayoutManager : í”„ë ˆìž„ì„ ê·¸ë¦¬ë“œë¡œ 나누어 ì»´í¬ë„ŒíŠ¸ë¥¼ 차례대로 배치하는 ë ˆì´ì•„웃 ë§¤ë‹ˆì € * ìƒì„±ìž : GridLayout(int x, int y), GridLayout(int x, int y, int xgap, int ygap) * 행과 열로 구분해주는 ìƒì„±ìžê°€ 존재 * FlowLayoutê³¼ 마찬가지로 add(Component comp)를 사용. 하지만 ì»´í¬ë„ŒíŠ¸ì˜ í¬ê¸°ê°€ í”„ë ˆìž„ì˜ í¬ê¸°ì™€ í–‰, ì—´ì˜ ê°¯ìˆ˜ì— ì˜í–¥ì„ 받는다. * BorderLayout Manager : í”„ë ˆìž„ì„ 5ê°œ ë°©í–¥(ë™ì„œë‚¨ë¶ê³¼ 중앙)으로 나누어 ì»´í¬ë„ŒíŠ¸ë¥¼ íŠ¹ì • 방향으로 배치하는 ë ˆì´ì•„웃 ë§¤ë‹ˆì € * ìƒì„±ìž : BorderLayout(), BorderLayout(int xgap, int ygap) * "BorderLayout.멤버_필드" ì—서 멤버필드는 ëª¨ë‘ ëŒ€ë¬¸ìž, add(component comp)ì— ë“¤ì–´ê°€ëŠ” ë°©í–¥ì€ ì²«ê¸€ìžë§Œ 대문ìžì´ë‹¤. * this.add(); ë‘개를 or로 묶어서 대ê°ì„ ë°©í–¥ë„ ì„¤ì • í• ìˆ˜ 있다. * 다른 ìžë¦¬ê°€ ì±„ì›Œì ¸ 있지 않으면 Centerì˜ ì»´í¬ë„ŒíŠ¸ê°€ ê·¸ ìžë¦¬ë¥¼ 매우게 ëœë‹¤. * CardLayout Manager : í”„ë ˆìž„ì— ì¹´ë“œë¥¼ ì—Žì–´ ë†“ì€ ë“¯ì´ ì—¬ëŸ¬ê°œì˜ Container를 ìƒì†ë°›ì€ Panel ê°™ì€ ê°ì²´ë¥¼ í¬ê°œ 놓ì€ë“¯í•œ ë°°ì¹˜ì˜ ë ˆì´ì•„웃 ë§¤ë‹ˆì € ~~(마치 슬ë¼ì´ë“œ 배경색 바뀌듯)~~ * ìƒì„±ìž : CardLayout(), CardLayout(int hgap, int vgap) * ì›í•˜ëŠ” 카드를 불러낼 때ì—는 show() 메서드로 ì›í•˜ëŠ” ìœ„ì¹˜ì— ì›í•˜ëŠ” 카드를 ì‹ë³„ìžë¡œ 부른다. * CardLayout으로 여백 ì¡°ì • 가능 * GridBagLayout Manager : í”„ë ˆìž„ì˜ ì¢Œì¸¡ ìƒë‹¨ì„ 기준으로 íê³¼ í¬ê¸°ë¥¼ ì •í•˜ì—¬ ì»´í¬ë„ŒíŠ¸ë¥¼ 배치하는 ê³ ì°¨ì›ì˜ ë ˆì´ì•„웃 ë§¤ë‹ˆì € * ìƒì„±ìž : GridBagLayout() * ê´€ë ¨ í´ëž˜ìФ ìƒì„±ìž : GridBagConstraints(), GridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, int weightx, int weighty, int anchor, int fill, int insets, int ipadxm int ipady) {{{ gridx, gridy : ì»´í¬ë„ŒíŠ¸ì˜ x, yì˜ ìœ„ì¹˜ gridwidth, gridheight : ì»´í¬ë„ŒíŠ¸ì˜ default í¬ê¸°ì— 대한 íê³¼ 높ì´ì˜ ì†Œì† ë°°ìœ¨ weightx, weighty : ì»´í¬ë„ŒíЏ ê° ì˜ì—ì˜ í¬ê¸° 비율 anchor : ì˜ì— ë‚´ë¶€ì—ì„œì˜ ì»´í¬ë„ŒíЏ 위치(CENTER, NORTH, SOUTH, WEST, EAST, NORTHWEST, NORTHEAST, SOUTHWEST,SOUTHEAST) fill : ì˜ì—ì„ ì±„ìš°ê¸° 위한 ì†ì„± ì§€ì •(NONE, BOTH, VERTICAL, HORIZONTAL) insets : ì»´í¬ë„ŒíŠ¸ì˜ ì˜ì— ë‚´ë¶€ì—ì„œì˜ ì—¬ë°± ipadx, ipady : ì»´í¬ë„ŒíŠ¸ì˜ í¬ê¸° 추가 }}} == ë‹¤ìŒ ì§„í–‰ == * [김용준] í•™ìš°ì˜ File I/O == ê³¼ì œ == * 계산기 gui 만들기 * 필요하다면 아래 있는 Base를 ì´ìš©í•´ì„œ 만들 것. * Base {{{ import java.util.Scanner; public class base { public static void main(String [] args){ Scanner scan = new Scanner(System.in); String input; System.out.println("x ? y or exit"); while( true ) { System.out.print("Calculate : "); input = scan.nextLine(); if(input.equals("exit")) break; Calculation(input); } scan.close(); } static void Calculation(String input){ int x = 0, y = 0; String[] tmp = input.split(" "); try { x = Integer.parseInt(tmp[0]); y = Integer.parseInt(tmp[2]); } catch (NumberFormatException e) { System.out.println("Insert only a number!"); return; } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Insert only this form!(x ? y)"); return; } switch(tmp[1]) { case "+": System.out.println(x+y); break; case "-": System.out.println(x-y); break; case "*": System.out.println(x*y); break; case "/": try{ System.out.println(x/y); } catch (ArithmeticException e){ System.out.println("Don't divide by 0!"); return; } break; } } } }}} === ìœ ìž¬ë²” === {{{ }}} === ì´ì§€ìˆ˜ === {{{ }}} === 김용준 === {{{ package Calculator_140728; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import Calculator_140728.base; public class gui_v1 { public static void main( String [] args){ new Calculator("계산기"); } } class Calculator extends JFrame{ String[] strOpt = { "/", "*", "-", "+", "C", "="}; String strFm = ""; //수ì‹ë¼ë²¨ì„ 위한 ìŠ¤íŠ¸ë§ String strTf = ""; //í…스트 필드를 위한 ìŠ¤íŠ¸ë§ String strCal = ""; //ê³„ì‚°ì„ ìœ„í•œ ìŠ¤íŠ¸ë§ String result = "0"; //ê²°ê³¼ê°’ì„ ìœ„í•œ ìŠ¤íŠ¸ë§ //=ì„ ìœ„í•œ 변수 Boolean countE = false;// ì—°ì† = 기능 비활성화 int tmpE; String strE; //ì—°ì† ì—°ì‚°ì„ ìœ„í•œ 변수 Boolean countO = false;// ì—°ì† ì—°ì‚° 기능 비활성화 Boolean countP = false;// ì—°ì‚°ìž ë³€ê²½ String tmpO;//ì´ì „ ìž…ë ¥ë°›ì€ ìˆ˜ JButton[] num = new JButton[10]; JButton[] opt = new JButton[strOpt.length]; JLabel fm = new JLabel(); //현재 ê³„ì‚°ì‹ ë³´ëŠ” ë¼ë²¨ JTextField tf = new JTextField("0");//숫ìžì™€ ì—°ì‚° JPanel see = new JPanel(); JPanel input_num = new JPanel(); JPanel input_opt = new JPanel(); private void compose() { Container container = this.getContentPane(); container.setLayout(new BorderLayout(4,7)); //ì—°ì‚°ìž input_opt.setLayout(new GridLayout(4,1,10,10)); for(int i = 0; i < opt.length; i++) { opt[i] = new JButton(strOpt[i]); opt[i].setFont(new Font("굴림", Font.BOLD, 15)); if(i < 4) input_opt.add(opt[i]); } container.add("East",input_opt); //ë¼ë²¨ê³¼ í…스트박스 see.setLayout(new GridLayout(2,1,0,2)); see.add(fm); see.add(tf); fm.setFont(new Font("굴림", 0, 12)); tf.setFont(new Font("굴림", Font.BOLD, 21)); container.add("North",see); //ìˆ«ìž ë¶€ë¶„ input_num.setLayout(new GridLayout(4,3,3,10)); for(int i = 0 ; i <= 9 ; i++) { num[i] = new JButton(Integer.toString(i)); num[i].setFont(new Font("굴림", Font.BOLD, 19)); } for(int i = 2 ; i >= 0 ; i--) for(int j = 1 ; j <= 3 ; j++) input_num.add(num[3*i+j]); input_num.add(num[0]); input_num.add(opt[4]); input_num.add(opt[5]); container.add("Center",input_num); } public Insets getInsets() {//ì—¬ë°±ì„ ì£¼ê¸° 위한 메소드 오보ë¼ì´ë”© Insets i = new Insets(30,15,15,15); return i; } private void setevent() { for(JButton e : num) e.addActionListener(new MyAction()); for(JButton e : opt) e.addActionListener(new MyAction()); } class MyAction implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { Object who = e.getSource(); for(int i = 0; i < num.length; i++){ if(who == num[i]){ strTf += i; tf.setText(strTf); countE = false;// ì—°ì† = 기능 비활성화 countP = false;// ì—°ì‚°ìž ë³€ê²½ 비활성화 } } for(int i = 0; i< opt.length; i++) if(who == opt[i]) operation(i); } private void operation(int nowOpt){ switch(nowOpt) { default: // ì—°ì‚°ìžë“¤ 기능 구현 if (tf.getText().equals("0")) {// 초기 0ê°’ strFm = "0 "+strOpt[nowOpt]+" "; fm.setText(strFm); } else if(tf.getText().equals(result) && countP) {// ì´ì „ ê°’ê³¼ ê°™ì„ ë•Œ ì—°ì‚°ìž ë³€ê²½ try{ strFm = fm.getText().substring(0, fm.getText().length()-2) + strOpt[nowOpt]+ " "; } catch (StringIndexOutOfBoundsException e) {// =ì„ í•œ 후 ì—°ì‚° ê²°ê³¼ì—서 다시 ì—°ì‚°í• ë•Œ strFm = tf.getText() + " " + strOpt[nowOpt] + " "; strTf = ""; } fm.setText(strFm); } else {// ì—°ì‚° tmpO = tf.getText(); if(countO){// ì—°ì† ì—°ì‚° strCal = result + strFm.substring(strFm.length()-3,strFm.length()) + tf.getText(); result = base.Calculation(strCal); tf.setText(result); countP = true; } else {// 첫 ì—°ì‚° countO = true;// ì—°ì† ì—°ì‚° 기능 활성화 result = tf.getText(); } strFm += tmpO + " " + strOpt[nowOpt] + " "; fm.setText(strFm); strTf = "";//ì²˜ìŒ ë²„íŠ¼ ìž…ë ¥ì„ ë°›ê¸° 위한 í…스트 필드 초기화 } break; case 4: // C 기능 구현 strFm = ""; strTf = ""; result = "0"; countE = false;// ì—°ì† = 기능 비활성화 countO = false;// ì—°ì† ì—°ì‚° 기능 비활성화 countP = false;// ì—°ì‚°ìž ë³€ê²½ 비활성화 fm.setText(strFm); tf.setText("0"); break; case 5:// = 기능 구현 if(countE){// ì—°ì† = 기능 strCal = result + strE + tmpE; result = base.Calculation(strCal); } else {// ì¼ë°˜ = 기능 try{ tmpE = Integer.parseInt(tf.getText());//마지막 연산한 ìˆ«ìž strE = strFm.substring(strFm.length()-3,strFm.length());//마지막 ì—°ì‚°ìž if(strFm.length() == 4) strCal = strFm + tf.getText();// 단순 ìˆ˜ì‹ ì¸ ê²½ìš° else strCal = result + strFm.substring(strFm.length()-3,strFm.length()) + tmpE;//복합 수ì‹ì¸ê²½ìš° result = base.Calculation(strCal); countE = true;// ì—°ì† = 기능 활성화 countO = false;// ì—°ì† ì—°ì‚° 기능 비활성화 countP = false;// ì—°ì‚°ìž ë³€ê²½ 비활성화 } catch (StringIndexOutOfBoundsException e) {//아무런 연산하지 ì•Šê³ ìˆ«ìž = í–ˆì„때 예외처리 result = tf.getText(); strTf = ""; } } strFm = "";//수ì‹ë¼ë²¨ 리셋 fm.setText(strFm); tf.setText(result); } } } public Calculator (String title){ super.setVisible(true); super.setTitle(title); super.setSize(218,313); super.setResizable(false); //화면 중앙 배치 Dimension d = super.getToolkit().getScreenSize(); super.setLocation(d.width/2 - super.getWidth()/2, d.height/2 - super.getHeight()/2); //종료 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.compose(); this.setevent(); } } }}} === ê¹€ì •ë¯¼ === {{{ //다들 열심히 하는 ëª¨ìŠµì´ ë³´ê¸° 좋네요 굳굳 //네? }}} == 후기 == * ì´ìƒí•œ ê³¼ì œì— ê³ í†µ 받는 ë™ê¸°ë“¤ì˜ ì›í•œì´ 들리지 않ëŠëƒ!!! * 하드 íŠ¸ë¡¤ë§ - [ìœ ìž¬ë²”] * ë¬¼ë¡ ì•ˆí•˜ì…”ë„ ë©ë‹ˆë‹¤. - [김용준] * AWT ì»´í¬ë„ŒíЏ 설명 í–ˆëŠ”ë° ê·¸ê²ƒë„ ì •ë¦¬í•´ì„œ ì˜¬ë ¤ì¤˜ - [ìœ ìž¬ë²”] * ì•„ ê³¼ì œí•˜ëŠ”ê±° êµ¬ê²½í• ë¼í–ˆëŠ”ë° ì†ŒìŠ¤ë¥¼ ê± ë³µë¶™í•´ë†”ì„œ ë³´ê¸°ë„ íž˜ë“¤ê³ ì‹¤í–‰ì‹œì¼œë³´ê¸°ë„ ê·€ì°®ë„¤... 님들 github안쓰세요????? ---- [한ìžê³µ/시즌3]