java swing - uosmmlab.uos.ac.kr/oopjava/archive/javaswing.pdf · 2017-06-02 · •windows...

46
Copyright, 2014 © MMLab, Dept. of ECE, UOS Java Swing 20143최성종 서울시립대학교 전자전기컴퓨터공학부 [email protected] http://www.mmlab.net

Upload: others

Post on 17-Jan-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Copyright, 2014 © MMLab, Dept. of ECE, UOS

Java Swing

2014년 3월

최성종서울시립대학교전자전기컴퓨터공학부[email protected]://www.mmlab.net

Page 2: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

차례

2014 3년 월 Java Swing 2

Page 3: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

2017-06-02 Seong Jong Choi Java Basic Concepts-3

Page 4: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Graphical Components

• Windows

• Buttons

• Menus

• Text fields

2014 3년 월 Java Swing 4

Page 5: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Event-driven Programming

• GUI Program: MVC

– Graphical Components (GUI) : View

– Listener methods: Controller

– Application methods: Model

• General Sequence:

1. User interacts with GUI components

2. The component creates an event

3. An event listener will be executed

2014 3년 월 Java Swing 5

Page 6: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Class Hierarchies

• 점선:

– Abstract Class

• Container:

– Can contain other GUI

components

• Frame

– Window 테두리, 실제 창은

“Content Pane”으로 정의

2014 3년 월 Java Swing 6

Page 7: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Container Class

• Container Class의특징

– 다른컴포넌트를포함할수있다.

– 다른컨테이너에포함될수있다.

– 화면에출력이가능하다.

– Event를발생할수있다.

– Event Listener를등록할수있다.

• 모든 Swing 클라스는 Container를상속하기때문에,

위의특징을가진다.

2014 3년 월 Java Swing 7

Page 8: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Swing Class Hierarchies: JComponent

2014 3년 월 Java Swing 8

Page 9: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Notes

• 실제 화면에 표출되는 모양은 Software Object의

Representation이다.

– Model <-> View

• 모든 Swing class는 J로 시작한다.

– 예, Jframe, JButton

2014 3년 월 Java Swing 9

Page 10: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

•2017-06-02 •Seong Jong Choi •Java Basic Concepts-10

Page 11: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

JFrame

• Frame

– Window 테두리, 실제 창은

“Pane”으로 정의

• 프레임은컨테이터

클라스이다.

– 다른컴포넌트를포함할수

있다

•2014 3년 월 •Java Swing •11

Page 12: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

First Program

import java.awt.*; // 1. import the application windowing toolkit

import javax.swing.*; // 2. import the Swing classes. Note the "x" in javax.

public class TestFrame1

{

// usual main() method

public static void main ( String[] args )

{

JFrame frame // 4. a reference to the object

= new JFrame("Test Frame 1"); // 3. construct a JFrame object

frame.setSize(200,100); // 5. set it to 200 pixels wide by 100 high

frame.setVisible( true ); // 6. ask it to become visible on the screen

frame.setDefaultCloseOperation

( JFrame.EXIT_ON_CLOSE ); // 7. say what the close button does

}

}

2014 3년 월 Java Swing 12

Page 13: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Creating a JFame Object: Direct Instantiation

2014 3년 월 Java Swing 13

Page 14: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Creating a JFrame Object: JFrame으로부터 상속 1/2

class MyFrame extends JFrame{

JPanel panel;

JLabel label;

// constructor

MyFrame( String title )

{

super( title ); // invoke the JFrame constructor

setSize( 150, 100 );

setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

setLayout( new FlowLayout() ); // set the layout manager

label = new JLabel("Hello Swing!"); // construct a JLabel

add( label ); // add the label to the JFrame

}

}

public class TestFrame2

{

public static void main ( String[] args )

{

MyFrame frame = new MyFrame("Hello"); // construct a MyFrame object

frame.setVisible( true ); // ask it to become visible

}

}

2014 3년 월 Java Swing 14

Page 15: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Creating a JFrame Object: JFrame으로부터 상속 2/2

2014 3년 월 Java Swing 15

Page 16: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

•2017-06-02 •Seong Jong Choi •Java Basic Concepts-16

Page 17: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

JButton:

2014 3년 월 Java Swing 17

Page 18: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

A Frame with a Button

class ButtonFrame extends JFrame

{

JButton bChange ; // reference to the button object

// constructor for ButtonFrame

ButtonFrame(String title)

{

super( title ); // invoke the JFrame constructor

setLayout( new FlowLayout() ); // set the layout manager

bChange = new JButton("Click Me!"); // construct a JButton

add( bChange ); // add the button to the JFramesetDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

}

}

public class ButtonDemo

{

public static void main ( String[] args )

{

ButtonFrame frm = new ButtonFrame("Button Demo");

frm.setSize( 150, 75 );

frm.setVisible( true );

}

}

2014 3년 월 Java Swing 18

Page 19: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Layout Manager

