Copyright, 2014 MMLab, Dept. of ECE, UOS Java Swing 2014 년 3 월 최성종서울시립대학교전자전기컴퓨터공학부 chois@uos.ac.kr http://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 JFrame setdefaultcloseoperation( 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()...... 1 // listener method for the ActionListener interface public void actionperformed( ActionEvent evt)...... 2014년 3월 Java Swing 21
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 ); repaint(); // ask the system to paint the screen. // Change the Frame's background 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 2 3 1 2014년 3월 Java Swing 25
The Diagram Refer to Refer to Controller View 2014년 3월 Java Swing 26
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 TwoButtons public 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을알아야한다. Example setlayout( 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 method Public 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