컴포넌트 (Component) 컨테이너 (Container) 레이아웃 (Layout) 이벤트처리 GUI 프로그래밍 [2/70]
자바애플리케이션콘솔애플리케이션 : 문자입출력그래픽애플리케이션 : GUI 를이용 GUI 란? Graphical User Interface 그래픽사용자인터페이스 GUI 애플리케이션을작성하기위한패키지 AWT(Abstract Window Toolkit) java.awt 스윙 (Swing) javax.swing AWT 를개선한 GUI 클래스라이브러리최근에개발되는 GUI 애플리케이션에서주로사용 [3/70]
컴포넌트 (component) 사용자와상호작용을할수있도록화면에표시되어지는그래픽아이템 종류 각컴포넌트에따른이벤트처리기를작성하여등록 버튼, 콤보박스, 리스트, 레이블, 텍스트, 리스트등 버튼기반컴포넌트 : 버튼, 체크박스, 라디오버튼 콤보박스 컴포넌트의종류 리스트 레이블 텍스트기반컴포넌트 : 텍스트필드, 텍스트영역 [4/70]
[5/70]
[6/70]
버튼기반컴포넌트 AbstractButton 추상클래스를상속받은컴포넌트를의미 버튼기반컴포넌트의종류 버튼체크박스라디오버튼 [7/70]
버튼 (button) 사용자입력을받는가장간단한방법으로버튼을눌렀을경우이벤트가발생 JButton 클래스의객체 버튼생성 JButton() JButton(String) // 이름이없는버튼생성 // 주어진이름의버튼생성 버튼주요메소드 settext(string) : 버튼의이름을줄때사용 gettext() : 버튼의이름값을얻음 [8/70]
[ 예제 12.1 - ButtonTest.java] import java.awt.*; import javax.swing.*; public class ButtonTest { public static void main(string[] args) { JFrame f = new JFrame("JButtonTest"); f.setdefaultcloseoperation(jframe.exit_on_close); f.setsize(320, 240); f.setlayout(new FlowLayout()); JButton button1 = new JButton(); f.add(button1); f.add(new JButton(" 확인 (OK)")); button1.settext(" 레이블세트 "); f.setvisible(true); [9/70]
체크박스 (check box) 주어진항목이선택되었는지를시각적으로나타내는컴포넌트 JCheckBox 클래스의객체 체크박스생성 JCheckBox() // 이름이없는체크박스를생성 JCheckBox(String) // 주어진이름의체크박스를생성 체크박스주요메소드 settext(string) : 체크박스의이름을줄때사용 gettext() : 체크박스의이름값을얻음 isselected() : 체크박스선택유무 setselected(boolean) : 선택상태를지정 [10/70]
체크박스예제 [ 예제 12.2 - CheckBoxTest.java] import java.awt.*; import javax.swing.*; public class CheckBoxTest { public static void main(string[] args) { JFrame f = new JFrame("JCheckBoxTest"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); f.setlayout(new FlowLayout()); f.setbackground(color.black); f.add(new JCheckBox(" 빨간색 ")); f.add(new JCheckBox(" 초록색 ")); f.add(new JCheckBox(" 파란색 ")); f.setvisible(true); [11/70]
라디오버튼 (radio button) 주어진항목중에서오직하나만을선택할수있는컴포넌트 JRadioButton 클래스객체 라디오버튼생성 ButtonGroup grp = new ButtonGroup(); // 버튼그룹생성 //... rb1 = new JRadioButton(" 하얀색 "); // 라디오버튼생성 grp.add(rb1); // 그룹에등록 rb2 = new JRadioButton(" 빨간색 "); // 라디오버튼생성 grp.add(rb2); // 그룹에등록 [12/70]
라디오버튼예제 [ 예제 12.3 - RadioButtonTest.java] import java.awt.*; import javax.swing.*; public class RadioButtonTest { public static void main(string[] args) { JFrame f = new JFrame("JRadioButtonTest"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); f.setlayout(new FlowLayout()); ButtonGroup grp = new ButtonGroup(); JRadioButton[] rb = new JRadioButton[4]; rb[0] = new JRadioButton(" 하얀색 "); rb[1] = new JRadioButton(" 빨간색 "); rb[2] = new JRadioButton(" 파란색 "); rb[3] = new JRadioButton(" 검은색 "); for (JRadioButton c : rb) { grp.add(c); f.add(c); f.setvisible(true); [13/70]
콤보박스 (combo box) 사용자가박스를클릭하면선택할항목이나타나는드롭다운 (drop-down) 형식의컴포넌트 JComboBox 클래스의객체 콤보박스는클릭한경우에만리스트가나타나므로공간을효율적으로사용 콤보박스생성 String[] Items = {" 하얀색 ", " 빨간색 ", " 파란색 ", " 검은색 "; // 항목저장 JComboBox cb = new JComboBox(Items); // 콤보박스생성 [14/70]
콤보박스예제 [ 예제 12.4 - ComboBoxTest.java] import java.awt.*; import javax.swing.*; public class ComboBoxTest { public static void main(string[] args) { JFrame f = new JFrame("JComboBoxTest"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); f.setlayout(new FlowLayout()); String[] Items = {" 하얀색 ", " 빨간색 ", " 파란색 ", " 검은색 "; JComboBox cb = new JComboBox(Items); // cb.addactionlistener(new CBAction()); // 이벤트처리기등록 f.add(cb); f.setvisible(true); [15/70]
리스트 (list) 콤보박스와매우유사하지만, 항상선택할수있는항목들이보임 JList 클래스의객체 리스트생성 public JList() // 선택항목이없는빈리스트를생성 public JList(Object[]) // Object 객체의배열이항목이됨 [16/70]
리스트예제 리스트를위한이벤트처리 [ 예제 12.5 - ListTest.java] import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; class ListSelection implements ListSelectionListener { public void valuechanged(listselectionevent e) { JList src = (JList)e.getSource(); String value = (String)src.getSelectedValue(); if (value.equals(" 하얀색 ")) src.getparent().setbackground(color.white); else if (value.equals(" 빨간색 ")) src.getparent().setbackground(color.red); else if (value.equals(" 초록색 ")) src.getparent().setbackground(color.green); else if (value.equals(" 파란색 ")) src.getparent().setbackground(color.blue); else if (value.equals(" 검은색 ")) src.getparent().setbackground(color.white); [17/70]
리스트예제 - 컴포넌트배치 [ 예제 12.5 - ListTest.java](cont.) public class ListTest { public static void main(string[] args) { JFrame f = new JFrame("JListTest"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); f.setlayout(new FlowLayout()); String[] Items = {" 하얀색 ", " 빨간색 ", " 초록색 ", " 파란색 ", " 검은색 "; JList list = new JList(Items); list.addlistselectionlistener(new ListSelection()); // 이벤트등록 f.add(list); f.setvisible(true); [18/70]
리스트예제 실행결과 클릭! [19/70]
레이블 (label) 주로텍스트필드와함께사용하여텍스트필드의의미를설명하는역할단순한텍스트문자열이며사용자의입력에반응하지않음 JLabel 클래스의객체 레이블생성 public JLabel(String text) { this(text, LEFT); public JLabel(String text, int alignment) 정렬방법왼쪽정렬 (Component.LEFT_ALIGNMENT) 오른쪽정렬 (Component.RIGHT_ALIGNMENT) 가운데정렬 (Component.CENTER_ALIGNMENT) [20/70]
텍스트필드 (text field) 사용자로부터한줄의입력을받는경우에사용 JTextField 클래스의객체 텍스트필드생성 public JTextField() // 이름없는텍스트필드 public JTextField(String text) // 이름있는텍스트필드 public JTextField(int columns) // 지정된글자수를갖는텍스트필드 public JTextField(String text, int columns) // 이름과지정된글자수를갖는텍스트필드 입력내용을화면에표시하지않는경우 JPasswordField 클래스사용 [21/70]
텍스트영역 (text area) 사용자로부터여러줄의입력을받는경우에사용 JTextArea 클래스의객체 텍스트영역생성 public JTextArea() // 이름없는텍스트영역 public JTextArea(String text) // 이름있는텍스트영역 public JTextArea(int rows, int columns) // 지정된줄과칸을갖는텍스트영역 public JTextArea(String text, int rows, int columns) // 이름과지정된줄 / 칸을갖는텍스트영역을생성 [22/70]
컴포넌트배치 [ 예제 12.6 - LabelAndTextTest.java] import java.awt.*; import java.awt.event.*; import javax.swing.*; public class LabelAndTextTest extends JFrame { JTextField tf = new JTextField("name", 10); JPasswordField pf = new JPasswordField(8); JTextArea ta = new JTextArea(3, 25); JButton b = new JButton("OK"); public LabelAndTextTest(String title) { // 생성자 super(title); this.add(new JLabel("Enter your name")); this.add(tf); this.add(new JLabel("Enter your password")); this.add(pf); this.add(ta); this.add(b); b.addactionlistener(new OKAction()); [23/70]
화면에그리는메소드및이벤트처리기 [ 예제 12.6 - LabelAndTextTest.java](cont.) public static void main(string[] args) { LabelAndTextTest f = new LabelAndTextTest("LabelAndTextTest"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); f.setlayout(new FlowLayout()); f.setvisible(true); class OKAction implements ActionListener { public void actionperformed(actionevent e) { // 이벤트처리기 ta.settext("name : "); ta.append(tf.gettext() + "\n"); ta.append("password : " + new String(pf.getPassword())); [24/70]
실행결과 seman oh ******** name : seman oh password : 22603342 [25/70]
JComponent 클래스의계층구조 JComponent 클래스의주요메소드 [ 표 12.1] 참조 [26/70]
JComponent 클래스의주요메소드 (Cont.) 메소드 Color getbackground() Border getborder() Font getfont() Color getforeground() Point getlocation() Dimension getsize() boolean isenabled() boolean isvisible() void paintcomponent(graphics g) 설명 설정된컴포넌트의배경색을반환설정된컴포넌트의경계를반환설정된컴포넌트의폰트를반환설정된컴포넌트의전경색을반환컴포넌트의위치를반환컴포넌트의크기를반환컴포넌트의사용가능여부를반환컴포넌트의표시가능여부를반환컴포넌트가그려질필요가있을때, 스윙이호출하는메소드. [27/70]
JComponent 클래스의주요메소드 메소드 void repaint(rectangle r) void setbackground(color bg) void setborder(border border) void setenabled(boolean enabled) void setfont(font font) void setforeground(color fg) void setlocation(int x, int y) void setsize(int witdh, int height) void setvisible(boolean aflag) 설명 특정영역만을다시그려야할때, 스윙이호출하는메소드컴포넌트의배경색을설정컴포넌트의경계를설정컴포넌트의사용가능여부를설정컴포넌트의폰트를설정컴포넌트의전경색을설정컴포넌트의위치를설정컴포넌트의폭과높이를설정컴포넌트의표시가능여부를설정 [28/70]
폰트의모양과배경 / 전경색을설정하는예제 [ 예제 12.7 - ComponentTest.java] import java.awt.*; import javax.swing.*; public class ComponentTest { public static void main(string[] args) { JFrame f = new JFrame(); f.setsize(320, 240); f.settitle("jcomponenttest"); f.setdefaultcloseoperation(jframe.exit_on_close); JButton b = new JButton(); f.add(b); b.setfont(new Font(Font.SERIF, Font.ITALIC Font.BOLD, 22)); b.setbackground(color.black); b.setforeground(color.yellow); Dimension d = b.getsize(); b.settext("size(width=" + d.width + ", height=" + d.height + ")"); f.setvisible(true); [29/70]
컨테이너 (container) 자신의영역안에컴포넌트들을포함하거나다른컨테이너들을포함하는것 컨테이너의종류 최상위컨테이너 (top-level container): 다른컨테이너에포함될수없음 Jframe : 윈도우프레임을나타냄 Jdialog : 대화상자 Japplet : 애플릿 일반컨테이너 : 다른컨테이너에포함될수있음 Jpanel : 다른컨테이너나컴포넌트를포함할때주로사용 JScrollPane : 내용의크기에따라스크롤바를표시, 표시영역조정 JTabbedPane : 같은공간을고용하는여러패널을탭으로구분 [30/70]
JFrame 제목표시줄이있는윈도우프레임을나타내는최상위컨테이너 JFrame 클래스의계층구조 [31/70]
Jframe 생성 JFrame() // 제목표시줄이공란인프레임을생성 JFrame(String title) // 제목표시줄이 title인프레임을생성 Jframe 주요메소드 Container getcontentpane() // 컨텐츠페인객체를반환 settitle(string title) // 프레임의제목설정 setdefaultcloseoperation(int operation) // 디폴트닫힘연산을설정디폴트닫힘연산에올수있는상수 DISPOSE_ON_CLOSE : 닫을때, 모든자원을반환 DO_NOTHING_ON_CLOSE : 닫을때, 아무일도하지않음 EXIT_ON_CLOSE : 닫을때, 윈도우를화면에서없애고프로그램을종료 HIDE_ON_CLOSE : 닫을때, 윈도우를화면에서숨김 ( 기본값 ) [32/70]
JPanel 다른요소들을포함할때사용하는컨테이너 JPanel 클래스의계층구조 [33/70]
java.awt.container 클래스 Container 클래스를확장하여정의 Container 클래스의주요메소드 메소드 Component add(component comp) Component[] getcomponents() LayoutManager getlayout() void invalidate() void remove(component comp) void removeall() void setlayout(layoutmanager mgr) void update(graphic g) 설명 컴포넌트를컨테이너에추가모든컴포넌트를반환컨테이너에서사용하는배치관리자를반환컨테이너를무효화함, 일반적으로무효화된컨테이너는화면에다시그려짐컴포넌트를컨테이너에서삭제모든컴포넌트를삭제배치관리자를설정컨테이너내용을갱신 [34/70]
레이아웃 (layout) 여러개의컴포넌트들을포함할수있고, 각컴포넌트의위치와크기를결정 레이아웃의종류 보더레이아웃 (Border Layout) 플로우레이아웃 (Flow Layout) 그리드레이아웃 (Grid Layout) 카드레이아웃 (Card Layout) 그리드백레이아웃 (Grid Bag Layout) [35/70]
보더레이아웃 (Border Layout) 컨테이너에컴포넌트의위치를동, 서, 남, 북, 중앙으로배치할때사용 동, 서, 남, 북의위치는일정한크기, 나머지여백은중앙이차지함 윈도우프레임을나타내는 JFrame 은레이아웃을지정하지않으면 기본적으로보더레이아웃 [36/70]
setlayout() 메소드를사용하여보더레이아웃을지정 setlayout(new BorderLayout()); setlayout(new BorderLayout(5, 5)); // 가로 5 픽셀, 세로 5 픽셀의간격 add() 메소드 레이아웃의동 ( East")/ 서 ("West")/ 남 ("South")/ 북 ("North")/ 중앙 ("Center") 의위치를지정 add("center", new JButton("Center")); [37/70]
보더레이아웃예제 [ 예제 12.8 - BorderLayoutTest.java] import java.awt.*; import javax.swing.*; public class BorderLayoutTest { public static void main(string[] args) { JFrame f = new JFrame("Border Layout"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); f.setlayout(new BorderLayout()); f.add("east", new JButton("East")); f.add("west", new JButton("West")); f.add("south", new JButton("South")); f.add("north", new JButton("North")); f.add("center", new JButton("Center")); f.setvisible(true); [38/70]
플로우레이아웃 (Flow Layout) 컨테이너안에컴포넌트들을가로방향으로배치할때사용 왼쪽에서오른쪽방향으로배치, 위에서아래로물흐르듯이배치 JPanel 은레이아웃을지정하지않으면기본적으로플로우레이아웃이설정 setlayout(new FlowLayout()); setlayout(new FlowLayout(FlowLayout.CENTER)); // 가운데정렬 setlayout(new FlowLayout(FlowLayout.RIGHT, 5, 5)); // 가로 5픽셀, 세로 5픽셀의간격 컴포넌트에대한정렬방식지정 LEFT, CENTER, RIGHT 상수등을제공 [39/70]
플로우레이아웃예제 [ 예제 12.9 - FlowLayoutTest.java] import java.awt.*; import javax.swing.*; public class FlowLayoutTest { public static void main(string[] args) { JFrame f = new JFrame("Flow Layout"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); f.setlayout(new FlowLayout()); f.add(new JButton(" 버튼 1")); f.add(new JButton(" 버튼 2")); f.add(new JButton(" 버튼 3")); f.add(new JButton(" 버튼 4")); f.add(new JButton(" 버튼 5")); f.setvisible(true); [40/70]
그리드레이아웃 (Grid Layout) 컨테이너안에있는모든컴포넌트들을격자내에배치 컴포넌트크기동일 그리드레이아웃을생성하기위해행과열의수를지정 setlayout(new GridLayout(3, 4)) // 3행 4열의그리드 setlayout(new GridLayout(2, 0)) // 2행의그리드 setlayout(new GridLayout(3, 2, 5, 5)) // 3행 2열의그리드 // 가로 5픽셀, 세로 5픽셀의간격 [41/70]
그리드레이아웃예제 [ 예제 12.10 - GridLayoutTest.java] import java.awt.*; import javax.swing.*; public class GridLayoutTest { public static void main(string[] args) { JFrame f = new JFrame("Grid Layout"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); f.setlayout(new GridLayout(3, 2, 5, 5)); f.add(new JButton(" 버튼 1")); f.add(new JButton(" 버튼 2")); f.add(new JButton(" 버튼 3")); f.add(new JButton(" 버튼 4")); f.add(new JButton(" 버튼 5")); f.add(new JButton(" 버튼 6")); f.setvisible(true); [42/70]
카드레이아웃 (Card Layout) 카드를쌓아놓은형태로컨테이너를볼수있도록배치 한번에한개의컨테이너객체 ( 카드 ) 를볼수있도록배치 카드레이아웃생성 JPanel cards = new JPanel(); cards.setlayout(new CardLayout()); JPanel card1 = new JPanel(); JPanel card2 = new JPanel(); cards.add(" 첫번째카드, card1); cards.add( 두번째카드, card2); cards.show(cards, " 첫번째카드 ); [43/70]
카드레이아웃예제 컴포넌트배치 [ 예제 12.11 - CardLayoutTest.java] public class CardLayoutTest implements ActionListener { JPanel cards; public void createui() { cards = new JPanel(); JPanel card1 = new JPanel(); card1.setbackground(color.blue); JButton b1 = new JButton("Next"); b1.setactioncommand("next"); b1.addactionlistener(this); card1.add(b1); JPanel card2 = new JPanel(); card2.setbackground(color.yellow); JButton b2 = new JButton("Prev"); b2.setactioncommand("prev"); b2.addactionlistener(this); card2.add(b2); cards.setlayout(new CardLayout()); cards.add(card1, "First"); cards.add(card2, "Second"); [44/70]
카드레이아웃예제 이벤트처리및보여주기 [ 예제 12.11 - CardLayoutTest.java](cont.) public void actionperformed(actionevent e) { CardLayout cl = (CardLayout) (cards.getlayout()); String str = e.getactioncommand(); if (str.equals("next")) cl.show(cards, "Second"); else if (str.equals("prev")) cl.show(cards, "First"); public static void main(string[] args) { JFrame f = new JFrame("Card Layout"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); CardLayoutTest clt = new CardLayoutTest(); clt.createui(); f.add(clt.cards); f.setvisible(true); [45/70]
실행결과 [46/70]
그리드백레이아웃 (Grid Bag Layout) 컴포넌트의위치와크기를자유롭게생성할수있는레이아웃 그리드백레이아웃생성 JFrame f = new JFrame(); GridbagLayout gbl = new GridbagLayout(); GridbagConstraints gbc = new GridbagConstraints(); f.setlayout(gbl); gbc.weightx = 1.0; gbl.setconstraints(button, gbc); f.add(button); 컨스트레인트 (constraints) 변수를사용하여컴포넌트의위치와크기를지정 gridx, gridy, gridwidth, gridheight, ipadx, ipady, anchor, weightx, weighty [47/70]
이벤트 (event) 사용자행동 (action) 에의해발생하는사건 이벤트처리기 (event handler) 특정이벤트가발생하면그와관련된메소드를통해처리하는것 이벤트 - 드리븐프로그래밍 (event-driven programming) 이벤트와이벤트처리기를통해프로그램을작성하는방식 위임 (delegation) 모델자바에서이벤트처리하는모델이벤트가발생하는컴포넌트에이벤트처리를위한리스너객체 (listener object) 를등록하여이벤트처리하는방법이벤트처리를위한코드가애플리케이션코드와분리됨으로써재사용성이높음 [48/70]
이벤트프로그래밍을위한순서 1 이벤트클래스를 import import java.awt.event.*; 2 이벤트타입의클래스를정의 class ButtonListener implements ActionListener { public void actionperformed(actionevent e) { // 이벤트처리기 //... 3 이벤트리스너객체를생성 ButtonListener bt = new ButtonListener(); 4 해당하는컴포넌트에이벤트리스너객체를등록 b1 = new Button("OK"); b1.addactionlistener(bt); [49/70]
이벤트의종류 모든컴포넌트에서발생할수있는공통이벤트 MouseEvent : 마우스이동이나마우스버튼이클릭된경우에발생한다. KeyEvent : 키보드의키를누른경우에발생한다. ComponentEvent : 컴포넌트의크기나위치, 보이기가부가변경될때발생한다. FocusEvent : 포커스를얻거나잃을때발생한다. [50/70]
이벤트의종류 (cont.) 컴포넌트에서발생할수있는이벤트의종류 [51/70]
리스너인터페이스 구현시모든메소드를정의해야함 각이벤트에따른리스너인터페이스및이벤트등록 / 제거메소드 [52/70]
어답터클래스 필요한메소드만작성가능 리스너인터페이스 / 어답터클래스의메소드 [53/70]
어답터클래스 리스너인터페이스 / 어답터클래스의메소드 (cont.) [54/70]
이벤트처리예제 [ 예제 12.12 - SimpleEventHandling.java] import java.awt.event.*; import javax.swing.*; class ActionEventHandler implements ActionListener { public void actionperformed(actionevent e) { JButton b = (JButton)e.getSource(); b.settext(" 버튼을선택했습니다."); public class SimpleEventHandling { public static void main(string[] args) { JFrame f = new JFrame("Event Handling"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); JButton b = new JButton(" 버튼을누르세요."); b.addactionlistener(new ActionEventHandler()); f.add(b); f.setvisible(true); [55/70]
동적인프로그램작성에용이 예제프로그램 마우스이벤트처리응용 마우스버튼을누르거나떼면, MouseEvent라는이벤트가발생마우스를움직이면 MouseEvent라는이벤트가발생 색이변하는문자열만들기 스레드사용 이미지애니메이션 Timer 클래스사용 [56/70]
마우스이벤트예제 그리기및이벤트처리기등록 [ 예제 12.13 - MouseEventTest.java] class WhiteboardComponent extends JComponent { int x, y, w, h; WhiteboardComponent() { // 생성자 x = 0; y = 0; w = 0; h = 0; addmouselistener(new MouseEventHdl()); // 처리기등록 addmousemotionlistener(new MouseMotionHdl()); // 처리기등록 public void paintcomponent(graphics g) { g.setcolor(color.black); g.drawstring(" 마우스로사각형을그리세요.", 20, 50); g.setcolor(color.red); g.drawrect(x, y, w, h); public void setstartpoint(int x, int y) { this.x = x; this.y = y; public void setendpoint(int x, int y) { w = Math.abs(this.x - x); h = Math.abs(this.y - y); [57/70]
마우스이벤트예제 이벤트처리 [ 예제 12.13 - MouseEventTest.java](cont.) class MouseEventHdl extends MouseAdapter { public void mousepressed(mouseevent e) { // 이벤트처리기 setstartpoint(e.getx(), e.gety()); public void mousereleased(mouseevent e) { // 이벤트처리기 setendpoint(e.getx(), e.gety()); repaint(); class MouseMotionHdl extends MouseMotionAdapter { public void mousedragged(mouseevent e) { // 이벤트처리기 setendpoint(e.getx(), e.gety()); repaint(); [58/70]
마우스이벤트예제 [ 예제 12.13 - MouseEventTest.java](cont.) public class MouseEventTest { public static void main(string[] args) { JFrame f = new JFrame("MouseEventTest"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); f.add(new WhiteboardComponent()); f.setvisible(true); [59/70]
텍스트애니메이션예제 - 그리기 [ 예제 12.14 - TextAnimation.java] import java.awt.*; import java.awt.event.*; import javax.swing.*; class TextAnimationComponent extends JComponent { public String str; public void paintcomponent(graphics g) { g.setfont(new Font("Dialog", Font.BOLD, 30)); for (int i = 0; i < str.length(); i++) { int rval, gval, bval; rval = (int)(math.random() * 256); gval = (int)(math.random() * 256); bval = (int)(math.random() * 256); g.setcolor(new Color(rVal, gval, bval)); g.drawstring(str.substring(i, i + 1), 25 + i * 25, 50); [60/70]
텍스트애니메이션예제 이벤트처리및스레드 [ 예제 12.14 - TextAnimation.java](cont.) public public void class initcomponents() TextAnimation implements { Runnable, ActionListener { JFrame TextAnimation f; ta = this; TextAnimationComponent c; JButton ta.f = b; new JFrame(); Thread JFrame thr f = null; ta.f; f.settitle("text Animation"); f.setdefaultcloseoperation(jframe.exit_on_close); f.getcontentpane().setbackground(color.white); f.setsize(600, 250); ta.c = new TextAnimationComponent(); TextAnimationComponent c = ta.c; f.add(c); ta.b = new JButton(); JButton b = ta.b; b.addactionlistener(ta); b.settext("press to start the animation."); f.add("south", b); f.setvisible(true); [61/70]
텍스트애니메이션예제 스레드 [ 예제 12.14 - TextAnimation.java](cont.) public void setmessage(string message) { c.str = message; public String getmessage() { return c.str; public void run() { while (thr!= null) { try { c.repaint(); Thread.sleep(1 * 1000); catch (InterruptedException e) { [62/70]
텍스트애니메이션예제 이벤트처리 [ 예제 12.14 - TextAnimation.java](cont.) public void actionperformed(actionevent e) { if (thr == null) { thr = new Thread(this); thr.start(); b.settext("press to stop the animation."); else { thr = null; b.settext("press to start the animation."); public static void main(string[] arg) { TextAnimation ta = new TextAnimation(); ta.initcomponents(); ta.setmessage("welcome to my world!!!"); [63/70]
이미지애니메이션예제 타이머이벤트처리 [ 예제 12.15 - ImageAnimationTest.java] import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.bufferedimage; import java.io.*; import javax.imageio.imageio; class ImageAnimationComponent extends JComponent { Image[] images; int curimageindex; Timer t; class TimerHandler implements ActionListener { public void actionperformed(actionevent e) { // 타이머이벤트처리기 curimageindex++; // 다음이미지지정 curimageindex %= images.length; repaint(); [64/70]
이미지애니메이션예제 타이머사용 [ 예제 12.15 - ImageAnimationTest.java] ImageAnimationComponent(String imagename, int imagecount) { // 생성자 try { // 이미지읽기 images = new Image[imageCount]; for (int i = 0; i < images.length; i++) images[i] = ImageIO.read(new File(imageName + i + ".jpg")); catch (IOException e) { t = new Timer(250, new TimerHandler()); // 타이머객체생성 public void paintcomponent(graphics g) { // 이미지그리기 g.drawimage(images[curimageindex], 0, 0, null); public void start() { t.start(); // 타이머작동시작 public void stop() { t.stop(); // 타이머작동중지 boolean isrunning() { return t.isrunning(); // 타이머작동여부반환 [65/70]
이미지애니메이션예제 버튼이벤트처리 [ 예제 12.15 - ImageAnimationTest.java] public class ImageAnimationTest implements ActionListener { ImageAnimationComponent c; public void actionperformed(actionevent e) { // 버튼이벤트처리기 JButton b = (JButton)e.getSource(); if (c.isrunning()) { c.stop(); b.settext("press to start the animation."); else { c.start(); b.settext("press to stop the animation."); [66/70]
이미지애니메이션예제 - 보여주기 [ 예제 12.15 - ImageAnimationTest.java] public static void main(string[] arg) { JFrame f = new JFrame("Image Animation"); f.setsize(320, 240); f.setdefaultcloseoperation(jframe.exit_on_close); ImageAnimationTest ia = new ImageAnimationTest(); ia.c = new ImageAnimationComponent("penguin", 8); f.add(ia.c); JButton b = new JButton("Press to start the animation."); f.add("south", b); b.addactionlistener(ia); // 이벤트처리기등록 f.setvisible(true); [67/70]
컴포넌트 (component) 사용자와상호작용을할수있도록화면에표시되어지는그래픽표현들종류버튼, 콤보박스, 리스트, 레이블, 텍스트, 리스트등등 컨테이너 (Container) 자신의영역안에컴포넌트들을포함하거나다른컨테이너들을포함하는것 최상위컨테이너 (top-level container): 다른컨테이너에포함될수없음 Jframe, Jdialog, Japplet 일반컨테이너 : 다른컨테이너에포함될수있음 Jpanel, JScrollPane, JTabbedPane [68/70]
레이아웃 (layout) 여러개의컴포넌트들을포함할수있고, 각컴포넌트의위치와크기를결정 레이아웃의종류 보더레이아웃 (Border Layout) 플로우레이아웃 (Flow Layout) 그리드레이아웃 (Grid Layout) 카드레이아웃 (Card Layout) 그리드백레이아웃 (Grid Bag Layout) [69/70]
이벤트처리 이벤트 (event) : 사용자행동 (action) 에의해발생하는사건 이벤트처리기 (event handler) : 특정이벤트가발생하면그와관련된메소드를통해처리하는것 이벤트프로그래밍을위한순서 1 이벤트클래스를 import 2 이벤트타입의클래스를정의 3 이벤트리스너객체를생성 4 해당하는컴포넌트에이벤트리스너객체를등록 GUI 프로그래밍마우스이벤트처리응용색이변하는문자열만들기이미지애니메이션 [70/70]