10. 이벤트 처리와 그래픽프로그래밍 자바프로그래밍 강원대학교
이벤트 처리 자바프로그래밍 강원대학교
이벤트 (Events) 이벤트 발생 버튼을 클릭할 때 텍스트필드에 문자를 타이핑할 때 콤보박스에서 아이템을 선택할 때 타이머가 타임아웃될 때, 등등... 버튼, 텍스트필드 등 GUI 콤포넌트들이 이벤트 소스(source)임 자바프로그래밍 강원대학교
이벤트 (Events) 프로그래머는 많은 이벤트 중 관심 있는 이벤트에 대해서만 필요한 반응을 보이도록 프로그램 작성 특정 GUI 콤포넌트에서 발생하는 특정 이벤트에 대해 어떤 반응을 보이도록 하려면 적절한 이벤트 리스너(listener)를 만들어 이를 해당 콤포넌트에 등록해 줌 이벤트 리스너 = 이벤트 처리기 자바프로그래밍 강원대학교
이벤트 소스와 이벤트 리스너 Event listener: Event source: 이벤트가 발생될 때 그 사실을 통보받는 객체 프로그래머에 의해 작성되는 클래스 객체 이벤트가 발생되었을 때 해야 할 작업이 이곳에 정의되어 있음 이벤트 리스너가 등록되지 않은 이벤트에 대해서는 아무 반응도 없게 됨 Event source: 어떤 컴포넌트에서 이벤트가 발생되면 그 컴포넌트에 등록된 모든 이벤트 리스너들에게 이벤트 발생 사실이 통보됨 자바프로그래밍 강원대학교
Event Object Event Source Event Listener 자바프로그래밍 강원대학교
이벤트 소스와 이벤트 리스너 이벤트가 여러 리스너에게 전달될 수 있다. 한 리스너가 여러 소스로부터 이벤트를 받을 수 있다. 자바프로그래밍 강원대학교
EventListener의 예: ActionListener 버튼을 클릭하면 action event 발생 (버튼: 이벤트 소스) 이에 대해 반응을 보이게 하려면 ActionListener 객체를 버튼에 등록해 줌 (이 ActionListener 객체가 이벤트 처리기임) ActionListener 객체 = ActionListener 인터페이스를 구현한 객체 버튼 클릭에 따라 Action 이벤트가 발생하면 ActionListener의 actionPerformed 메소드가 실행됨 public interface ActionListener { void actionPerformed(ActionEvent event); } 자바프로그래밍 강원대학교
actionPerformed(ActionEvent event); ActionListener 등록 actionPerformed(ActionEvent event); 호출 자바프로그래밍 강원대학교
Output 버튼을 클릭하면 Action 이벤트가 발생함! ActionListener 자바프로그래밍 강원대학교
File ButtonTester.java public class ButtonViewer { public static void main(String[] args) JFrame frame = new JFrame(); JButton button = new JButton("Click me!"); frame.add(button); button.addActionListener(new ClickListener()); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } 이벤트 처리기 (버튼에서 발생하는 Action 이벤트를 처리함) 자바프로그래밍 강원대학교
ActionListener(Action 이벤트 처리기) 구현 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ClickListener implements ActionListener { public void actionPerformed(ActionEvent event) System.out.println("I was clicked."); } ClickListener 객체는 ActionListener 인터페이스를 구현하고 있음 (ClickListener 객체는 ActionListener임) ClickListener 객체를 이벤트 리스너로서 버튼에 등록해 주면 버튼 클릭 때마 다 ClickListenr의 actionPerformed 메소드가 실행됨 자바프로그래밍 강원대학교
public class ButtonViewer{ public static void main(String[] args){ JFrame frame = new JFrame(); JButton button = new JButton("Click me!"); frame.add(button); class ClickListener implements ActionListener{ public void actionPerformed(ActionEvent event){ System.out.println("I was clicked."); } ActionListener listener = new ClickListener(); button.addActionListener(listener); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); 이렇게 하는 것도 가능! local inner class 자바프로그래밍 강원대학교
예 2 ActionListener 자바프로그래밍 강원대학교
public class ButtonViewer{ public static void main(String[] args){ JFrame frame = new JFrame(); JPanel panel = new JPanel(); JButton button = new JButton("Click me!"); final JTextField textField = new JTextField(20); panel.add(button); panel.add(textField); frame.add(panel); class ClickListener implements ActionListener{ public void actionPerformed(ActionEvent event){ textField.setText("I was clicked."); } ActionListener listener = new ClickListener(); button.addActionListener(listener); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); local inner class 자바프로그래밍 강원대학교
그 local class를 포함하고 있는 메소드의 지역변수를 사용하려면 그 지역변수가 final로 선언되어 있어야 한다. public class ButtonViewer{ public static void main(String[] args){ JFrame frame = new JFrame(); JPanel panel = new JPanel(); JButton button = new JButton("Click me!"); final JTextField textField = new JTextField(20); panel.add(button); panel.add(textField); frame.add(panel); class ClickListener implements ActionListener{ public void actionPerformed(ActionEvent event){ textField.setText("I was clicked."); } ... Local class 내에서 그 local class를 포함하고 있는 메소드의 지역변수를 사용하려면 그 지역변수가 final로 선언되어 있어야 한다. 자바프로그래밍 강원대학교
local inner class를 사용하지 않는 경우와 비교 public class ButtonViewer{ public static void main(String[] args){ JFrame frame = new JFrame(); JPanel panel = new JPanel(); JButton button = new JButton("Click me!"); final JTextField textField = new JTextField(20); panel.add(button); panel.add(textField); frame.add(panel); ActionListener listener = new ClickListener(textField); button.addActionListener(listener); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } local inner class를 사용하지 않는 경우와 비교 자바프로그래밍 강원대학교
local inner class를 사용하지 않는 경우와 비교 public class ClickListener implements ActionListener{ ClickListener(JTextField tf){ textField = tf; } public void actionPerformed(ActionEvent event){ textField.setText("I was clicked."); JTextField textField; local inner class를 사용하지 않는 경우와 비교 자바프로그래밍 강원대학교
public class ButtonViewer{ public static void main(String[] args){ JFrame frame = new JFrame(); JPanel panel = new JPanel(); JButton button = new JButton("Click me!"); final JTextField textField = new JTextField(20); panel.add(button); panel.add(textField); frame.add(panel); ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event){ textField.setText("I was clicked."); } }; button.addActionListener(listener); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); 이렇게 하는 것도 가능! Anonymous inner class ActionListener 인터페이스를 구현하는 클래스를 선언하면서 동시에 객체 구성 클래스 이름 없음 자바프로그래밍 강원대학교
Anonymous inner class ActionListener 인터페이스를 구현하는 클래스라는 선언 ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event){ textField.setText("I was clicked."); } }; 자바프로그래밍 강원대학교
Anonymous inner class MouseAdaptor 클래스를 확장하여 구현하는 클래스라는 선언 (서브클래스) ActionListener listener = new MouseAdaptor() { public void mouseClicked(MouseEvent event){ textField.setText("I was clicked."); } }; 자바프로그래밍 강원대학교
예 3 버튼을 클릭할 때마다 이자가 더해지고 잔액이 화면에 표시됨 자바프로그래밍 강원대학교
리스너 구현 class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) { double interest = account.getBalance() * INTEREST_RATE / 100; account.deposit(interest); label.setText("balance=" + account.getBalance()); } } 자바프로그래밍 강원대학교
File InvestmentViewer1.java 01: import java.awt.event.ActionEvent; 02: import java.awt.event.ActionListener; 03: import javax.swing.JButton; 04: import javax.swing.JFrame; 05: import javax.swing.JLabel; 06: import javax.swing.JPanel; 07: import javax.swing.JTextField; 08: 09: /** 10: This program displays the growth of an investment. 11: */ 12: public class InvestmentViewer1 13: { 14: public static void main(String[] args) 15: { 16: JFrame frame = new JFrame(); 17: 자바프로그래밍 강원대학교
File InvestmentViewer1.java 18: // The button to trigger the calculation 19: JButton button = new JButton("Add Interest"); 20: 21: // The application adds interest to this bank account 22: final BankAccount account = new BankAccount(INITIAL_BALANCE); 23: 24: // The label for displaying the results 25: final JLabel label = new JLabel( 26: "balance=" + account.getBalance()); 27: 28: // The panel that holds the user interface components 29: JPanel panel = new JPanel(); 30: panel.add(button); 31: panel.add(label); 32: frame.add(panel); 33: 자바프로그래밍 강원대학교
File InvestmentViewer1.java 34: class AddInterestListener implements ActionListener 35: { 36: public void actionPerformed(ActionEvent event) 37: { 38: double interest = account.getBalance() 39: * INTEREST_RATE / 100; 40: account.deposit(interest); 41: label.setText( 42: "balance=" + account.getBalance()); 43: } 44: } // inner class 이므로 account, label 사용 가능! 45: 46: ActionListener listener = new AddInterestListener(); 47: button.addActionListener(listener); 48: 49: frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 50: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 51: frame.setVisible(true); 52: } 자바프로그래밍 강원대학교
File InvestmentViewer1.java 53: 54: private static final double INTEREST_RATE = 10; 55: private static final double INITIAL_BALANCE = 1000; 56: 57: private static final int FRAME_WIDTH = 400; 58: private static final int FRAME_HEIGHT = 100; 59: } 자바프로그래밍 강원대학교
AddInterestListener 객체 actionPerformed() 메소드 등록 callback AddInterestListener 객체 actionPerformed() 메소드 재계산 및 디스플레이 자바프로그래밍 강원대학교
예 4 JTextField 자바프로그래밍 강원대학교
Processing Text Input class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) { double rate = Double.parseDouble(rateField.getText()); . . . } } 자바프로그래밍 강원대학교
File InvestmentViewer2.java 01: import java.awt.event.ActionEvent; 02: import java.awt.event.ActionListener; 03: import javax.swing.JButton; 04: import javax.swing.JFrame; 05: import javax.swing.JLabel; 06: import javax.swing.JPanel; 07: import javax.swing.JTextField; 08: 09: /** 10: This program displays the growth of an investment. 11: */ 12: public class InvestmentViewer2 13: { 14: public static void main(String[] args) 15: { 16: JFrame frame = new JFrame(); 17: 자바프로그래밍 강원대학교
File InvestmentViewer2.java 18: // The label and text field for entering the //interest rate 19: JLabel rateLabel = new JLabel("Interest Rate: "); 20: 21: final int FIELD_WIDTH = 10; 22: final JTextField rateField = new JTextField(FIELD_WIDTH); 23: rateField.setText("" + DEFAULT_RATE); 24: 25: // The button to trigger the calculation 26: JButton button = new JButton("Add Interest"); 27: 28: // The application adds interest to this bank account 29: final BankAccount account = new BankAccount(INITIAL_BALANCE); 30: 31: // The label for displaying the results 32: final JLabel resultLabel = new JLabel( 33: "balance=" + account.getBalance()); 34: 자바프로그래밍 강원대학교
File InvestmentViewer2.java 35: // The panel that holds the user interface components 36: JPanel panel = new JPanel(); 37: panel.add(rateLabel); 38: panel.add(rateField); 39: panel.add(button); 40: panel.add(resultLabel); 41: frame.add(panel); 42: 43: class AddInterestListener implements ActionListener 44: { 45: public void actionPerformed(ActionEvent event) 46: { 47: double rate = Double.parseDouble( 48: rateField.getText()); 49: double interest = account.getBalance() 50: * rate / 100; 51: account.deposit(interest); 자바프로그래밍 강원대학교
File InvestmentViewer2.java 52: resultLabel.setText( 53: "balance=" + account.getBalance()); 54: } 55: } 56: 57: ActionListener listener = new AddInterestListener(); 58: button.addActionListener(listener); 59: 60: frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 61: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 62: frame.setVisible(true); 63: } 64: 65: private static final double DEFAULT_RATE = 10; 66: private static final double INITIAL_BALANCE = 1000; 67: 68: private static final int FRAME_WIDTH = 500; 69: private static final int FRAME_HEIGHT = 200; 70: } 자바프로그래밍 강원대학교
타이머 이벤트 처리 자바프로그래밍 강원대학교
Processing Timer Events javax.swing.Timer는 일정 시간 간격으로 액션이벤트를 발생시킨다. 객체 상태를 일정 시간 간격으로 갱신하고자 할 때 사용 타이머에게 액션이벤트 리스너를 등록해 놓으면 액션이벤트가 발생될 때마다 액션이벤트 리스너의 actionPerformed 메소드가 호출됨 - callback! class MyListener implements ActionListener { void actionPerformed(ActionEvent event) { // 타이머에서 액션이벤트가 발생할 때마다 // 이곳에 적어주는 액션이 실행됨 } } 자바프로그래밍 강원대학교
Processing Timer Events 액션 리스너를 타이머에 등록함 MyListener listener = new MyListener(); Timer t = new Timer(interval, listener); t.start(); // 타이머 쓰레드 시작 등록 MyListener actionPerformed Timer 주기적으로 이벤트 발생 actionPerformed 메소드 실행 (callback) 자바프로그래밍 강원대학교
Example: Countdown Example: a timer that counts down to zero 자바프로그래밍 강원대학교
File TimeTester.java 01: import java.awt.event.ActionEvent; 02: import java.awt.event.ActionListener; 03: import javax.swing.JOptionPane; 04: import javax.swing.Timer; 05: 06: /** 07: This program tests the Timer class. 08: */ 09: public class TimerTester 10: { 11: public static void main(String[] args) 12: { 13: class CountDown implements ActionListener 14: { 15: public CountDown(int initialCount) 16: { 17: count = initialCount; 18: } 자바프로그래밍 강원대학교
File TimeTester.java 19: 20: public void actionPerformed(ActionEvent event) 21: { 22: if (count >= 0) 23: System.out.println(count); 24: if (count == 0) 25: System.out.println("Liftoff!"); 26: count--; 27: } 28: 29: private int count; 30: } 31: 32: CountDown listener = new CountDown(10); 33: 34: final int DELAY = 1000; // Milliseconds between // timer ticks 자바프로그래밍 강원대학교
File TimeTester.java 35: Timer t = new Timer(DELAY, listener); 36: t.start(); 37: 38: JOptionPane.showMessageDialog(null, "Quit?"); 39: System.exit(0); 40: } 41: } 자바프로그래밍 강원대학교
애니메이션 프로그램 기본 형식 class Mover implements ActionListener { public void actionPerformed(ActionEvent event) { // Move the rectangle } } ActionListener listener = new Mover(); final int DELAY = 100; // Milliseconds between timer ticks Timer t = new Timer(DELAY, listener); t.start(); 자바프로그래밍 강원대학교
Accessing Surrounding Variables Inner 클래스의 메소드에서는 바깥 클래스의 변수에 접근할 수 있음 public static void main(String[] args) { . . . final Rectangle box = new Rectangle(5, 10, 20, 30); class Mover implements ActionListener { public void actionPerformed(ActionEvent event) { // Move the rectangle box.translate(1, 1); } } . . . } 자바프로그래밍 강원대학교
File TimeTester2.java 01: import java.awt.Rectangle; 02: import java.awt.event.ActionEvent; 03: import java.awt.event.ActionListener; 04: import javax.swing.JOptionPane; 05: import javax.swing.Timer; 06: 07: /** 08: This program uses a timer to move a rectangle once per second. 09: */ 10: public class TimerTester2 11: { 12: public static void main(String[] args) 13: { 14: final Rectangle box = new Rectangle(5, 10, 20, 30); 15: 16: class Mover implements ActionListener 17: { 자바프로그래밍 강원대학교
File TimeTester2.java 18: public void actionPerformed(ActionEvent event) 19: { 20: box.translate(1, 1); 21: System.out.println(box); 22: } 23: } 24: 25: ActionListener listener = new Mover(); 26: 27: final int DELAY = 100; // Milliseconds between timer ticks 28: Timer t = new Timer(DELAY, listener); 29: t.start(); 30: 31: JOptionPane.showMessageDialog(null, "Quit?"); 32: System.out.println("Last box position: " + box); 33: System.exit(0); 34: } 35: } 자바프로그래밍 강원대학교
File TimeTester2.java Output: java.awt.Rectangle[x=6,y=11,width=20,height=30] java.awt.Rectangle[x=7,y=12,width=20,height=30] java.awt.Rectangle[x=8,y=13,width=20,height=30] . . . java.awt.Rectangle[x=28,y=33,width=20,height=30] java.awt.Rectangle[x=29,y=34,width=20,height=30] Last box position: java.awt.Rectangle[x=29,y=34,width=20,height=30] 자바프로그래밍 강원대학교
배치관리 Layout Management 자바프로그래밍 강원대학교
배치 관리 Layout Management 컨테이너는 배치관리자(layout manager)를 갖는다. 배치관리자 border layout flow layout grid layout 자바프로그래밍 강원대학교
Layout Management JPanel은 기본으로 FlowLayout manager를 갖는다. JPanel이 다른 종류의 layout manager를 사용하도록 할 수도 있다. JPanel panel1 = new Jpanel(); panel.setLayout(new BorderLayout()); 자바프로그래밍 강원대학교
Border Layout 자바프로그래밍 강원대학교
Border Layout Frame (실제로는 frame의 content pane)의 기본 배치관리자는 BorderLayout 컴포넌트를 넣는 법 전체 컨테이너 면적을 꽉 채우도록 각 컴포넌트의 크기를 늘여 조절함 JPanel panel1 = new Jpanel(); panel.setLayout(new BorderLayout()); panel.add(component, BorderLayout.NORTH); 자바프로그래밍 강원대학교
Grid Layout 전체 영역을 격자형으로 구획하고 차례로 컴포넌트를 삽입 컴포넌트들이 같은 크기를 갖도록 크기 조정 JPanel numberPanel = new JPanel(); numberPanel.setLayout(new GridLayout(4, 3)); numberPanel.add(button7); numberPanel.add(button8); numberPanel.add(button9); numberPanel.add(button4); . . . 자바프로그래밍 강원대학교
Swing Package 자바프로그래밍 강원대학교
Graphical User Interface (GUI) components Abstract Window Toolkit (AWT) – "heavyweight" components java.awt.Button java.awt.Checkbox java.awt.Dialog Swing - "lightweight" components javax.swing.JButton javax.swing.JCheckBox javax.swing.JDialog 자바프로그래밍 강원대학교
Swing Components http://download.oracle.com/javase/tutorial/ui/features/components.html 자바프로그래밍 강원대학교
Swing examples http://java.sun.com/docs/books/tutorial/uiswing/examples/components/index.html#ButtonDemo 자바프로그래밍 강원대학교
Choices Radio buttons Check boxes Combo boxes 자바프로그래밍 강원대학교
Radio Buttons Font sizes are mutually exclusive: JRadioButton smallButton = new JRadioButton("Small"); JRadioButton mediumButton = new JRadioButton("Medium"); JRadioButton largeButton = new JRadioButton("Large"); // Add radio buttons into a ButtonGroup so that // only one button in group is on at any time ButtonGroup group = new ButtonGroup(); group.add(smallButton); group.add(mediumButton); group.add(largeButton); 자바프로그래밍 강원대학교
Radio Buttons Button group은 버튼들을 가까이 모아 놓지는 않음, 프로그래머가 알아서 버튼을 배치해야 함 isSelected: 버튼이 선택됐는지 알아보기 위해 호출 setSelected(true) 프레임을 화면이 보이기 전에 (setVisible(true)) 라디오버튼 하나에게 호출 (largeButton.isSelected()) size = LARGE_SIZE; 자바프로그래밍 강원대학교
Borders (경계선) 어느 컴포넌트에건 경계선을 넣을 수 있으나 주로 panel에 사용됨 Jpanel panel = new JPanel (); panel.setBorder(new EtchedBorder ()); Panel.setBorder(new TitledBorder(new EtchedBorder(), “Size”)); 자바프로그래밍 강원대학교
Borders (경계선) 자바프로그래밍 강원대학교
Check Boxes JCheckBox italicCheckBox = new JCheckBox("Italic"); 자바프로그래밍 강원대학교
Combo Boxes 선택지가 많을 때는 Combo Box를 사용 라디오 버튼에 비해 공간을 적게 차지하므로 "Combo": combination of a list and a text field The text field displays the name of the current selection 자바프로그래밍 강원대학교
Combo Boxes If combo box is editable, user can type own selection Use setEditable method Add strings with addItem method: JComboBox facenameCombo = new JComboBox(); facenameCombo.addItem("Serif"); facenameCombo.addItem("SansSerif"); . . . 자바프로그래밍 강원대학교
Combo Boxes Get user selection with getSelectedItem (return type is Object) Select an item with setSelectedItem String selectedString = (String) facenameCombo.getSelectedItem(); 자바프로그래밍 강원대학교
Radio Buttons, Check Boxes, and Combo Boxes 이 컴포넌트들은 아이템이 선택될 때ActionEvent를 발생시킴 자바프로그래밍 강원대학교
An example: ChoiceFrame 자바프로그래밍 강원대학교
Classes of the Font Choice Program 자바프로그래밍 강원대학교
File ChoiceFrameViewer.java 01: import javax.swing.JFrame; 02: 03: /** 04: This program tests the ChoiceFrame. 05: */ 06: public class ChoiceFrameViewer 07: { 08: public static void main(String[] args) 09: { 10: JFrame frame = new ChoiceFrame(); 11: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 12: frame.setVisible(true); 13: } 14: } 15: 자바프로그래밍 강원대학교
File ChoiceFrame.java 001: import java.awt.BorderLayout; 002: import java.awt.Font; 003: import java.awt.GridLayout; 004: import java.awt.event.ActionEvent; 005: import java.awt.event.ActionListener; 006: import javax.swing.ButtonGroup; 007: import javax.swing.JButton; 008: import javax.swing.JCheckBox; 009: import javax.swing.JComboBox; 010: import javax.swing.JFrame; 011: import javax.swing.JLabel; 012: import javax.swing.JPanel; 013: import javax.swing.JRadioButton; 014: import javax.swing.border.EtchedBorder; 015: import javax.swing.border.TitledBorder; 016: 자바프로그래밍 강원대학교
File ChoiceFrame.java 017: /** 018: This frame contains a text field and a control panel 019: to change the font of the text. 020: */ 021: public class ChoiceFrame extends JFrame 022: { 023: /** 024: Constructs the frame. 025: */ 026: public ChoiceFrame() 027: { 028: // Construct text sample 029: sampleField = new JLabel("Big Java"); 030: add(sampleField, BorderLayout.CENTER); 031: 자바프로그래밍 강원대학교
File ChoiceFrame.java 032: // This listener is shared among all components 033: class ChoiceListener implements ActionListener 034: { 035: public void actionPerformed(ActionEvent event) 036: { 037: setSampleFont(); 038: } 039: } 040: 041: listener = new ChoiceListener(); 042: 043: createControlPanel(); 044: setSampleFont(); 045: setSize(FRAME_WIDTH, FRAME_HEIGHT); 046: } 047: 자바프로그래밍 강원대학교
File ChoiceFrame.java 048: /** 048: /** 049: Creates the control panel to change the font. 050: */ 051: public void createControlPanel() 052: { 053: JPanel facenamePanel = createComboBox(); 054: JPanel styleGroupPanel = createCheckBoxes(); 055: JPanel sizeGroupPanel = createRadioButtons(); 056: 057: // Line up component panels 058: 059: JPanel controlPanel = new JPanel(); 060: controlPanel.setLayout(new GridLayout(3, 1)); 061: controlPanel.add(facenamePanel); 062: controlPanel.add(styleGroupPanel); 063: controlPanel.add(sizeGroupPanel); 064: 자바프로그래밍 강원대학교
File ChoiceFrame.java 065: // Add panels to content pane 066: 067: add(controlPanel, BorderLayout.SOUTH); 068: } 069: 070: /** 071: Creates the combo box with the font style choices. 072: @return the panel containing the combo box 073: */ 074: public JPanel createComboBox() 075: { 076: facenameCombo = new JComboBox(); 077: facenameCombo.addItem("Serif"); 078: facenameCombo.addItem("SansSerif"); 079: facenameCombo.addItem("Monospaced"); 080: facenameCombo.setEditable(true); 081: facenameCombo.addActionListener(listener); 082: 자바프로그래밍 강원대학교
File ChoiceFrame.java 083: JPanel panel = new JPanel(); 084: panel.add(facenameCombo); 085: return panel; 086: } 087: 088: /** 089: Creates the check boxes for selecting bold and // italic styles. 090: @return the panel containing the check boxes 091: */ 092: public JPanel createCheckBoxes() 093: { 094: italicCheckBox = new JCheckBox("Italic"); 095: italicCheckBox.addActionListener(listener); 096: 097: boldCheckBox = new JCheckBox("Bold"); 098: boldCheckBox.addActionListener(listener); 099: 자바프로그래밍 강원대학교
File ChoiceFrame.java 100: JPanel panel = new JPanel(); 101: panel.add(italicCheckBox); 102: panel.add(boldCheckBox); 103: panel.setBorder 104: (new TitledBorder(new EtchedBorder(), "Style")); 105: 106: return panel; 107: } 108: 109: /** 110: Creates the radio buttons to select the font size 111: @return the panel containing the radio buttons 112: */ 113: public JPanel createRadioButtons() 114: { 115: smallButton = new JRadioButton("Small"); 116: smallButton.addActionListener(listener); 자바프로그래밍 강원대학교
File ChoiceFrame.java 117: 118: mediumButton = new JRadioButton("Medium"); 119: mediumButton.addActionListener(listener); 120: 121: largeButton = new JRadioButton("Large"); 122: largeButton.addActionListener(listener); 123: largeButton.setSelected(true); 124: 125: // Add radio buttons to button group 126: 127: ButtonGroup group = new ButtonGroup(); 128: group.add(smallButton); 129: group.add(mediumButton); 130: group.add(largeButton); 131: 자바프로그래밍 강원대학교
File ChoiceFrame.java 132: JPanel panel = new JPanel(); 133: panel.add(smallButton); 134: panel.add(mediumButton); 135: panel.add(largeButton); 136: panel.setBorder 137: (new TitledBorder(new EtchedBorder(), "Size")); 138: 139: return panel; 140: } 141: 142: /** 143: Gets user choice for font name, style, and size 144: and sets the font of the text sample. 145: */ 146: public void setSampleFont() 147: { 자바프로그래밍 강원대학교
File ChoiceFrame.java 148: // Get font name 149: String facename 150: = (String) facenameCombo.getSelectedItem(); 151: 152: // Get font style 153: 154: int style = 0; 155: if (italicCheckBox.isSelected()) 156: style = style + Font.ITALIC; 157: if (boldCheckBox.isSelected()) 158: style = style + Font.BOLD; 159: 160: // Get font size 161: 162: int size = 0; 163: 자바프로그래밍 강원대학교
File ChoiceFrame.java 164: final int SMALL_SIZE = 24; 165: final int MEDIUM_SIZE = 36; 166: final int LARGE_SIZE = 48; 167: 168: if (smallButton.isSelected()) 169: size = SMALL_SIZE; 170: else if (mediumButton.isSelected()) 171: size = MEDIUM_SIZE; 172: else if (largeButton.isSelected()) 173: size = LARGE_SIZE; 174: 175: // Set font of text field 176: 177: sampleField.setFont(new Font(facename, style, size)); 178: sampleField.repaint(); 179: } 자바프로그래밍 강원대학교
File ChoiceFrame.java 180: 181: private JLabel sampleField; 182: private JCheckBox italicCheckBox; 183: private JCheckBox boldCheckBox; 184: private JRadioButton smallButton; 185: private JRadioButton mediumButton; 186: private JRadioButton largeButton; 187: private JComboBox facenameCombo; 188: private ActionListener listener; 189: 190: private static final int FRAME_WIDTH = 300; 191: private static final int FRAME_HEIGHT = 400; 192: } 자바프로그래밍 강원대학교
Advanced Topic: Layout Management 자바프로그래밍 강원대학교
Advanced Topic: Layout Management 자바프로그래밍 강원대학교
Advanced Topic: Layout Management 자바프로그래밍 강원대학교
Menus 프레임은 메뉴바를 가짐 메뉴바는 메뉴를 가짐 메뉴는 서브메뉴와 메뉴아이템을 가짐 자바프로그래밍 강원대학교
Menus 자바프로그래밍 강원대학교
Menu Items 메뉴에 서브메뉴와 메뉴아이템을 넣기 위해서는 메뉴의 add 메소드를 사용함 메뉴아이템은 서브메뉴를 갖지 않음 메뉴아이템은 액션 이벤트를 발생시킴 JMenuItem fileExitItem = new JMenuItem("Exit"); fileMenu.add(fileExitItem); 자바프로그래밍 강원대학교
Menu Items 메뉴아이템에는 액션리스너를 등록함 메뉴나 메뉴바에는 액션리스너를 등록하지 않음 fileExitItem.addActionListener(listener); 자바프로그래밍 강원대학교
예 간단하고 일반적인 메뉴를 구축 각 메뉴아이템으로부터의 이벤트를 처리 각 메뉴 혹은 메뉴 그룹을 만들기 위해 별도의 메소드를 사용 – 읽기 쉽게 createFaceItem: creates menu item to change the font face createSizeItem createStyleItem 자바프로그래밍 강원대학교
File MenuFrameViewer.java 01: import javax.swing.JFrame; 02: 03: /** 04: This program tests the MenuFrame. 05: */ 06: public class MenuFrameViewer 07: { 08: public static void main(String[] args) 09: { 10: JFrame frame = new MenuFrame(); 11: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 12: frame.setVisible(true); 13: } 14: } 15: 자바프로그래밍 강원대학교
File MenuFrame.java 001: import java.awt.BorderLayout; 002: import java.awt.Font; 003: import java.awt.GridLayout; 004: import java.awt.event.ActionEvent; 005: import java.awt.event.ActionListener; 006: import javax.swing.ButtonGroup; 007: import javax.swing.JButton; 008: import javax.swing.JCheckBox; 009: import javax.swing.JComboBox; 010: import javax.swing.JFrame; 011: import javax.swing.JLabel; 012: import javax.swing.JMenu; 013: import javax.swing.JMenuBar; 014: import javax.swing.JMenuItem; 015: import javax.swing.JPanel; 016: import javax.swing.JRadioButton; 자바프로그래밍 강원대학교
File MenuFrame.java 017: import javax.swing.border.EtchedBorder; 018: import javax.swing.border.TitledBorder; 019: 020: /** 021: This frame has a menu with commands to change the font 022: of a text sample. 023: */ 024: public class MenuFrame extends JFrame 025: { 026: /** 027: Constructs the frame. 028: */ 029: public MenuFrame() 030: { 031: // Construct text sample 032: sampleField = new JLabel("Big Java"); 033: add(sampleField, BorderLayout.CENTER); 034: 자바프로그래밍 강원대학교
File MenuFrame.java 035: // Construct menu 036: JMenuBar menuBar = new JMenuBar(); 037: setJMenuBar(menuBar); 038: menuBar.add(createFileMenu()); 039: menuBar.add(createFontMenu()); 040: 041: facename = "Serif"; 042: fontsize = 24; 043: fontstyle = Font.PLAIN; 044: 045: setSampleFont(); 046: setSize(FRAME_WIDTH, FRAME_HEIGHT); 047: } 048: 049: /** 050: Creates the File menu. 051: @return the menu 052: */ 자바프로그래밍 강원대학교
File MenuFrame.java 053: public JMenu createFileMenu() 054: { 054: { 055: JMenu menu = new JMenu("File"); 056: menu.add(createFileExitItem()); 057: return menu; 058: } 059: 060: /** 061: Creates the File->Exit menu item and sets its // action listener. 062: @return the menu item 063: */ 064: public JMenuItem createFileExitItem() 065: { 066: JMenuItem item = new JMenuItem("Exit"); 067: class MenuItemListener implements ActionListener 068: { 069: public void actionPerformed(ActionEvent event) 자바프로그래밍 강원대학교
File MenuFrame.java 070: { 071: System.exit(0); 072: } 073: } 070: { 071: System.exit(0); 072: } 073: } 074: ActionListener listener = new MenuItemListener(); 075: item.addActionListener(listener); 076: return item; 077: } 078: 079: /** 080: Creates the Font submenu. 081: @return the menu 082: */ 083: public JMenu createFontMenu() 084: { 085: JMenu menu = new JMenu("Font"); 086: menu.add(createFaceMenu()); 자바프로그래밍 강원대학교
File MenuFrame.java 087: menu.add(createSizeMenu()); 088: menu.add(createStyleMenu()); 089: return menu; 090: } 091: 092: /** 093: Creates the Face submenu. 094: @return the menu 095: */ 096: public JMenu createFaceMenu() 097: { 098: JMenu menu = new JMenu("Face"); 099: menu.add(createFaceItem("Serif")); 100: menu.add(createFaceItem("SansSerif")); 101: menu.add(createFaceItem("Monospaced")); 102: return menu; 103: } 104: 자바프로그래밍 강원대학교
File MenuFrame.java 105: /** 106: Creates the Size submenu. 105: /** 106: Creates the Size submenu. 107: @return the menu 108: */ 109: public JMenu createSizeMenu() 110: { 111: JMenu menu = new JMenu("Size"); 112: menu.add(createSizeItem("Smaller", -1)); 113: menu.add(createSizeItem("Larger", 1)); 114: return menu; 115: } 116: 117: /** 118: Creates the Style submenu. 119: @return the menu 120: */ 121: public JMenu createStyleMenu() 122: { 자바프로그래밍 강원대학교
File MenuFrame.java 123: JMenu menu = new JMenu("Style"); 124: menu.add(createStyleItem("Plain", Font.PLAIN)); 125: menu.add(createStyleItem("Bold", Font.BOLD)); 126: menu.add(createStyleItem("Italic", Font.ITALIC)); 127: menu.add(createStyleItem("Bold Italic", Font.BOLD 128: + Font.ITALIC)); 129: return menu; 130: } 131: 132: 133: /** 134: Creates a menu item to change the font face and // set its action listener. 135: @param name the name of the font face 136: @return the menu item 137: */ 138: public JMenuItem createFaceItem(final String name) 139: { 자바프로그래밍 강원대학교
File MenuFrame.java 140: JMenuItem item = new JMenuItem(name); 141: class MenuItemListener implements ActionListener 142: { 143: public void actionPerformed(ActionEvent event) 144: { 145: facename = name; 146: setSampleFont(); 147: } 148: } 149: ActionListener listener = new MenuItemListener(); 150: item.addActionListener(listener); 151: return item; 152: } 153: 자바프로그래밍 강원대학교
File MenuFrame.java 154: /** 154: /** 155: Creates a menu item to change the font size 156: and set its action listener. 157: @param name the name of the menu item 158: @param ds the amount by which to change the size 159: @return the menu item 160: */ 161: public JMenuItem createSizeItem(String name, final int ds) 162: { 163: JMenuItem item = new JMenuItem(name); 164: class MenuItemListener implements ActionListener 165: { 166: public void actionPerformed(ActionEvent event) 167: { 168: fontsize = fontsize + ds; 169: setSampleFont(); 170: } 171: } 자바프로그래밍 강원대학교
File MenuFrame.java 172: ActionListener listener = new MenuItemListener(); 173: item.addActionListener(listener); 174: return item; 175: } 176: 177: /** 178: Creates a menu item to change the font style 179: and set its action listener. 180: @param name the name of the menu item 181: @param style the new font style 182: @return the menu item 183: */ 184: public JMenuItem createStyleItem(String name, final int style) 185: { 186: JMenuItem item = new JMenuItem(name); 187: class MenuItemListener implements ActionListener 188: { 자바프로그래밍 강원대학교
File MenuFrame.java 189: public void actionPerformed(ActionEvent event) 190: { 191: fontstyle = style; 192: setSampleFont(); 193: } 194: } 195: ActionListener listener = new MenuItemListener(); 196: item.addActionListener(listener); 197: return item; 198: } 199: 200: /** 201: Sets the font of the text sample. 202: */ 203: public void setSampleFont() 204: { 자바프로그래밍 강원대학교
File MenuFrame.java 205: Font f = new Font(facename, fontstyle, fontsize); 206: sampleField.setFont(f); 207: sampleField.repaint(); 208: } 209: 210: private JLabel sampleField; 211: private String facename; 212: private int fontstyle; 213: private int fontsize; 214: 215: private static final int FRAME_WIDTH = 300; 216: private static final int FRAME_HEIGHT = 400; 217: } 218: 219: 자바프로그래밍 강원대학교
Text Areas 문자열을 여러 줄 보이고 싶을 때는 JTextArea 사용 행과 열 수를 지정 setText: 화면에 나타날 문자열를 지정 append: 기존 문자열에 추가 final int ROWS = 10; final int COLUMNS = 30; JTextArea textArea = new JTextArea(ROWS, COLUMNS); 자바프로그래밍 강원대학교
Text Areas 줄바꿈을 위해서는 newline 문자 사용 사용자가 편집을 하지 못하게 하려면 textArea.append(account.getBalance() + "\n"); textArea.setEditable(false); // program can call setText and append to change it 자바프로그래밍 강원대학교
Text Areas To add scroll bars to a text area: JTextArea textArea = new JTextArea(ROWS, COLUMNS); JScrollPane scrollPane = new JScrollPane(textArea); 자바프로그래밍 강원대학교
Text Areas 자바프로그래밍 강원대학교
File TextAreaViewer.java 01: import java.awt.BorderLayout; 02: import java.awt.event.ActionEvent; 03: import java.awt.event.ActionListener; 04: import javax.swing.JButton; 05: import javax.swing.JFrame; 06: import javax.swing.JLabel; 07: import javax.swing.JPanel; 08: import javax.swing.JScrollPane; 09: import javax.swing.JTextArea; 10: import javax.swing.JTextField; 11: 12: /** 13: This program shows a frame with a text area that 14: displays the growth of an investment. 15: */ 16: public class TextAreaViewer 17: { 자바프로그래밍 강원대학교
File TextAreaViewer.java 18: public static void main(String[] args) 19: { 20: JFrame frame = new JFrame(); 21: 22: // The application adds interest to this bank account 23: final BankAccount account = new BankAccount(INITIAL_BALANCE); 24: // The text area for displaying the results 25: final int AREA_ROWS = 10; 26: final int AREA_COLUMNS = 30; 27: 28: final JTextArea textArea = new JTextArea( 29: AREA_ROWS, AREA_COLUMNS); 30: textArea.setEditable(false); 31: JScrollPane scrollPane = new JScrollPane(textArea); 32: 33: // The label and text field for entering the // interest rate 자바프로그래밍 강원대학교
File TextAreaViewer.java 34: JLabel rateLabel = new JLabel("Interest Rate: "); 35: 36: final int FIELD_WIDTH = 10; 37: final JTextField rateField = new JTextField(FIELD_WIDTH); 38: rateField.setText("" + DEFAULT_RATE); 39: 40: // The button to trigger the calculation 41: JButton calculateButton = new JButton("Add Interest"); 42: 43: // The panel that holds the input components 44: JPanel northPanel = new JPanel(); 45: northPanel.add(rateLabel); 46: northPanel.add(rateField); 47: northPanel.add(calculateButton); 48: 49: frame.add(northPanel, BorderLayout.NORTH); 50: frame.add(scrollPane); 51: 자바프로그래밍 강원대학교
File TextAreaViewer.java 52: class CalculateListener implements ActionListener 53: { 54: public void actionPerformed(ActionEvent event) 55: { 56: double rate = Double.parseDouble( 57: rateField.getText()); 58: double interest = account.getBalance() 59: * rate / 100; 60: account.deposit(interest); 61: textArea.append(account.getBalance() + "\n"); 62: } 63: } 64: 65: ActionListener listener = new CalculateListener(); 66: calculateButton.addActionListener(listener); 67: 자바프로그래밍 강원대학교
File TextAreaViewer.java 68: frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 69: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 70: frame.setVisible(true); 71: } 72: 73: private static final double DEFAULT_RATE = 10; 74: private static final double INITIAL_BALANCE = 1000; 75: 76: private static final int FRAME_WIDTH = 400; 77: private static final int FRAME_HEIGHT = 200; 78: } 자바프로그래밍 강원대학교
Swing Documentation을 찾아보는 법 매우 방대한 문서임 자바프로그래밍 강원대학교
Example: A Color Mixer RGB 색깔을 배합하여 임의의 색깔을 보임 자바프로그래밍 강원대학교
Example: A Color Mixer slider라는 컴포넌트가 있다는 사실을 어떻게 아는가? Swing component 책을 사서 본다. JDK에 들어 있는 sample application을 돌려본다. J로 시작하는 모든 클래스를 살펴본다. JSlider 자바프로그래밍 강원대학교
Example: A Color Mixer 다음에 알아야 할 것들 JSlider는 어떻게 구성하는가? 사용자가 슬라이더를 움직였을 때 그 사실을 어떻게 알 수 있나? 사용자가 슬라이더를 어느 값에 세트했는지 어떻게 알 수 있나? 기타 슬라이더에 눈금은 어떻게 만드나? 등등 자바프로그래밍 강원대학교
Example: A Color Mixer JSlider class에는 50개의 고유 메소드와 250개의 상속한 메소드가 있음 어떤 메소드는 그 설명이 엄청 어려워 무슨 말인지 이해할 수 없음 기본적인 핵심만 이해하고 이용하면 됨 지나치게 복잡하고 지엽적인 내용에 함몰되지 않는 것이 좋음 자바프로그래밍 강원대학교
JSlider는 어떻게 구성하나? API documentation을 찾아봄 여섯개의 구성자 그 중 한두 개 정도 읽어봄 가장 간단한 것과 가장 복잡한 것의 중간 쯤 되는 것이 통상 효용이 높음 자바프로그래밍 강원대학교
JSlider는 어떻게 구성하나? 지나치게 제한적 Range 0 to 100, initial value of 50 지나치게 복잡 실용적 public JSlider() public JSlider(BoundedRangeModel brm) public JSlider(int min, int max, int value) 자바프로그래밍 강원대학교
사용자가 슬라이더를 움직였을 때 그 사실을 어떻게 알 수 있나? addActionListener 메소드가 없음 아래 메소드가 있음 ChangeListener를 클릭하여 자세히 알아봄 하나의 메소드만을 가짐 public void addChangeListener(ChangeListener l) void stateChanged(ChangeEvent e) 자바프로그래밍 강원대학교
사용자가 슬라이더를 움직였을 때 그 사실을 어떻게 알 수 있나? 사용자가 슬라이더를 움질이면 이 메소드가 호출될 것임 ChangeEvent는 무엇인가? 슈퍼클래스인 EventObject로부터 getSource 메소드를 상속함 getSource: 어떤 컴포넌트에서 이벤트가 만들어졌는지 알려줌 자바프로그래밍 강원대학교
사용자가 슬라이더를 움직였을 때 그 사실을 어떻게 알 수 있나? 아래와 같이 하면 될 것이라는 것을 알게 됨 슬라이더에 change event listener를 등록함 슬라이더가 변경될 때마다 stateChanged 메소드가 호출됨 새로 설정된 슬라이더 값을 읽음 색깔 값을 계산함 칼라 패널을 repaint 자바프로그래밍 강원대학교
사용자가 슬라이더를 어느 값에 세트했는지 어떻게 알 수 있나? JSlider 클래스에서 get으로 시작하는 메소드를 살펴보면 아래 메소드를 찾을 수 있음 public int getValue() 자바프로그래밍 강원대학교
The Components of the SliderFrame 자바프로그래밍 강원대학교
File SliderFrameViewer.java 01: import javax.swing.JFrame; 02: 03: public class SliderFrameViewer 04: { 05: public static void main(String[] args) 06: { 07: SliderFrame frame = new SliderFrame(); 08: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 09: frame.setVisible(true); 10: } 11: } 12: 자바프로그래밍 강원대학교
File SliderFrame.java 01: import java.awt.BorderLayout; 02: import java.awt.Color; 03: import java.awt.GridLayout; 04: import javax.swing.JFrame; 05: import javax.swing.JLabel; 06: import javax.swing.JPanel; 07: import javax.swing.JSlider; 08: import javax.swing.event.ChangeListener; 09: import javax.swing.event.ChangeEvent; 10: 11: public class SliderFrame extends JFrame 12: { 13: public SliderFrame() 14: { 15: colorPanel = new JPanel(); 16: 자바프로그래밍 강원대학교
File SliderFrame.java 17: add(colorPanel, BorderLayout.CENTER); 18: createControlPanel(); 19: setSampleColor(); 20: setSize(FRAME_WIDTH, FRAME_HEIGHT); 21: } 22: 23: public void createControlPanel() 24: { 25: class ColorListener implements ChangeListener 26: { 27: public void stateChanged(ChangeEvent event) 28: { 29: setSampleColor(); 30: } 31: } 32: 자바프로그래밍 강원대학교
File SliderFrame.java 33: ChangeListener listener = new ColorListener(); 34: 35: redSlider = new JSlider(0, 100, 100); 36: redSlider.addChangeListener(listener); 37: 38: greenSlider = new JSlider(0, 100, 70); 39: greenSlider.addChangeListener(listener); 40: 41: blueSlider = new JSlider(0, 100, 70); 42: blueSlider.addChangeListener(listener); 43: 44: JPanel controlPanel = new JPanel(); 45: controlPanel.setLayout(new GridLayout(3, 2)); 46: 47: controlPanel.add(new JLabel("Red")); 48: controlPanel.add(redSlider); 49: 자바프로그래밍 강원대학교
File SliderFrame.java 50: controlPanel.add(new JLabel("Green")); 51: controlPanel.add(greenSlider); 52: 53: controlPanel.add(new JLabel("Blue")); 54: controlPanel.add(blueSlider); 55: 56: add(controlPanel, BorderLayout.SOUTH); 57: } 58: 59: /** 60: Reads the slider values and sets the panel to 61: the selected color. 62: */ 63: public void setSampleColor() 64: { 65: // Read slider values 66: 자바프로그래밍 강원대학교
File SliderFrame.java 67: float red = 0.01F * redSlider.getValue(); 68: float green = 0.01F * greenSlider.getValue(); 69: float blue = 0.01F * blueSlider.getValue(); 70: 71: // Set panel background to selected color 72: 73: colorPanel.setBackground(new Color(red, green, blue)); 74: colorPanel.repaint(); 75: } 76: 77: private JPanel colorPanel; 78: private JSlider redSlider; 79: private JSlider greenSlider; 80: private JSlider blueSlider; 81: 82: private static final int FRAME_WIDTH = 300; 83: private static final int FRAME_HEIGHT = 400; 84: } 자바프로그래밍 강원대학교
Nested Classes 자바프로그래밍 강원대학교
Nested Classes class OuterClass { ... class NestedClass { } A nested class is a member of its enclosing class 자바프로그래밍 강원대학교
Why Use Nested Classes? It is a way of logically grouping classes that are only used in one place. It increases encapsulation. Nested classes can lead to more readable and maintainable code. 자바프로그래밍 강원대학교
Static nested classes, Non-static nested classes class OuterClass { ... static class StaticNestedClass { } class InnerClass { Non-static nested classes are called inner classes 자바프로그래밍 강원대학교
Static nested classes, Non-static nested classes Non-static nested classes (inner classes) have access to other members of the enclosing class, even if they are declared private Static nested classes do not have access to other members of the enclosing class 자바프로그래밍 강원대학교
Static Nested Classes A static nested class is behaviorally a top-level class that has been nested in another. OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); 자바프로그래밍 강원대학교
Static Nested Classes Cannot refer directly to instance variables or methods defined in its enclosing class — can use them only through an object reference. 자바프로그래밍 강원대학교
무엇이 잘못인가? public class Problem { private String s; static class Inner { void testMethod() { s = "Set from Inner"; } refering directly to the instance variable defined in its enclosing class 자바프로그래밍 강원대학교
public class Problem { private String s; static class Inner { void testMethod() { Problem p = new Problem(); p.s = "Set from Inner"; } refering to the instance variable defined in its enclosing class through an object reference 자바프로그래밍 강원대학교
Inner Classes Inner class is associated with an instance of its enclosing class and has direct access to that object's methods and fields class OuterClass { ... class InnerClass { } Instance of InnerClass Instance of OuterClass Objects that are instances of an inner class exist within an instance of the outer class 자바프로그래밍 강원대학교
Inner Classes To instantiate an inner class first instantiate the outer class create the inner object within the outer object OuterClass outerObject = new OuterClass(); OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 자바프로그래밍 강원대학교
public class Class1 { protected InnerClass1 ic; public Class1() { ic = new InnerClass1(); } public void displayStrings() { System.out.println(ic.getString() + "."); static public void main(String[] args) { Class1 c1 = new Class1(); c1.displayStrings(); protected class InnerClass1 { public String getString() { return "InnerClass1: getString invoked"; 자바프로그래밍 강원대학교
Inner Classes Two special kinds of inner classes Local inner classes Anonymous inner classes 이름 없이 메소드 내부에 선언된 inner class 자바프로그래밍 강원대학교