• 컨테이너에컴포넌트를 add()할때위치와크기를

정한다.

• FlowLayout

setLayout( new FlowLayout() ); // set the layout manager

2014 3년 월 Java Swing 19

Page 20: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Event 처리

1. Event Listener 정의

2. 정의된 Listener 등록

• Click -> Event Objet -> Event Listener

2014 3년 월 Java Swing 20

Page 21: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

1. Event Listener 정의: ActionListener Interface

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

class ButtonFrame2 extends JFrame implements ActionListener{

JButton bChange;

ButtonFrame2()

{

. . . . . .

}

// listener method for the ActionListener interface

public void actionPerformed( ActionEvent evt)

{

. . . . . .

}

}

2014 3년 월 Java Swing 21

1

Page 22: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

2. Event Listener 등록: addActionListener() 메소드

class ButtonFrame2 extends JFrame implements ActionListener

{

JButton bChange ;

// constructor

public ButtonFrame2()

{

bChange = new JButton("Click Me!");

setLayout( new FlowLayout() );

// register the ButtonFrame object as the listener for the JButton.

// 즉, 버튼의 Listener(actionPerformed)는이클라스에구현되어있다.

bChange.addActionListener( this );

add( bChange );

setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

}

// listener method required by the interface

public void actionPerformed( ActionEvent evt)

{

. . . . . .

}

}

2014 3년 월 Java Swing 22

Page 23: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Complete Program 1/2

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

class ButtonFrame2 extends JFrame implements ActionListener

{

JButton bChange ; // reference to the button object

// constructor for ButtonFrame2

ButtonFrame2(String title)

{

super( title ); // invoke the JFrame constructor

setLayout( new FlowLayout() ); // set the layout manager

// construct a Button

bChange = new JButton("Click Me!");

// register the ButtonFrame2 object as the listener for the JButton.

bChange.addActionListener( this );

2014 3년 월 Java Swing 23

Page 24: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Complete Program 2/2

add( bChange ); // add the button to the JFrame

setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

}

public void actionPerformed( ActionEvent evt)

{

getContentPane().setBackground( Color.blue ); // Change the Frame's background

repaint(); // ask the system to paint the screen.

}

}

public class ButtonDemo2

{

public static void main ( String[] args )

{

ButtonFrame2 frm = new ButtonFrame2("Button Demo Two");

frm.setSize( 200, 100 );

frm.setVisible( true );

}

}

2014 3년 월 Java Swing 24

Page 25: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Event Listener의역할: Controller

public void actionPerformed( ActionEvent evt)

{//1. Check user input: look at the information in the ActionEvent

// 2. Interact with model (Property Update): invoke one of several methods depending on the information

// 3. Interact with view (Component Update): send the results of that method to another GUI component

}

2014 3년 월 Java Swing 25

1

32

Page 26: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

The Diagram

2014 3년 월 Java Swing 26

View

Controller

Refer toRefer to

Page 27: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

2017-06-02 Seong Jong Choi Java Basic Concepts-27

Page 28: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

2014 3년 월 Java Swing 28

Page 29: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

두개의버튼

• 하나의 Event listener가두버튼의 click event를처리

2014 3년 월 Java Swing 29

Page 30: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

두개의버튼이하나의 Event Listener에의해처리됨

public class TwoButtons extends JFrame implements ActionListener{ JButton redButton ; JButton grnButton ;

// constructor for TwoButtonspublic TwoButtons(String title) {…redButton = new JButton("Red");grnButton = new JButton("Green");

redButton.setActionCommand( "red" ); // set the command grnButton.setActionCommand( "green" ); // set the command

// register the buttonDemo frame as the listener for both Buttons.redButton.addActionListener( this ); grnButton.addActionListener( this );

…}

public void actionPerformed( ActionEvent evt){// check which command has been sent

if ( evt.getActionCommand().equals( "red" ) ) getContentPane().setBackground( Color.red ); …

repaint();}

2014 3년 월 Java Swing 30

Page 31: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

2017-06-02 Seong Jong Choi Java Basic Concepts-31

Page 32: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

JTextField

• 텍스트한줄을넣을수있다.

• Keyboard focus

– //15자의필드생성

– JTextField text = new JTextField( 15 );

2014 3년 월 Java Swing 32

Page 33: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

JTextField의 Event Listener

• 텍스트를치고 enter를치면 ActionEvent가발생한다.

(JButton과동일)

• JTextField의텍스트를받으려면->String getText()

• JTextField에텍스트를넣으려면 ->setText(String x)

2014 3년 월 Java Swing 33

Page 34: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

Application Code: Model의분리

public void actionPerformed( ActionEvent evt)

{

String name = inText.getText();//Access Data

outText.setText( name );

repaint();

}

// The Separate application code.void copyText()

{

String name = inText.getText();

outText.setText( name );

}

public void actionPerformed( ActionEvent evt)

{

copyText();

repaint();

}

