java swing - uosmmlab.uos.ac.kr/oopjava/archive/javaswing.pdf · 2017-06-02 · •windows...
TRANSCRIPT
Copyright, 2014 © MMLab, Dept. of ECE, UOS
Java Swing
2014년 3월
최성종서울시립대학교전자전기컴퓨터공학부[email protected]://www.mmlab.net
차례
2014 3년 월 Java Swing 2
2017-06-02 Seong Jong Choi Java Basic Concepts-3
Graphical Components
• 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
Class Hierarchies
• 점선:
– Abstract Class
• Container:
– Can contain other GUI
components
• Frame
– Window 테두리, 실제 창은
“Content Pane”으로 정의
2014 3년 월 Java Swing 6
Container Class
• Container Class의특징
– 다른컴포넌트를포함할수있다.
– 다른컨테이너에포함될수있다.
– 화면에출력이가능하다.
– Event를발생할수있다.
– Event Listener를등록할수있다.
• 모든 Swing 클라스는 Container를상속하기때문에,
위의특징을가진다.
2014 3년 월 Java Swing 7
Swing Class Hierarchies: JComponent
2014 3년 월 Java Swing 8
Notes
• 실제 화면에 표출되는 모양은 Software Object의
Representation이다.
– Model <-> View
• 모든 Swing class는 J로 시작한다.
– 예, Jframe, JButton
2014 3년 월 Java Swing 9
•2017-06-02 •Seong Jong Choi •Java Basic Concepts-10
JFrame
• Frame
– Window 테두리, 실제 창은
“Pane”으로 정의
• 프레임은컨테이터
클라스이다.
– 다른컴포넌트를포함할수
있다
•2014 3년 월 •Java Swing •11
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
Creating a JFame Object: Direct Instantiation
2014 3년 월 Java Swing 13
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
Creating a JFrame Object: JFrame으로부터 상속 2/2
2014 3년 월 Java Swing 15
•2017-06-02 •Seong Jong Choi •Java Basic Concepts-16
JButton:
2014 3년 월 Java Swing 17
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
Layout Manager
• 컨테이너에컴포넌트를 add()할때위치와크기를
정한다.
• FlowLayout
setLayout( new FlowLayout() ); // set the layout manager
2014 3년 월 Java Swing 19
Event 처리
1. Event Listener 정의
2. 정의된 Listener 등록
• Click -> Event Objet -> Event Listener
2014 3년 월 Java Swing 20
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
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
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
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
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
The Diagram
2014 3년 월 Java Swing 26
View
Controller
Refer toRefer to
2017-06-02 Seong Jong Choi Java Basic Concepts-27
2014 3년 월 Java Swing 28
두개의버튼
• 하나의 Event listener가두버튼의 click event를처리
2014 3년 월 Java Swing 29
두개의버튼이하나의 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
2017-06-02 Seong Jong Choi Java Basic Concepts-31
JTextField
• 텍스트한줄을넣을수있다.
• Keyboard focus
– //15자의필드생성
– JTextField text = new JTextField( 15 );
2014 3년 월 Java Swing 32
JTextField의 Event Listener
• 텍스트를치고 enter를치면 ActionEvent가발생한다.
(JButton과동일)
• JTextField의텍스트를받으려면->String getText()
• JTextField에텍스트를넣으려면 ->setText(String x)
2014 3년 월 Java Swing 33
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
2017-06-02 Seong Jong Choi Java Basic Concepts-35
setRisizable()
• JFrame의method
– setResizable (true) : Default,
– setResizable(false): 윈도우의크기를조절할수없다.
2014 3년 월 Java Swing 36
JPanel
• Container: groups GUI components
• 직사각형으로표현
• 테두리는없다
• 패널에패널을넣을수있다.
• 각패널마다 Layout Manager를가진다
– Default: flow layout
• 프레임은각패널을하나의 component로처리한다.
2014 3년 월 Java Swing 37
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
2017-06-02 Seong Jong Choi Java Basic Concepts-39
JRadioButton
• 여러개중하나만선택:
– 라디오방송국중하나만선택
• ButtonGroup이여러 JRadioButton을포함
– ButtonGroup의여러라디오버튼중하나만선택
• 생성순서
1. JRadioButton object 생성
2. ButtonGroup object 생성
3. 라디오버튼을버튼그룹에삽입
2014 3년 월 Java Swing 40
라디오버튼생성의예
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
BorderLayout
• Layout Manager
• JFrame의 default layout manager
• 다섯개의 container (직사각형)으로구성됨
• 각 container는하나의 component만가질수있다.
– 주로 JPanel임
2014 3년 월 Java Swing 42
2017-06-02 Seong Jong Choi Java Basic Concepts-43
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
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
여러 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