제 9주 이벤트 처리 그래픽프로그래밍1 제 9주 강의 목표

Slides:



Advertisements
Similar presentations
제 8 장 그래픽 사용자 인터페이스 어서와 Java 는 처음이지 !. 그래픽 사용자 인터페이스 (Graphical User Interface, 간단히 GUI) 는 컴포넌트들로 구성된다.
Advertisements

자바 5.0 프로그래밍.
어서와 Java는 처음이지! 제12장 스윙 컴포넌트.
- 계산기 GUI 구성하기 - 조원: 박강국 오정은 이귀식 김도윤 안영진.
Chapter 7 ARP and RARP.
10. 이벤트 처리와 그래픽프로그래밍 자바프로그래밍 강원대학교.
제 12일 그래픽사용자인터페이스 (Graphic User Interface)
그래픽 프로그래밍 (GUI - Graphic User Interface)
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
9장. 스윙 프로그래밍.
10장. 이벤트 처리와 그래픽 프로그래밍.
IT Application Development Dept. Financial Team May 24, 2005
GUI 이벤트, 이벤트 리스너와 이벤트 소스 그림 그리기 내부 클래스
제7장 이벤트 프로그래밍.
객체지향 프로그래밍.
축산 인식개선을 위한 농협의 추진 사례 ( ) 농협중앙회 축산지원단장 박인희.
7장 배열 ③.
레이아웃 관리자 스윙 구성요소 비트박스 프로그램
컴퓨터 프로그래밍 실습 #7 제 4 장 GUI 클래스 작성.
J2ME(Java 2 Micro Edition) 무선 장치용 UI의 핵심 컴포넌트
명품 JAVA Programming.
Chap14 스윙(SWING) 14.1 스윙 컴포넌트 14.2 컴포넌트의 이벤트 처리
제6장 제어(Control) 6.1 구조적 프로그래밍(Structured Programming)
제 4 장 클래스 작성 Lab 4- 2.
DB와 WEB 연동(1) [2-Tier] Java Applet 이용
9장 AWT(1).
Internet Computing KUT Youn-Hee Han
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
Java RMI (Remote Method Invocation)
Power Java 제4장 자바 프로그래밍 기초.
10장 객체-지향 프로그래밍 II ©창병모.
Choi Younghwan CSE HUFS
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
Chapter 12. Awt와 Swing Chapter 13. 배치 관리자 Chapter 14. 이벤트 관리자
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
Swing 컴포넌트 텍스트 컴포넌트 텍스트 필드 텍스트 영역 스크롤 페인 체크 박스 라디오 버튼.
Power Java 제15장 예외 처리 (Exception Handling).
목 차 1. swing component 특징 및 관련 packages
Java Seminar Chapter 4.
10장 예외 Lab 10-2.
MIDP UI API.
5장 조건과 반복 ③.
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
메모장 구동.
9장 AWT(1).
GUI 프로그래밍과 AWT 컴퓨터 공학실험(I) 인공지능 연구실.
명품 JAVA Programming 제 15 장 애플릿과 멀티미디어.
윤 홍 란 4 장 클래스 작성 윤 홍 란
인터페이스(Interfaces) 강원대학교.
Visual Basic 기초 1 목표: 컴퓨터기반제어에 관련된 학습을 하기 전에 Visual Basic의 기초를 살펴본다.
제 4주 – 클래스 설계 제 4주 목표 클래스를 구현하는 법을 배운다. 변수 선언 메소드 구현 구성자 객체지향프로그래밍
Javafx UI.
2009학년도 1학기 상지대학교 컴퓨터정보공학부 고 광 만
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
Introduction to Programming Language
JAVA WINDOW PROGRAMMING
컴퓨터공학실습(I) 3주 인공지능연구실.
제 4 장 클래스 작성 Lab 4- 2.
Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects)
GUI 프로그래밍과 AWT 컴퓨터 공학실험(I) 인공지능 연구실.
Java RMI (Remote Method Invocation)
9장 개요 다형 참조 상속을 통한 다형성 인터페이스를 통한 다형성 정렬 탐색 이벤트 처리 재조명 파일 선택자 및 색상 선택자
창 병 모 숙명여대 전산학과 자바 언어를 위한 CFA 창 병 모 숙명여대 전산학과
Chapter 4 클래스 작성.
Java의 정석 제 7 장 객체지향개념 II-3 Java 정석 남궁성 강의
5장 조건과 반복 ③.
Presentation transcript:

제 9주 이벤트 처리 그래픽프로그래밍1 제 9주 강의 목표 제 9주 이벤트 처리 그래픽프로그래밍1 제 9주 강의 목표 버튼, 텍스트필드, 마우스를 통한 입력에 대한 처리 프로그램 작성법을 배움 배치관리자를 이해하게 됨 Nested class, 특히 local 클래스를 사용할 수 있게 됨 객체지향프로그래밍 강원대학교

