240 likes | 463 Vues
THE JFC SWING A Guide to Constructing GUIs (Introduction). Data Warehousing Lab. Cho Hye-Young. Book & Reference http://java.sun.com/docs/books/tutorial/uiswing/index.html The JFC Swing Tutorial A Guide to Constructing GUIs by Kathy Walrath & Mary Campione. INDEX.
E N D
THE JFC SWINGA Guide to Constructing GUIs(Introduction) Data Warehousing Lab. Cho Hye-Young
Book & Reference • http://java.sun.com/docs/books/tutorial/uiswing/index.html • The JFC Swing Tutorial A Guide to Constructing GUIs by Kathy Walrath & Mary Campione INDEX • Getting Started with Swing • Swing Features and Concepts • Using Swing Components
Getting Started with Swing • 1. JFC와 스윙에 대해 • 2. 스윙 프로그램의 컴파일과 실행 • 3. 스윙 애플릿의 실행 • 4. 스윙 애플리케이션의 코드 맛보기
Java Look & Feel CDE/Motif Look & Feel Windows Look & Feel 1. JFC 와 스윙에 대해 • JFC와 스윙이란? • JFC(Java Foundation Classes) • GUI를 구축하는 일련의 기능 요소들을 묶은 것 • JFC 기능 요소 • 스윙 컴포넌트들 • 버튼, 스플리트 창, 테이블 등 • 교체 가능한 외양(pluggable look & feel) 지원 • 외양 즉, GUI의 겉모습과 작동 방식을 선택/교체할 수 있도록 하는 기능 • 접근 지원 API(Accessiblity API) • 화면의 내용을 음성으로 읽어주거나 점자로 출력하는 등의 장애자용 인터페이스에 관련된 기능 • Java 2D API(JDK 1.2 이상) • 고품질의 2D그래픽, 텍스트, 이미지를 애플리케이션이나 애플릿에서 쉽게 사용하는데 관련된 기능 • 드래그-드롭 지원(JDK 1.2 이상) • 자바 애플리케이션과 운영체제 고유의 애플리케이션 사이에서 끌어다 놓기를 지원하는데 관련된 기능 • Swing • 새로운 컴포넌트들과 관련 API를 지칭 • javax.swing
Top-Level Containers • General-Purpose Containers Applet Dialog Frame Panel Scroll pane Split pane Tabbed pane Tool bar • Special-Purpose Containers • Uneditable Information Displays Label Progress bar Tool tip Internal frame Layered pane Root pane • Editable Displays of Formatted Information • Basic Controls Buttons Combo box List Color chooser File chooser Menu Slider Text fields Table Text Tree 스윙 컴포넌트들
1. JFC 와 스윙에 대해 • 스윙 API가 포함된 릴리즈는? • Java 2 SDK, Standard Edition, (J2SE) v 1.4. • JFC 1.1(use JDK 1.1)
1. JFC 와 스윙에 대해 • 어떤 스윙 패키지를 써야 하는지? • JFC 1.1 release (public packages): javax.accessibilityjavax.swingjavax.swing.borderjavax.swing.colorchooserjavax.swing.eventjavax.swing.filechooserjavax.swing.plafjavax.swing.plaf.basicjavax.swing.plaf.metaljavax.swing.plaf.multijavax.swing.tablejavax.swing.textjavax.swing.text.html javax.swing.treejavax.swing.undo • javax.swing • javax.swing.event(not always required)
1. JFC 와 스윙에 대해 • 스윙 컴포넌트들과 AWT 컴포넌트들의 차이점? • 스윙 컴포넌트들은 특정 플랫폼에 의존적인 코드가 전혀 포함되지 않고 구현되었다
1. JFC 와 스윙에 대해 • 스윙 컴포넌트들과 AWT 컴포넌트들의 차이점? • 스윙 컴포넌트들은 AWT 컴포넌트들보다 뛰어난 기능을 제공한다 • 버튼/레이블에 텍스트 뿐만 아니라 이미지도 표시가능 • 대부분의 스윙 컴포넌트들은 테두리의 추가 변경 용이 • 모양이나 행동 변경 용이(메서드 호출, 서브클래스 사용) • 직사각형 이외의 모양도 가능(ex.둥근 버튼) • 보조적 기술들의 스윙 컴포넌트 정보 획득 용이(ex.버틀/레이블의 텍스트) • 스윙 컴포넌트 사용시 주의점 • 스윙 컴포넌트들과 함께 “중량(heavyweight)”컴포넌트들을 사용하면 안된다. • 스윙 컴포넌트들은 “스레드(thread)”에 안전하지 않다. • 스윙 컴포넌트들을 포함하는 윈도우나 애플릿을 위한 포함관계 계통구조(containment hierarchy)의 루트에 스윙의 최상위 컨테이너가 있어야 한다. • JFrame 같은 최상위 컨테이너에 직접 컴포넌트를 추가하지 않는다.
SwingApplication.java 2. 스윙 프로그램의 컴파일과 실행 • 스윙 프로그램의 컴파일과 실행(Java2 Platform) • Step • Java 2 platform 의 최신 release 설치 • 스윙 컴포넌트 들을 사용하는 프로그램 작성 • 프로그램 컴파일 javac -deprecation SwingApplication.java • 프로그램 실행 • Standard Look & Feel java SwingApplication • nonstandard look and feel Solaris: java -classpath .:/home/me/lnfdir/newlnf.jar SwingApplication Win32: java -classpath .;C:\java\lnfdir\newlnf.jar SwingApplication
3. 스윙 애플릿의 실행 • Step • 브라우저에 적합한 자바 플러그인 또는 applet viewer 다운로드 (JDK 1.1 applet viewer사용의 경우 스윙 JAR파일로드) • 브라우저로 html파일을 연다 • HelloSwingApplet.html • 소스코드 : HelloSwingApplet.java • Html 파일에 applet 끼워 넣는 코드 <APPLET CODE = "HelloSwingApplet.class" CODEBASE = "example-swing" ARCHIVE = "applets.jar" WIDTH = 400 HEIGHT = 50 > <PARAM NAME = CODE VALUE = "HelloSwingApplet.class" > <PARAM NAME = CODEBASE VALUE = "example-swing" > <PARAM NAME = ARCHIVE VALUE = "applets.jar" > <PARAM NAME="type" VALUE="application/x-java-applet;version=1.1.2"> </APPLET>
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SwingApplication { private static String labelPrefix = "Number of button clicks: "; private int numClicks = 0; public Component createComponents() { final JLabel label = new JLabel(labelPrefix + "0 "); JButton button = new JButton("I'm a Swing button!"); button.setMnemonic(KeyEvent.VK_I); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } }); label.setLabelFor(button); JPanel pane = new JPanel(); pane.setBorder(BorderFactory.createEmptyBorder( 30, 30, 10, 30) ); pane.setLayout(new GridLayout(0, 1)); pane.add(button); pane.add(label); return pane; } 스윙팩키지도입 public static void main(String[] args) { try { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { } //Create the top-level container and add contents to it. JFrame frame = new JFrame("SwingApplication"); SwingApplication app = new SwingApplication(); Component contents = app.createComponents(); frame.getContentPane().add(contents, BorderLayout.CENTER); //Finish setting up the frame, and show it. frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } } 레이블 설정 외양선택 버튼설정 최상위컨테이너 설정하고 보여주기 컴포넌트추가 이벤트처리 4. 스윙 애플리케이션의 코드 맛보기 • SwingApplication.java
JButton button = new JButton("I'm a Swing button!"); label = new JLabel(labelPrefix + "0 "); label.setText(labelPrefix + numClicks); JFrame frame = new JFrame("SwingApplication"); 4. 스윙 애플리케이션의 코드 맛보기 • SwingApplication.java • 외양의 선택 • UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel“ ); • setLookAndFeel arguments • UIManager.getCrossPlatformLookAndFeelClassName() • UIManager.getSystemLookAndFeelClassName() • "javax.swing.plaf.metal.MetalLookAndFeel“ • "com.sun.java.swing.plaf.windows.WindowsLookAndFeel“ • "com.sun.java.swing.plaf.motif.MotifLookAndFeel“ • "javax.swing.plaf.mac.MacLookAndFeel" • 스레드 관련 문제 • 보조적 기술들의 지원 • label.setLabelFor(button);
Swing Features and Concepts • 5. 컴포넌트와 컨테이너의 계통적 구조 • 6. 레이아웃 관리 • 7. 이벤트 처리 • 8. 페인팅 • 9. 스레드와 스윙 • 10. 그 외의 스윙 기능들과 개념들 • 11. 스윙 기반 프로그램의 분석
[containment hierarchy] 5. 컴포넌트와 컨테이너의 계통적 구조 • SwingApplication.java • 스윙컴포넌트 • 프레임 또는 메인 윈도우(Jframe) • 패널(Jpane) • 버튼(Jbutton) • 레이블(Jlabel)
6. 레이아웃 관리 • 레이아웃 관리 • 컴포넌트들의 크기와 위치를 결정하는 과정 • 레이아웃 관리자 • 컨테이너에 담긴 컴포넌트들에 대해 레이아웃 관리를 수행하는 객체 • 레이아웃 관리자 설정 • JPanel pane = new JPanel(); pane.setLayout(new BorderLayout()); • 절대위치방식: 레이아웃 속성을 null 로 지정 • 컴포넌트에 대한 정보제공 • 크기: setMinimumSize, setPreferredSize, setMaximumSize getMinimumSize, getPreferredSize, getMaximumSize • 정렬: setAlignmentX , setAlignmentY getAlignmentX , getAlignmentY
1. BorderLayout 2. BoxLayout 3. CardLayout 4. FlowLayout 5. GridLayout 6. GridBagLayout 6. 레이아웃 관리 • 다양한 레이아웃 관리자
6. 레이아웃 관리 • 레이아웃 관리가 일어나는 방식 • GUI가 만들어지고 나면, JFrame에서 pack메서드가 호출된다. • 프레임의 레이아웃 관리자가 프레임의 적정 크기를 찾기 위해 프레임의 경계 크기에 프레임이 직접 담고 있는 컴포넌트의 적정 크기를 더한다. • 내용창의 레이아웃 관리자가 내용창의 적정 크기를 구한다. • 레이아웃 관리자가 크기를 물으면, 각 버튼은 우선 사용자가 적정 크기를 지정했는지 점검한다. • 크기 결정 순서 • 포함관계 계통구조의 하위 컴포넌트 -> 상위 컨테이너
event object ----> event listener event listener source ----> event listener ----> event listener 7. 이벤트 처리 • 이벤트 • 이벤트에 대한 정보를 제공하고 이벤트 출처에 통지를 하나의 객체 • 이벤트의 요소 • 인터페이스 구현 • 이벤트 출처(객체)에 이벤트 리스너 등록 • 이벤트 출처와 이벤트 리스너
ActionEvent button -----------------------> action listener 7. 이벤트 처리 • 이벤트 처리부 구현 • 이벤트 처리부 (event handler) 클래스의 요소 • 리스너 인터페이스 구현(Implement) 또는 다른 클래스 확장(expands)할 것인지 지정 코드 public class MyClass implements ActionListener { • 인스턴스 등록 코드 someComponent.addActionListener(instanceOfMyClass); • 리스너 인터페이스의 메서드들을 구현하는 코드 public void actionPerformed(ActionEvent e) { ...//code that reacts to the action... } • 스레드와 이벤트처리 • 이벤트 처리 코드는 하나의 스레드 즉, event dispatching thread 안에서 실행된다.
8. 페인팅 • 페인팅의 작동방식 • AWT 페인팅 시스템 • 스윙 GUI가 자신을 다시 그릴 필요가 생기는 경우 과정조절 • 스윙 리페인트 관리자 • 컴포넌트를 명시적으로 다시 그려지게 한다. • 컴포넌트의 크기나 위치가 자동 재조정되지 않는 경우 repaint 이전에 revalidate호출해야 한다. • 더블 버퍼링 • 화면을 부드럽게 갱신하기위해, 메모리 상의 버퍼에서 페인팅 작업후, 모두 그려지면 화면에 뿌리는 방식 • 페인팅순서(SwingApplicaiton.java) • 최상위 컨테이너 -> 하위 컴포넌트 ex.SwingApplication.java Jframe-> 내용창->Jpanel->Jbutton,JLabel
9. 스레드와 스윙 • 단일 스레드 규칙 • 스윙 컴포넌트들은 한 시점에서 단 하나의 스레드, event dispatching로부터만 접근 되어야한다. • 한 스윙 컴포넌트가 실현된 후에는 그 컴포넌트의 상태에 영향을 주거나 상태에 의존하는 모든 코드는 반드시 이벤트 발송 스레드 안에서 실행되어야한다. • 단일 스레드 규칙의 예외 • 일부메서드들은 스레드에 안전하다 This method is thread safe, although most Swing methods are not. Please see Threads and Swing for more information. • 애플리케이션의 GUI는 메인 스레드에서 생성, 표시되기도한다. • 애플릿의 GUI는 init메서드 안에서 생성 표시될 수 있다. • Jcomponent의 메서드들 중 repair와 revalidate는 어떤 스레드에서 호출해도 안전하다. • 리스너 목록들은 어떤 스레드에서도 수정할 수 있다. addListenerTypeListener, removeListenerTpyeListener • 이벤트 발송 스레드가 아닌 형태로 GUI 작업수행의 경우 • 실제 작업 이전에 시간이 오래 걸리는 초기화 작업을 수행하는 프로그램 • 비표준적인 이벤트의 결과로 갱신되는 GUI를 사용하는 프로그램
10. 그외의 스윙 기능들과 개념들 • Jcomponet가 제공하는 기능들 • J로 시작하는 컴포넌트는 최상위 컨테이너를 제외하고 모두 JComponent 클래스로부터 상속 • 아이콘 • 버튼, 레이블에 이미지 표시 • 액션 • 액션 이벤트를 발생시킨 둘 또는 그이상의 컴포넌트들 사이에 데이터 공유 • 교체가능한 외양 • 여러가지 Look & Feel 을 사용자가 선택하거나, 프로그램 안에서 지정 • 보조적 기술의 지원 • Accessbility API를 이용 - 스윙 컴포넌트 정보 획득 • 데이터와 상태 모델의 분리 • 컴포넌트들을 좀더 효율적으로 다루고 컴포넌트 사이에서 데이터와 상태를 쉽게 공유하게 함. (ex.ButtonModel)
11. 스윙 기반 프로그램의 분석 • Converter.java • 미터법 단위와 U.S 단위(인치, 피트, 야드 등)사이에서 길이를 변환하는 프로그램 • 컴포넌트들 • Jframe 한 개 • 커스텀 Jpane 2개 • 커스텀 JTextField 2개 • JSlider 2개 • JComboBox 2개 • 레이아웃 관리자 • Gridlayout 1개 • Boxlayout 4개 • 분리된 모델 • 텍스트 필드 위한 데이터 모델 1개 • 슬라이더의 데이터 모델 2개 • 이벤트처리 • 액션리스너 • 변경리스너 • 윈도우리스너