40% GUI code vs 60% Application code

2014 3년 월 Java Swing 34

Page 35: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

2017-06-02 Seong Jong Choi Java Basic Concepts-35

Page 36: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

setRisizable()

• JFrame의method

– setResizable (true) : Default,

– setResizable(false): 윈도우의크기를조절할수없다.

2014 3년 월 Java Swing 36

Page 37: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

JPanel

• Container: groups GUI components

• 직사각형으로표현

• 테두리는없다

• 패널에패널을넣을수있다.

• 각패널마다 Layout Manager를가진다

– Default: flow layout

• 프레임은각패널을하나의 component로처리한다.

2014 3년 월 Java Swing 37

Page 38: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

JFrame을 BoxLayout으로설정하는방법

• BoxLayout(Container contain, int axis)

– contain: the container this layout manager is for

– axis:

BoxLayout.X_AXIS ---- for left to right alignment

BoxLayout.Y_AXIS ---- for top to bottom alignment

• 프레임의 content pane을알아야한다.

• ExamplesetLayout( new BoxLayout( getContentPane(), BoxLayout.Y_AXIS );

add( dataPanel );

add( butPanel );

2014 3년 월 Java Swing 38

Page 39: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

2017-06-02 Seong Jong Choi Java Basic Concepts-39

Page 40: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

JRadioButton

• 여러개중하나만선택:

– 라디오방송국중하나만선택

• ButtonGroup이여러 JRadioButton을포함

– ButtonGroup의여러라디오버튼중하나만선택

• 생성순서

1. JRadioButton object 생성

2. ButtonGroup object 생성

3. 라디오버튼을버튼그룹에삽입

2014 3년 월 Java Swing 40

Page 41: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

라디오버튼생성의예

public class IdealWeight extends JFrame

{…

public IdealWeight()

{

// 1. JRadioButton object 생성

genderM = new JRadioButton("Male", true );

genderF = new JRadioButton("Female", false );

// 2. ButtonGroup object 생성

genderGroup = new ButtonGroup();

// 3. 라디오버튼을버튼그룹에삽입

genderGroup.add( genderM );

genderGroup.add( genderF );

. . . . .

// 4. JPanel에각각의라디오버튼삽입.

genderPanel = new JPanel();

genderPanel.setLayout( new BoxLayout( genderPanel, BoxLayout.Y_AXIS ) );

genderPanel.add( new JLabel("Your Gender") );

genderPanel.add( genderM ); genderPanel.add( genderF )

}

}

2014 3년 월 Java Swing 41

Page 42: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

BorderLayout

• Layout Manager

• JFrame의 default layout manager

• 다섯개의 container (직사각형)으로구성됨

• 각 container는하나의 component만가질수있다.

– 주로 JPanel임

2014 3년 월 Java Swing 42

Page 43: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

2017-06-02 Seong Jong Choi Java Basic Concepts-43

Page 44: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

JSlider

• Adjust a value and observe the effect in real time.

• 움직일때마다 ChangeEvent가발생

• ChangeListener가듣는다.

• 생성자:

JSlider( int orientation, int min, int max, int init )

• Tick Spacing

setMajorTickSpacing(int spacing)

setMinorTickSpacing(int spacing)

• Example

slide = new JSlider( JSlider.VERTICAL, 0, 100, 79 );

slide.setMajorTickSpacing( 10);

slide.setMinorTickSpacing( 5);

slide.setPaintTicks ( true); //

slide.setPaintLabels( true);

slide.setSnapToTicks( true);// value of the slider is an integer multiple of the minor tick spacing

slider.setPreferredSize( new Dimension( 50, 300) ); //Slider의크기

2014 3년 월 Java Swing 44

Page 45: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

ChangeListener Interface:

• Slider의이벤트발생

– Slider를움직이면 change event가발생

– 천천히움직이면정수값을지날때에 event발생

– Change event listener는자주발생하는 event를처리해야한다.

• Event Listener 생성

– ChangeListener Interface은하나의method만정의

– public void stateChanged( ChangeEvent evt )

• Event Listener 등록

– slider.addChangeListener( ChangeListener lstn )

2014 3년 월 Java Swing 45

Page 46: Java Swing - UOSmmlab.uos.ac.kr/OOPJava/Archive/JavaSwing.pdf · 2017-06-02 · •Windows •Buttons •Menus •Text fields 2014년3월 Java Swing 4

여러 Slider에서발생하는 Event를하나의 listener가처리할경우

1. 각 Slider마다이름을정의한다.

Component.setName(String name)

2. Event Listener에서 event를발생한 slider를찾는다.// listener methodPublic void stateChanged( ChangeEvent evt ){Jslider source;source = (Jslider)evt.getSource(); //event가발생한 slider

if ( source.getName().equals("sliderA") ) // Slider의이름을찾는다.textA.setText( source.getValue() + " " ); // Slider의값을읽는다.

…}

2014 3년 월 Java Swing 46