이벤트 처리 객체지향프로그래밍 강원대학교

이벤트 (Events) 이벤트 발생 버튼을 클릭할 때 텍스트필드에 문자를 타이핑할 때 콤보박스에서 아이템을 선택할 때 타이머가 타임아웃될 때, 등등... 버튼, 텍스트필드 등 GUI 콤포넌트들이 이벤트 소스(source)임 객체지향프로그래밍 강원대학교

이벤트 (Events) 프로그래머는 수많은 이벤트 중 관심 있는 이벤트에 대해서만 필요한 반응을 보이도록 프로그램을 작성 특정 GUI 콤포넌트에서 발생하는 특정 이벤트에 대해 어떤 반응을 보이도록 프로그램하려면 적절한 이벤트 리스너(listener)를 만들어 이를 해당 콤포넌트에 등록해 줌 객체지향프로그래밍 강원대학교

이벤트 소스와 이벤트 리스너 Event listener: Event source: 이벤트가 발생될 때 그 사실을 통보받는 객체 프로그래머에 의해 작성되는 클래스 객체 이벤트가 발생되었을 때 해야 할 작업이 이곳에 정의되어 있음 이벤트 리스너가 등록되지 않은 이벤트에 대해서는 아무 반응도 없게 됨 Event source: 어떤 컴포넌트에서 이벤트가 발생되면 그 컴포넌트에 등록된 모든 이벤트 리스너들에게 이벤트 발생 사실이 통보됨 객체지향프로그래밍 강원대학교

이벤트 소스와 이벤트 리스너 이벤트가 여러 리스너에게 전달될 수 있다. 한 리스너가 여러 소스로부터 이벤트를 받을 수 있다. 객체지향프로그래밍 강원대학교

예1: ActionListener 버튼을 클릭하면 action event 발생 (버튼: 이벤트 소스) 이에 대해 반응을 보이게 하려면 ActionListener 객체를 버튼에 등록해 줌 (이 때 ActionListener 객체가 이벤트 리스너임) ActionListener 객체 = ActionListener 인터페이스를 구현한 객체 이벤트 발생에 따라 ActionListener 객체에게 이벤트 발생이 통보되면 actionPerformed 메소드가 실행됨 public interface ActionListener { void actionPerformed(ActionEvent event); } 객체지향프로그래밍 강원대학교

ActionListener 구현 예 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 메소드가 실행됨 객체지향프로그래밍 강원대학교

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); ActionListener listener = new ClickListener(); button.addActionListener(listener); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } 객체지향프로그래밍 강원대학교

Output 객체지향프로그래밍 강원대학교

예 2 객체지향프로그래밍 강원대학교

public class ClickListener implements ActionListener { public void actionPerformed(ActionEvent event) System.out.println("I was clicked."); } public class ClickListener implements ActionListener{ ClickListener(JTextField tf){ textField = tf; } public void actionPerformed(ActionEvent event){ textField.setText("I was clicked."); JTextField textField; 객체지향프로그래밍 강원대학교

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); } 객체지향프로그래밍 강원대학교

Nested Classes 객체지향프로그래밍 강원대학교

Nested Classes A nested class is a member of its enclosing class 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 객체지향프로그래밍 강원대학교

Nested Classes class OuterClass { ... class NestedClass { } A nested class is a member of its enclosing class 객체지향프로그래밍 강원대학교

static nested classes, non-static nested classes non-static nested classes are called inner classes class OuterClass { ... static class StaticNestedClass { } class InnerClass { 객체지향프로그래밍 강원대학교

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 A static nested class cannot refer directly to instance variables or methods defined in its enclosing class — it can use them only through an object reference. A static nested class is behaviorally a top-level class that has been nested in another. OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); 객체지향프로그래밍 강원대학교

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 Problem { String s; static class Inner { void testMethod() { s = "Set from Inner"; } 객체지향프로그래밍 강원대학교

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 객체지향프로그래밍 강원대학교

public class ClickListener implements ActionListener{ public class ButtonViewer{ public static void main(String[] args){ JFrame frame = new JFrame(); JButton button = new JButton("Click me!"); frame.add(button); ActionListener listener = new ClickListener(); button.addActionListener(listener); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public class ClickListener implements ActionListener{ public void actionPerformed(ActionEvent event){ System.out.println("I was clicked."); } 객체지향프로그래밍 강원대학교

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 객체지향프로그래밍 강원대학교

Text Field JTextField final int FIELD_WIDTH = 10; // In characters final JTextField rateField = new JTextField(FIELD_WIDTH); 객체지향프로그래밍 강원대학교

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 객체지향프로그래밍 강원대학교

예 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: } 객체지향프로그래밍 강원대학교

배치관리 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 교과서 14장을 읽으시오. 객체지향프로그래밍 강원대학교

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: } 객체지향프로그래밍 강원대학교