당신은 주제를 찾고 있습니까 “java gui 프로그래밍 – 자바 스윙1: 프레임과 페널 JFrame and JPanel“? 다음 카테고리의 웹사이트 https://you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: https://you.tfvp.org/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Danny TWLC 이(가) 작성한 기사에는 조회수 25,939회 및 좋아요 191개 개의 좋아요가 있습니다.
java gui 프로그래밍 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 자바 스윙1: 프레임과 페널 JFrame and JPanel – java gui 프로그래밍 주제에 대한 세부정보를 참조하세요
자바 GUI 에 제일 기초 JFrame 과 JPanel을 사용하여서 프로그램 기초 툴을 만드는방법을 알려드리고있습니다.
Source Code 는 아래 github link 에서 확인하실수있습니다!
https://github.com/DannyTWLC/Java-Lesson
도움이 되셨다면, 구독▶️ 좋아요👍 부탁드립니다 ^^
java gui 프로그래밍 주제에 대한 자세한 내용은 여기를 참조하세요.
JAVA의 GUI 기초, awt, swing 작성 절차, 컨테이너와 컴포넌트 …
자바의 GUI 프로그래밍 방법. ✓ GUI 컴포넌트 이용. – AWT 패키지와 Swing 패키지. – AWT . java.awt패키지. – Swing .javax.swing 패키지. – JavaFX.
Source: yooniron.tistory.com
Date Published: 7/14/2021
View: 2670
[java]자바/GUI프로그래밍 – 블로그 – 네이버
GUI. . GUI(Graphic User Interface), 그래픽 유저 인터페이스란 우리가 흔히 보는 윈도우 애플리케이션 처럼 윈도우 창을 가지고 있으며 버튼을 …
Source: blog.naver.com
Date Published: 7/5/2022
View: 8446
[JAVA] GUI 프로그래밍 – AWT 컴포넌트, Swing(스윙)컴포넌트
[JAVA] GUI 프로그래밍 – AWT 컴포넌트, Swing(스윙)컴포넌트. BS Kwak 2020. 12. 12. 23:49. 자바의 GUI. – 그래픽 이용, 사용자가 이해하기 쉬운 모양으로 정보제공.Source: bskwak.tistory.com
Date Published: 6/13/2021
View: 7439
자바 GUI 프로그래밍 – 금오공과대학교 | KOCW 공개 강의
금오공과대학교. 김병만. C++와 자바의 차이점 이해 및 이를 통한 자바 심화 학습 자바를 이용한 GUI 프로그래밍 방법 이해 및 이를 통한 자바 언어 사용도를 높이고자 …
Source: www.kocw.net
Date Published: 8/24/2021
View: 6703
[JAVA ] GUI(Graphic User Interface) – L.O.K
JAVA코드를 짜고. 이클립스를 실행하면. 콘솔창이 뜬다. 하지만 우리는. 프로그램을 ‘콘솔’로. 사용하지 않는다. 아이콘을 ‘클릭’하면.
Source: lordofkangs.tistory.com
Date Published: 1/30/2022
View: 3764
자바 GUI 프로그래밍 1.컨테이너와컴포넌트 – velog
GUI응용프로그래밍 : 윈도우나 매킨토시와 같은 운영체제를 GUI(그래픽 사용자 환경)이라 한다.GUI 환경에서 동작하는 프로그램을 만드는 것을 GUI …
Source: velog.io
Date Published: 2/16/2021
View: 7576
자바 GUI 프로그래밍 소개
이 기사는 Java GUI 프로그래밍에 대한 경험이 거의 또는 전혀 없는 개인을 위한 것 … Java GUI 프로그래밍에는 원래 AWT(Abstract Windows Kit)와 최신 Swing 툴킷 …
Source: visualguide.org
Date Published: 12/6/2022
View: 662
제9절 GUI 프로그래밍 소개 – 자바를 이용한 프로그래밍 입문
GUI 프로그래밍 소개. 제1관 도형 그리기; 제2관 프로그램에서 그리기; 제3관 애니메이션. 지난 두 장에 걸쳐 하나의 서브루틴 안에서 행해지는 …
Source: wikidocs.net
Date Published: 8/23/2021
View: 1528
자바 Gui 프로그래밍 개요 | Swing 기본 | Java 프로그래밍
주제를 살펴보자 “java gui 프로그래밍 – 자바 GUI 프로그래밍 개요 | Swing 기본 | Java 프로그래밍” 카테고리에서: Blog 에 의해 컴파일 …
Source: ko.maxfit.vn
Date Published: 1/10/2022
View: 4327
JAVA Programming 1 9 GUI AWT SWING 4 – SlideToDoc.com
명품 JAVA Programming 1 제 9 장 자바 GUI 기초, AWT와 스윙(SWING) … Swing 으로 만든 GUI 프로그램 샘플 8 JButton JLabel JText. Field 프레임 윈도우 닫기 버튼 …
Source: slidetodoc.com
Date Published: 3/19/2022
View: 7236
주제와 관련된 이미지 java gui 프로그래밍
주제와 관련된 더 많은 사진을 참조하십시오 자바 스윙1: 프레임과 페널 JFrame and JPanel. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 java gui 프로그래밍
- Author: Danny TWLC
- Views: 조회수 25,939회
- Likes: 좋아요 191개
- Date Published: 2018. 4. 2.
- Video Url link: https://www.youtube.com/watch?v=w7VQI6wbAQ4
[JAVA] JAVA의 GUI 기초, awt, swing 작성 절차, 컨테이너와 컴포넌트, 배치 관리자
JAVA의 GUI 기초, awt, swing 작성 절차, 컨테이너와 컴포넌트, 배치 관리자
학습 목표
1. JAVA의 GUI
■ 그래픽 사용자 인터페이스
✓ Graphical User Interface, 간단히 GUI
– 사용자가 편리하게 입출력할 수 있도록 그래픽으로 화면을 구성하고, 마우스나 키보드로 입력받을 수 있도록 지원하는 사용자 인터페이스
✓ 자바 언어에서 GUI 프로그램 작성
– 컴포넌트들로 구성
■ 자바 GUI 특징
✓ 강력한 GUI 컴포넌트 제공
✓ 쉬운 GUI 프로그래밍
■ 자바의 GUI 프로그래밍 방법
✓ GUI 컴포넌트 이용
– AWT 패키지와 Swing 패키지
– AWT
. java.awt패키지
– Swing
.javax.swing 패키지
– JavaFX
. JAVA 11에서 제거 (CORBA, Java EE, Java FX, 애플릿, 자바 웹 스타트 기능)
GUI 설명 AWT AWT는 운영 체제가 제공하는 자원을 이용하여서 컴포넌트를 생성 Swing 컴포넌트가 자바로 작성되어 있기 때문에 어떤 플랫폼에서도 일관된 화면 작성 가능
■ Swing 컴포넌트 예시
JButton
JCheckBox
JRadioButton
JTextField
JPassewordField
JTextArea
JComboBox
JList
JProgeressBar
JTooTip
JScrollPane
JMenu
JDialog
JFrame
이 밖에도 JApplet, JTable, JTree, JEditorPane, JTextPane, JToolBar, JSplitPane, JTabbedPane 등 여러 가지의 컴포넌트가 있다.
■ Swing의 특징
✓ 스윙 GUI 컴포넌트
– 형식화된 텍스트 입력이나 패스워드 필드 동작과 같은 복잡한 기능들이 제공
✓ 자바 2D API
– 그림이나 이미지, 애니메이션 기능을 제공
– 교체 가능한 룩앤필(Look-and-Feel) 지원
✓ 데이터 전송
– 자르기, 복사, 붙이기, 드래그 앤 드롭 등의 데이터 전송 기능 제공
대부분의 프로그램은 스윙 API 중에서 아주 작은 부분 집합만을 사용한다. 따라서 대부분의 경우 다음의 두 가지 패키지만 포함하면 된다.
* javax.swing
* javax.swing.event
Swing 패키지 계층구조
■ 컨테이너와 컴포넌트
✓ 컨테이너
– 다른 컴포넌트를 포함할 수 있는 GUI 컴포넌트
– 다른 컨테이너에 포함될 수 있음
. AWT 컨테이너: Panel, Frame, Applet, Dialog, Window
. Swing 컨테이너: JPanel, JFrame, JApplet, JDialog, JWindow
✓ 컴포넌트
– 컨테이너에 포함되어야 비로소 화면에 출력될 수 있는 GUI 객체
– 다른 컴포넌트를 포함할 수 없는 순수 컴포넌트
– 모든 GUI 컴포넌트가 상속받는 클래스: java.awt.Compnent
– 스윙 컴포넌트가 상속받는 클래스: javax.swing.JComponent
■ GUI 작성 절차
1) 컨테이너를 생성한다.
2) 컴포넌트를 추가한다.
GUI 작성 절차를 코드로 보도록 하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package practice; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; public class MyFrame extends JFrame { //생성자 public MyFrame() { setSize( 300 , 200 ); //크기 설정 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle( “프레임 작성예시” ); setLayout( new FlowLayout()); //배치 관리자 설정 JButton button = new JButton( “버튼” ); //컴포넌트 생성 및 추가 this . add (button); setVisible( true ); } public static void main( String [] args) { new MyFrame(); } } Colored by Color Scripter cs
프레임 작성 예시
2. 기초 컨테이너와 컴포넌트
■ JFrame 컨테이너 클래스
✓ Swing 클래스 계층구조
– Component
. 화면에 표시되어서 사용자와 상호 작용하는 시각적인 객체를 나타냄.
– Container
. 내부에 다른 컴포넌트를 추가할 수 있는 기능을 제공
. 이 클래스의 add()를 사용하면 컨테이너 안에 컴포넌트를 추가
– Window
. 경계선, 타이틀 바, 버튼을 가지고 있는 윈도우를 정의
– Frame
. 자바 GUI 애플리케이션의 기초(AWT)
– JFrame
. Frame 클래스를 스윙의 출시에 맞추어 변경
✓ 중요한 메소드
– setLocation(x, y), setBounds(x, y, width, height), setSize(width, height) // 프레임의 위치와 크기를 설정
– setIconImage(IconImage) // 윈도우 시스템에 타이틀 바, 태스크 스위처에 표시할 아이콘을 알려줌
– setTitle() //타이틀 바의 제목 변경
– setResizable(boolean) //사용자가 크기를 조절할 수 있는지를 설정
ContentPane과 JFrame의 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package practice; import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; public class ContentPaneEx extends JFrame { public ContentPaneEx() { setTitle( “ContentPane과 JFrame 예제” ); //프레임 타이틀 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane(); // 컨텐트팬 알아내기 contentPane.setBackground(Color.orange); // 배경색 : oragne contentPane.setLayout( new FlowLayout()); // 컨텐트팬에 FlowLayout 배치관리자 달기 contentPane. add ( new JButton( “OK” )); // OK버튼 contentPane. add ( new JButton( “Cancel” )); // Cancel 버튼 contentPane. add ( new JButton( “Ignore” )); // Ignore 버튼 setSize( 300 , 150 ); // 프레임 크기 300 x 150 setVisible( true ); // 화면에 프레임 출력 } public static void main( String [] args) { new ContentPaneEx(); } } Colored by Color Scripter cs
ContentPane과 JFrame의 예제
18번째 줄의 FlowLayout의 배치 관리자는 컴포넌트를 순서대로 부착하는 일을 맡은 객체이다.
✓ 스윙 응용프로그램의 종료
– System.exit(0); //언제 어디서나 무조건 종료, 응용 프로그램 내에서 스스로 종료
– 프레임의 오른쪽 상단의 종료 버튼(x)이 클릭되면?????
—> 프레임 종료, 프레임 윈도우를 닫음(프레임이 화면에서 보이지 않게 됨)
But 프레임이 보이지 않게 되지만 응용프로그램이 종료한 것 아님
—> 키보드나 마우스 입력을 받지 못함
—> 다시 setVisible(true)를 호출하면, 보이게 되고 이전처럼 작동함
이를 해결하기 위해 프레임 종료 버튼이 클릭될 때, 프레임과 함께 프로그램을 종료시키는 방법이
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 를 사용하는 것이다.
■ 기초 컴포넌트
레이블(label)
버튼(button)
텍스트 필드(TextField)
✓ 레이블(label)
– 편집이 불가능한 텍스트를 표시
ex) JLabel label = new JLabel(“Hello World”);
label
✓ 버튼(Button)
– 편집이 불가능한 텍스트를 표시
ex) JButton btn = new JButton(“클릭”);
Button
버튼의 종류
JButton
JCheckBox
JRadioButton
✓ 텍스트 필드(TextField)
– 입력이 가능한 한 줄의 텍스트 필드
ex) JTextField text = new JTextField(20);
TextField
텍스트 필드의 종류
JTextField // 기본적인 텍스트 필드
JFormattedTextField // 사용자가 입력할 수 있는 문자를 제한
JPasswordField // 사용자가 입력하는 내용이 보이지 않음
JComboBox // 사용자가 직접 입력할 수도 있지만 항목 중에서 선택할 수 있음
Jspinner // 텍스트 필드와 버튼이 조합된 것
3. 배치 관리자
■ 컨테이너와 배치 개념
✓ 컴포넌트는 컨테이너에 부착되지 않으면 화면상 나타날 수 없음
✓ 컨테이너마다 하나의 배치 관리자가 존재하며, 삽입되는 모든 컴포넌트의 위치와 크기를 결정하고 적절히 배치
✓ 컨테이너의 크기가 변하면 내부 컴포넌트들의 위치와 크기를 모두 재 조절하고 재배치해야 함
■ 배치 관리자 대표 유형 3가지
AWT와 스윙의 컨테이너 디폴트 배치관리자 Window BorderLayout Frame, JFrame BorderLayout Dialog, JDialog BorderLayout Panel, JPanel FlowLayout Applet, JApplet FlowLayout
JPanel 패널에 BorderLayout 배치 관리자를 설정하는 예시
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
■ FlowLayout 배치 관리자
✓ 배치관리자를 지정하지 않으면 묵시적으로 FlowLayout으로 지정한다.
✓ 컴포넌트를 수평 방향으로 배치하는 관리자
– 왼쪽에서 오른쪽, 위에서 아래로 순차적으로 배열
– if) 한 줄에 모두 배치하지 못한다면 다음 줄에 연속하여 배열
✓ 생성자
– FlowLayout()
– FlowLayout(int align)
– FlowLayout(int align, int hgap, int vgap)
align: 정렬 방식
ex) LEFT, CENTER, RIGHT
hgap, vgap: 컴포넌트 사이의 수직, 수평 간격을 지정하는 값 –> 픽셀 단위
FlowLayoutEx.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package practice; import java.awt.Container; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; public class FlowLayoutEx extends JFrame { public FlowLayoutEx() { setTitle( “FlowLayout 예제” ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane(); contentPane.setLayout( new FlowLayout(FlowLayout.LEFT, 30 , 40 )); contentPane. add ( new JButton( “버튼 1” )); contentPane. add ( new JButton( “버튼 2” )); contentPane. add ( new JButton( “버튼 3” )); contentPane. add ( new JButton( “버튼 4” )); contentPane. add ( new JButton( “버튼 5” )); contentPane. add ( new JButton( “버튼 6” )); setSize( 300 , 200 ); setVisible( true ); } public static void main( String [] args) { new FlowLayoutEx(); } } Colored by Color Scripter cs
FlowLayout
■ BorderLayout 배치 관리자
✓ 컴포넌트를 추가할 때 방향을 지정하여 추가할 수 있는 기능을 제공
✓ 배치 방향: 동, 서, 남, 북, 중앙
– East(LINE_END), West(LINE_START)
– South(PAGE_END), North(PAGE_START), Center
✓ 배치 방법
– add(Component comp, int index) //comp를 index의 공간에 배치
✓ 생성자
– BorderLayout()
– BorderLayout(int hGap, int vGap)
✓ add() 메소드
– void add(Component comp, int index)
BorderLayoutEx.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package practice; import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; public class BorderLayoutEx extends JFrame { public BorderLayoutEx() { setTitle( “FlowLayout 예제” ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane(); contentPane.setLayout( new BorderLayout( 30 , 20 )); contentPane. add ( new JButton( “버튼 1” ), BorderLayout.CENTER); contentPane. add ( new JButton( “버튼 2” ), BorderLayout.NORTH); contentPane. add ( new JButton( “버튼 3” ), BorderLayout.SOUTH); contentPane. add ( new JButton( “버튼 4” ), BorderLayout.EAST); contentPane. add ( new JButton( “버튼 5” ), BorderLayout.WEST); setSize( 300 , 200 ); setVisible( true ); } public static void main( String [] args) { new BorderLayoutEx(); } } Colored by Color Scripter cs
BorderLayout
■ GridLayout 배치 관리자
✓ 컴포넌트를 행과 열을 가진 배열 형태로 배치
✓ 컨테이너 공간을 동일한 사각형 격자(그리드)로 분할하고 각 셀에 컴포넌트 하나씩 배치
– 생성자에 행수와 열수 지정
– 셀에 왼쪽에서 오른쪽으로, 다시 위에서 아래로 순서대로 배치
✓ 생성자
– GridLayout()
– GridLayout(int row, int cols)
– GridLayout(int rows, int cols, int hgap, int vgap)
rows, cols: 배치할 행과 열(Default: 1)
hgap, vgap: 컴포넌트 사이의 간격, 픽셀 단위
—-> rows x cols 만큼의 셀을 가진 격자로 컨테이너 공간을 분할 배치
GridLayoutEx.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package practice; import java.awt.Container; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; public class GridLayoutEx extends JFrame { public GridLayoutEx() { setTitle( “GridLayout 예제” ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane(); contentPane.setLayout( new GridLayout( 1 , 10 )); for ( int i = 0 ; i < 10 ; i + + ) { String text = Integer. toString (i); JButton btn = new JButton(text); this . add (btn); } setSize( 300 , 200 ); setVisible( true ); } public static void main( String [] args) { new GridLayoutEx(); } } Colored by Color Scripter cs GridLayout ■ 배치 관리자 선택 기준 ✓ 컴포넌트를 가능한 크게 나타내고 싶은 경우 - GridLayout, BorderLayout 사용 ✓ 몇 개의 컴포넌트를 자연스러운 크기로 한줄로 나타내고 싶은 경우 - FlowLayout ✓ 몇개의 컴포넌트를 행과 열로 동일한 크기로 나타내고 싶은 경우 - GridLayout ■ 절대 위치로 배치하기 ✓ 배치 관리자가 없는 컨테이너에 컴포넌트를 삽입할 때 - 프로그램에서 컴포넌트의 절대 크기와 위치 설정 - 컴포넌트들이 서로 겹치게 할 수 있음 ✓ 컴포넌트의 크기와 위치 설정 메소드 - void setSize(int width, int height) // 컴포넌트 크기 설정 - void setLocation(int x, int y) // 컴포넌트 위치 설정 - void setBounds(int x, int y, int width, int height) // 위치와 크기 동시 설정 NullCotainerEx.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package practice; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class NullContainerEx extends JFrame { public NullContainerEx() { setTitle( "배치관리자 없이 절대 배치" ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane(); contentPane.setLayout( null ); JLabel la = new JLabel( "Yoon's Dev!" ); la.setLocation( 130 , 50 ); la.setSize( 200 , 20 ); this . add (la); // 9개의 버튼 컴포넌트 생성하고 동일한 크기로 설정, 위치는 겹치게 for ( int i = 0 ; i < 10 ; i + + ) { JButton btn = new JButton(Integer. toString (i)); btn.setLocation(i * 15 , i * 15 ); btn.setSize( 50 , 20 ); this . add (btn); } setSize( 300 , 200 ); setVisible( true ); } public static void main( String [] args) { new NullContainerEx(); } } Colored by Color Scripter cs NullContainerEx
AWT 컴포넌트, Swing(스윙)컴포넌트
자바의 GUI
– 그래픽 이용, 사용자가 이해하기 쉬운 모양으로 정보제공
– 마우스나 키보드를 이용하여 입력
GUI 프로그래밍
– GUI 컴포넌트와 그래픽 이용
AWT – java.awt 패키지
Swing – javax.swing 패키지
AWT Swing 자바가 처음 나왔을 때 함께 배포된 GUI 라이브러리 AWT 기술을 기반으로 순수 자바언어로 만든 라이브러리 java.awt 패키지 javax.swing 패키지 Heavy weight (중량) 컴포넌트 Light weight (경량) 컴포넌트 Native(peer) OS의 GUI 컴포넌트의 도움을 받아 작동 Native(peer) OS에 의존 X 빠른 속도, OS 많은 부담 화려한 고급 컴포넌트+AWT 유형 1) JComponet 상속받는 클래스 : 대부분 유형 2) AWT의 Container를 상속받는 클래스 : JApplet, JDialog,JFrame,등
Swing(스윙)
– JComponet : 스윙 컴포넌트의 공통 속성을 구현한 추상 클래스, AWT의 Component를 상속받음
new JComponent() 인스턴스 생성 X
스윙 GUI 프로그램 만드는 방법
1. 스윙 프레임 작성
2. main() 메소드 작성
3. 프레임에 스윙 컴포넌트 붙이기
스윙 패키지 사용 import문
import java.awt.*; //그래픽 처리 클래스의 경로명
import java.awt.event.* //AWT 이벤트 사용을 위한 경로명
import javax.swing.*; // 스윙 컴포넌트 클래스들의 경로명
import javax.swing.event.*; //스윙 이벤트를 위한 경로명
컨테이너와 컴포넌트
컨테이너 컴포넌트 다른 GUI 컴포넌트를 포함할 수 있는 컴포넌트 컨테이너에 포함되어야 화면에 출력될 수 있는 순수 컴포넌트 java.awt.Container 상속, 다른 컨테이너에 포함될 수 O 모든 컴포넌트는 java.awt.Componet 상속받음 모든 스윙 컴포넌트는 javax.swing.JComponent 상속받음 AWT 컨테이너 : Panel, Frame, Applet, Dialog, Window Swing 컨테이너 : 앞에 J 붙인거
최상위 컨테이너
– 독립적 출력 O
– JFrame, JDialog, JApplet
– 모든 컴포넌트는 컨테이너에 포함되어야 화면 출력 O
컨테이너와 컴포넌트의 포함관계
스윙 프레임
– 모든 스윙 컴포넌트를 담는 최상위 GUI 컨테이너
– JFrame을 상속받아 구현
– 스윙 프레임에 의존
프레임 : 스윙 프로그램의 기본 틀
메뉴바 – 메뉴 부착
Content Pane : GUI 컴포넌트 부착
300*300 크기의 스윙 프레임 만들기
import javax.swing.*; public class swing1 extends JFrame{ public swing1(){ setTitle(“300 * 300 swing frame 만들기”); setSize(300,300); setVisible(true); } public static void main(String[] args) { swing1 frame = new swing1(); } }
위의 코드를 실행하면 아래와 같은 창이 뜬다
cf) main()을 프레임 클래스 내의 멤버로 작성
프레임에 컴포넌트 붙이기
– 3개의 버튼 컴포넌트를 가진 스윙프레임
import javax.swing.*; import java.awt.*; public class swing2 extends JFrame{ public swing2() { setTitle(“ContentPane과 JFrame”); //메소드를 호출하여 타이틀달기 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane(); //컨텐트팬 알아내기 contentPane.setBackground(Color.ORANGE); contentPane.setLayout(new FlowLayout()); //컨텐트팬에 컴포넌트 달기 contentPane.add(new JButton(“OK”)); contentPane.add(new JButton(“Cancel”)); contentPane.add(new JButton(“Ignore”)); setSize(300,150); setVisible(true); } public static void main(String[] args) { new swing2(); } }
위의 코드를 실행하면 아래와 같은 창이 뜬다
스윙 응용프로그램의 종료
– 응용프로그램 내에서 스스로 종료
System.exit(0); -언제 어디서나 종료
– 프레임 종료 버튼(x) 클릭되면?
프레임은 닫히지만, 응용프로그램은 작동함
setVisible(true) 호출 시 프레임 보이고 다시 작동
– 프레임 종료 버튼 클릭시 프레임 닫고 응용프로그램 종료하려면?
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main() 종료 뒤에도 프레임이 살아 있는 이유?
– 스윙 프로그램이 실행되는 동안 메인스레드, 이벤트분배스레드 생성
더보기 메인스레드 : main() 실행, 자바 응용 프로그램의 실행 시작 이벤트 분배 스레드 : 자동실행, 프레임과 버튼, 등 GUI 화면 그리기, 키와 마우스 입력받아 호출
실행중인 사용자 스레드가 하나도 없을 때 자바 응용프로그램 종료
-> 메인 스레드가 종료되어도 이벤트 분배 스레드가 살아있어 프레임 화면, 마우스나 키 입력을 받기 때문
컨테이너와 배치 개념
1. 컨테이너마다 하나의 배치 관리자가 존재
– 삽입되는 모든 컴포넌트의 위치와 크기 결정, 적절히 배치
2. 컨테이너의 크기가 변하면 내부 컴포넌트들의 위치와 크기를 모두 재조절/재배치
배치관리자
– java.awt 패키지에 구현되어 있음
(FlowLayout, BorderLayout, GridLayout, CardLayout) 4가지 유형이 있다
“이쪽으로 가세요” 하는 사람을 배치관리자(Layout Manager)
자리를 컨테이너(Container)
자리를 배정받는 사람을 컴포넌트(Component)
배치관리자
– java.awt 패키지에 구현되어 있음
(FlowLayout, BorderLayout, GridLayout, CardLayout)
컨테이너와 디폴트 배치관리자
AWT와 스윙 컨테이너 디폴트 배치관리자 Window, JWindow BorderLayout Frame, JFrame Dialog, JDialog Panel, JPanel FlowLayout Applet, JApplet
컨테이너에 새로운 배치 관리자 설정
– Container.setLayout(LayoutManager Im) : Im을 새로운 배치관리자로 설정
//JPanel 패널에 BorderLayout 배치 관리자 설정 JPanel p = new JPanel(); p.setLayout(new BorderLayout()); //컨텐트팬의 배치 관리자를 FlowLayout으로 변경 Container c = frame.getConentPane(); //컨텐트팬 c.setLayout(new FlowLayout());
FlowLayout
– 컨테이너 크기가 변하면 컴포넌트 재배치
– FLowLayout(int align, int hGap, vGap)
align : 컴포넌트 정렬방법( FlowLayout.LEFT)
hGap : 좌우 컴포넌트 사이 수평간격, 픽셀단위, 디폴트는 5
vGap : 상하 컴포넌트 사이 수직간격, 픽셀단위, 디폴트는 5
FlowLayout 배치 관리자 활용
import javax.swing.*; import java.awt.*; public class swing3 extends JFrame{ public swing3() { setTitle(“FlowLayout Sample”); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); //FlowLayout(int align, int hGap, int vGap) c.setLayout(new FlowLayout(FlowLayout.LEFT,30,40)); //왼쪽으로 정렬 //align : 컴포넌트 정렬방법 //(FlowLayout.LEFT) (FlowLayout.RIGHT) (FlowLayout.CENTER(디폴트)) //hGap : 좌우 컴포넌트 사이 수평간격, 픽셀단위, 디폴트는 5 //vGap : 상하 컴포넌트 사이 수직간격, 픽셀단위, 디폴트는 5 c.add(new JButton(“add”)); c.add(new JButton(“sub”)); c.add(new JButton(“mul”)); c.add(new JButton(“div”)); c.add(new JButton(“Calculate”)); setSize(300,200); setVisible(true); } public static void main(String[] args) { new swing3(); } }
위의 코드를 실행하면 아래와 같은 창이 뜬다
창의 크기를 바꿨더니 아래와 같은 화면이 되었다.
BorderLayout
– 배치방법 : 컨테이너 공간 5구역으로 분할 배치
(East,West,South,North,Center)
– 컨테이너 크기가 변하면 재배치
– void add(Component comp, int index)
: comp 컴포넌트를 index 위치에 삽입
(BorderLayout.EAST)
BorderLayout 배치관리자를 사용하는 코드
import javax.swing.*; import java.awt.*; public class swing4 extends JFrame{ public swing4() { setTitle(“BorderLayout Sample”); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new BorderLayout(30,20)); c.add(new JButton(“Calculate”),BorderLayout.CENTER); c.add(new JButton(“add”),BorderLayout.NORTH); c.add(new JButton(“sub”),BorderLayout.SOUTH); c.add(new JButton(“mul”),BorderLayout.EAST); c.add(new JButton(“div”),BorderLayout.WEST); setSize(300,200); setVisible(true); } public static void main(String[] args) { new swing4(); } }
위의 코드를 실행하면 아래와 같은 창이 뜬다
창의 크기를 바꿨더니 아래와 같은 화면이 되었다.
GridLayout
– 컨테이너 공간을 동일한 사각형 격자(그리드)로 분할하고 각 셀에 하나의 컴포넌트 배치
– 생성자에 행수와 열수 지정(vGap,hGap)
– 컨테이너 크기가 변하면 재배치
– GridLayout(int rows, int cols, int hGap, int vGap)
rows: 그리드 행수, 디폴트는 1
cols : 열수, 디폴트는 1
hGap 좌우 vGap 수직 디폴트는 0
GridLayout으로 입력 폼 만들기
import javax.swing.*; import java.awt.*; public class swing5 extends JFrame{ public swing5() { setTitle(“GridLayout Sample”); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GridLayout grid = new GridLayout(4,2); grid.setVgap(5); Container c = getContentPane(); c.setLayout(grid); c.add(new JLabel(“이름”)); c.add(new JTextField(“”)); c.add(new JLabel(“학번”)); c.add(new JTextField(“”)); c.add(new JLabel(“학과”)); c.add(new JTextField(“”)); c.add(new JLabel(“과목”)); c.add(new JTextField(“”)); setSize(300,200); setVisible(true); } public static void main(String[] args) { new swing5(); } }
위의 코드를 실행하면 아래와 같은 창이 뜬다
배치관리자 없는 컨테이너
– 응용프로그램에서 컴포넌트의 절대크기와 절대위치 결정
(용도)
– 컴포넌트의 크기나 위치 임의 지정
– 시간이나 마우스/키보드의 입력에 따라 컴포넌트들의 위치와 크기가 수시로 변하는 경우
– 여러 컴포넌트들이 서로 겹쳐 출력하고자 하는경우
컨테이너의 배치 관리자 제거 방법 : container.setLayout(null)
– 크기설정 setSize (width, height) 위치설정 setLocating(x,y)
– 위치와 크기 동시 설정 setBounds(x,y,width,height)
컴포넌트를 절대위치와 크기로 지정
import javax.swing.*; import java.awt.*; public class swing6 extends JFrame{ public swing6() { setTitle(“Null Container Sample”); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(null); JLabel la = new JLabel(“Hello, Press Buttons!”); la.setLocation(130,50); la.setSize(200,20); c.add(la); for(int i=1;i<=9;i++) { JButton b = new JButton(Integer.toString(i)); //버튼 생성 b.setLocation(i*15,i*15); b.setSize(50,20); c.add(b); //버튼을 컨텐트팬에 부착 } setSize(300,200); setVisible(true); } public static void main(String[] args) { new swing6(); } } 위의 코드를 실행하면 아래와 같은 창이 뜬다
자바 GUI 프로그래밍
주제분류 공학 >컴퓨터ㆍ통신 >컴퓨터공학
강의학기 2015년 2학기
조회수 15,610
강의계획서
C++와 자바의 차이점 이해 및 이를 통한 자바 심화 학습
자바를 이용한 GUI 프로그래밍 방법 이해 및 이를 통한 자바 언어 사용도를 높이고자 함
[JAVA ] GUI(Graphic User Interface)
JAVA코드를 짜고
이클립스를 실행하면
콘솔창이 뜬다.
하지만 우리는
프로그램을 ‘콘솔’로
사용하지 않는다.
아이콘을 ‘클릭’하면
‘윈도우 창’이 열린다.
이와 같이
입출력 환경이
그래픽으로 구성된 환경을 두고
GUI 환경이라 부른다.
그럼 GUI란 어떤 일을 할까?
GUI (Graphic user Interface)
CPU는 연산이 목적이지
그림그리기가 목적이 아니다.
만약 CPU가 그림까지 그려버리면, 실제로 주목적인 연산을 처리하지 못하고 그림에만 매달리게 된다. 그래서 이 작업을 다른 장치에 맡겨두는데 그것이 그래픽카드(혹은 내장그래픽)다.
OS는 사용자에게 그래픽을 제공한다. 사용자는 그래픽 안에서 각종 이벤트를 발생시킨다(키보드 입력, 마우스 클릭) . 그 이벤트를 OS는 2진코드로 바꾸어 CPU에게 보내 연산을 처리시켜 결과값을 그래픽카드로 보낸다. 그래픽카드는 결과값을 그래픽으로 만든 후, 사용자에게 제공한다.
이와 같이 OS에 제어 아래, 사용자의 이벤트(명령)에 따라 그래픽을 제공하는 환경을 두고 우리는 GUI라 부른다.
JAVA GUI 도구(swing, awt)
그림을 그리려면 도구가 필요하다. 그 도구가 JAVA에서는 awt와 swing 이다. awt와 swing은 ‘그림을 그리는 패키지’이다. GUI에서 말했듯, 연산과 그림 그리기는 ‘분리’되어 있다. Main 클래스의 스레드가 열심히 연산할 때, awt와 swing의 스레드는 열심히 그림을 그려야 한다.
그래서 awt와 swing은 독자적인 스레드를 가진다. GUI환경의 프로그램이 실행되면 자동으로 실행되는 보조 스레드로 우리는 이를 ‘데몬 스레드’라 부른다. awt와 swing이 그림을 그리려면 ‘피사체’가 필요하다.
이를 ‘컨테이너'(Container)라 부른다. 컨테이너 안에는 각종 ‘위젯’들이 포함되어 있다. 로고, 아이디 칸, 비밀번호칸, 로그인 버튼, 계정찾기버튼, 비밀번호 재설정 버튼, 메뉴바 등등 이러한 위젯들을 ‘컴포넌트’라 부른다.
그러므로 awt와 swing이 그림을 그리는 대상은 크게 두 가지다.
1. 특정 한 가지 기능을 하는 ‘컴포넌트'(ex. 버튼, checkBox..)
2. 그 컴포넌트들을 담는 그릇인 ‘컨테이너’ (ex. 프레임, 패널..)
main스레드가 awt와 swing 스레드에게 외주를 맡기려면 먼저 ‘어떻게’ 그려야 하는지 설명 해주어야 한다.
대표사진 삭제
사진 설명을 입력하세요.
메인 스레드는 ‘컨테이너’와 ‘컴포넌트’의 정보를 설정한다. 버튼이 몇 개가 선언되었으며, 어떤 이름을 갖고 있고 어떤 색을 갖고 있으며, 어떤 컨테이너 안에 어떤 컴포넌트가 포함되어야 하는지 등등 각종 설정값들을 메인스레드에서 설정한다.
컨테이너는 대표적으로 두 개가 있다. 프레임(Prame)과 패널(Panel).
네이버 창이 한 프레임이라 보면, 프레임은 용도 별로 여러 개의 패널로 나뉘어진다. 프레임을 특정한 레이아웃(Layout)으로 나눌 때, 패널을 사용하면 컴포넌트 관리가 용이해진다.
프레임 안에 컴포넌트를 바로 배치하면, 프레임은 컴포넌트를 1대1로 관리해야한다. 컴포넌트의 수가 적으면 상관이 없겠지만 네이버 페이지 같이 엄청나게 많은 컴포넌트가 있는 경우, 하나씩 관리해주는 것은 쉽지 않다.
그래서 컴포넌트를 프레임 컨테이너가 아닌 패널 컨테이너 안에 넣어준다. 패널은 컴포넌트들을 그룹화시켜 유지보수를 용이하게 만든다.
import java.awt.Color; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends JFrame { public static void main(String[] args) { // TODO Auto-generated method stub //컨테이너와 컴포넌트 생성 JFrame fr = new JFrame(); // 프레임 JPanel pn1 = new JPanel(); // 패널1 JPanel pn2 = new JPanel(); // 패널2 JButton bt1 = new JButton(“버튼1”); //컴포넌트1 JButton bt2 = new JButton(“버튼2”); //컴포넌트2 JButton bt3 = new JButton(“버튼3”); //컴포넌트3 JButton bt4 = new JButton(“버튼4”); //컴포넌트4 //레이아웃 설정 FlowLayout fl = new FlowLayout(); //레이아웃 설정 fl.setAlignment(FlowLayout.LEFT); //레이아웃 방식 설정 //패널 1 설정 pn1.setBackground(Color.orange); // 패널1 배경색 설정 pn1.add(bt1); // 컨테이너(패널) 안 컴포넌트(버튼1) 넣기 pn1.add(bt2); // 컨테이너(패널) 안 컴포넌트(버튼2) 넣기 //패널 2 설정 pn2.setBackground(Color.BLUE); // 패널2 배경색 설정 pn2.add(bt3); // 컨테이너(패널) 안 컴포넌트(버튼3) 넣기 pn2.add(bt4); // 컨테이너(패널) 안 컴포넌트(버튼4) 넣기 //프레임 설정 fr.setLayout(fl); // 프레임 레이아웃 설정 fr.add(pn1); // 큰 컨테이너(프레임) 안 작은 컨테이너(패널1) 넣기 fr.add(pn2); // 큰 컨테이너(프레임) 안 작은 컨테이너(패널2) 넣기 fr.setDefaultCloseOperation(EXIT_ON_CLOSE); //창을 종료하면 데몬스레드도 같이 종료 fr.setSize(300,300); // 프레임 크기 설정 fr.setVisible(true);// 프레임이 보이도록 설정 } }
이와 같이, main은 ‘설정’만 해놓으면 된다. 가장 큰 컨테이너인 프레임 객체에 최종적으로 add() 시키고 setVisible(true);를 하여 프레임 창이 눈에 보이도록 설정시켜 놓으면 awt와 swing의 데몬스레드가 알아서 실행되어 프레임 객체를 토대로 그림을 그려 아래와 같은 창을 만들어 낸다.
JAVA GUI 도구인 awt와 swing을 사용하기 전에, 이와같은 개념이 가장 중요하다고 생각한다. OS가 연산하는 환경과 그래픽을 담당하는 환경(GUI)이 서로 구분되어 있듯이, JAVA에서도 연산하는 스레드와 그림 그리는 스레드가 분리되어 있다.
fr.setDefaultCloseOperation(EXIT_ON_CLOSE);
이 코드를 넣어주는 이유도 그렇다. 창이 종료되면 Main스레드는 종료된다. 하지만 그림을 그리고 이벤트를 받는 데몬스레드는 종료가 되지 않는다. 창이 종료되었을시, awt와 swing의 데몬스레드도 같이 종료시키려면 저 코드를 사용해야한다.
그래서 Main에서 우리가 awt와 swing 패키지의 클래스를 사용할 때, 가장 주안점을 두어야 하는 부분은 어떻게하면 내가 원하는 방식대로 출력이 되도록 ‘설정’을 할까? 이다. 다양한 메소드가 다양한 기능을 제공하므로 레이아웃을 비롯하여 많은 내용을 공부하면 공부할수록 원하는 창을 만들어 낼 수 있다. 하지만 실무에서는 자바 GUI 환경을 잘 사용하지 않는다고 하니, 깊게 공부할 필요가 있을까 싶다.
정리
1. GUI는 사용자와 그래픽으로 소통하기 위한 환경이다.
2. JAVA의 GUI 프로그래밍도 연산과 그래픽의 스레드가 분리되어 이루어진다.
자바 GUI 프로그래밍 소개
소개
이 기사는 Java GUI 프로그래밍에 대한 경험이 거의 또는 전혀 없는 개인을 위한 것입니다. 따라서 이 백서에서는 프레임에 뿌리를 두고 콘텐츠 창 패널로 이동하는 계층적 트리 구조에 초점을 맞출 것입니다. 그러면 기본 초점은 버튼 위젯(.NET의 컨트롤)과 해당 이벤트 수신기를 처리하는 데 사용되는 해당 메서드에 있습니다. 모든 .NET 프로그래머는 코딩 스타일에 더 많은 텍스트가 필요하고 사용되는 용어가 다르다는 점을 제외하면 이러한 개념이 매우 유사하다는 것을 알게 될 것입니다. www.java.com에서 Sun의 Java Runtime 및 Sun의 J2EE SDK 5.0을 설치한 후 명령줄에서 이 코드를 컴파일하는 빠르고 쉬운 방법은 기본 디렉토리로 이동하는 것입니다. c:SunSDKJDKbin> 유형 사기 > somecode.java Ctrl-Z를 누른 다음 컴파일하십시오. 경로를 설정하려면:set 경로=%PATH%;.;C:SunSDKJDKbin.
Java GUI 프로그래밍에는 원래 AWT(Abstract Windows Kit)와 최신 Swing 툴킷이라는 두 가지 패키지가 포함됩니다. 스윙 구성 요소는 원래 AWT 구성 요소와 구별하기 위해 접두사 J가 있습니다(예: JFrame 대신에 Frame). 프로젝트에 Swing 구성 요소와 메서드를 포함하려면 다음을 가져와야 합니다. java.awt.*, java.awt.event.*그리고 javax.swing.* 패키지. 표시 가능한 프레임은 다음과 같은 최상위 컨테이너입니다. JFrame, JWindows, JDialog그리고 JApplet, 운영 체제의 창 관리자와 인터페이스합니다. 표시되지 않는 콘텐츠 창은 다음과 같은 중간 컨테이너입니다. JPanel, JOptionsPane, JScrollPane그리고 JSplitPane. 따라서 컨테이너는 텍스트 상자, 확인란, 라디오 버튼 등과 같은 다른 위젯을 보유하고 그룹화하는 데 사용되는 위젯 또는 GUI 컨트롤입니다. .NET에서 Windows Form이라고 하는 기본 UI는 컨트롤 화면으로 끌어서 놓는 컨트롤을 보유합니다. 모든 GUI는 사물을 표시하기 위한 창으로 시작합니다. Swing에는 Applet, Dialog 및 Frame의 세 가지 유형의 창이 있습니다. 이러한 인터페이스는 Windows 관리자와 연결됩니다. 스윙에서, frame 개체는 JFrame. ㅏ JFrame 최상위 컨테이너로 간주됩니다. 이를 표시 가능한 프레임이라고도 합니다. 표시되지 않는 콘텐츠 창은 다음과 같은 중간 컨테이너입니다. JPanel, JScrollPane, JLayeredPane, JSplitPane 그리고 JTabbedPane 여러 컨트롤을 사용할 때 레이아웃 구조를 구성합니다. 간단히 말해서 콘텐츠 창은 다른 위젯인 텍스트 필드를 배치하는 곳이므로 GUI 컨트롤을 추가하고 표시하려면 추가할 콘텐츠 창을 지정해야 합니다. 그러면 콘텐츠 창은 포함 계층의 맨 위에 있으며, 이 트리와 같은 계층에는 최상위 컨테이너가 있습니다(이 경우 JFrame). 트리를 아래로 작업하면 다음과 같은 다른 최상위 컨테이너를 찾을 수 있습니다. JPanel 구성 요소를 유지합니다. 다음은 간단한 코드를 생성하는 코드입니다. frame 다음을 기반으로 구축:
import java.awt.*; import java.awt.event.*; import javax.swing.*; //notice javax public class Frame1 extends JFrame { JPanel pane = new JPanel(); Frame1() // the frame constructor method { super(“My Simple Frame”); setBounds(100,100,300,100); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container con = this.getContentPane(); // inherit main frame con.add(pane); // add the panel to frame // customize panel here // pane.add(someWidget); setVisible(true); // display this frame } public static void main(String args[]) {new Frame1();} }
Java 코드를 컴파일한 적이 없다면 컴파일 및 해석 과정을 보여주기 위해 이 기본 코드를 고려하십시오. .NET 컴파일러가 IL 코드와 메타데이터를 내보내면 CLR에서 메타데이터 테이블을 읽어 형식 안전성을 확인하므로(즉, 올바른 데이터 형식이 올바른 메서드에 전달됨) JIT 컴파일러는 IL 코드를 네이티브 코드로 변환합니다. 실행을 위해. Java Virtual Machine과 같이 해석이 없습니다. Java 플랫폼은 API(사용 프로그램용으로 컴파일된 라이브러리 모음 및 JVM(CLR과 유사))에 의해 정의됩니다. Java 소스 코드 파일은 런타임 실행 다음은 예입니다.
import java.util.*; public class Sys { public static void main(String[] args) { System.out.println (“This is a string passed to the print line method of the System class”); } }
c:SunSDKjdkbin>javac.exe Sys.java // the javac.exe compiler // compiles the source code
c:SunSDKjdkbin>java.exe Sys // the java.exe interprets the byte code file // (in the same directory where the class file is.
This is a string passed to the print line method of the System class.
다음은 버튼이 있는 GUI를 표시하는 코드입니다.
그러나 버튼을 누르면 아무 작업도 수행하지 않습니다.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Frame2 extends JFrame { JPanel pane = new JPanel(); JButton pressme = new JButton(“Press Me”); Frame2() // the frame constructor { super(“JPrompt Demo”); setBounds(100,100,300,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container con = this.getContentPane(); // inherit main frame con.add(pane); // JPanel containers default to FlowLayout pressme.setMnemonic(‘P’); // associate hotkey to button pane.add(pressme); pressme.requestFocus(); setVisible(true); // make frame visible } public static void main(String args[]) {new Frame2();} }
C:…bin>Javac.exe Frame2.java
C:…bin>Java.exe Frame2
Java GUI는 키 누름, 마우스 클릭, 라디오 버튼 등과 같은 표준 입력 장치에 응답하기 때문에 이벤트 기반입니다. 다음은 버튼 누름의 출력입니다.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Frame3 extends JFrame implements ActionListener { JLabel answer = new JLabel(“”); JPanel pane = new JPanel(); // create pane object JButton pressme = new JButton(“Press Me”); Frame3() // the constructor { super(“Event Handler Demo”); setBounds(100,100,300,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container con = this.getContentPane(); // inherit main frame con.add(pane); pressme.setMnemonic(‘P’); // associate hotkey pressme.addActionListener(this); // register button listener pane.add(answer); pane.add(pressme); pressme.requestFocus(); setVisible(true); // make frame visible } // here is the basic event handler public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if (source == pressme) { answer.setText(“Button pressed!”); JOptionPane.showMessageDialog(null,”I hear you!”,”Message Dialog”, JOptionPane.PLAIN_MESSAGE); setVisible(true); // show something } } public static void main(String args[]) {new Frame3();} }
위의 예제에 기본 버튼 푸시 이벤트 핸들러를 추가하는 첫 번째 단계는 다음을 가져오는 것입니다. awt.event.* 모든 이벤트 클래스를 포함합니다. 다음 문구 추가 implements ActionListener 사용하기 위해 클래스 헤더에 interface. 다음을 사용하여 각 버튼 위젯에 대한 이벤트 리스너를 등록합니다. addActionListener(this) 방법. 예약어 this 필요함을 나타냅니다(에 의해 implements ActionListener) 핸들러 메소드가 호출됨 actionPerformed() 현재 클래스에 포함됩니다. 예를 들어 다음과 같은 더 다채로운 예를 생각해 보십시오.
import javax.swing.*; import java.awt.Color; public class ButtonDemo{ public JPanel createContentPane (){ // We create a bottom JPanel to place everything on. JPanel totalGUI = new JPanel(); totalGUI.setLayout(null); // Creation of a Panel to contain the title labels JPanel titlePanel = new JPanel(); titlePanel.setLayout(null); titlePanel.setLocation(10, 0); titlePanel.setSize(250, 30); totalGUI.add(titlePanel); JLabel redLabel = new JLabel(“Red Team”); redLabel.setLocation(0, 0); redLabel.setSize(100, 30); redLabel.setHorizontalAlignment(0); redLabel.setForeground(Color.red); titlePanel.add(redLabel); JLabel blueLabel = new JLabel(“Blue Team”); blueLabel.setLocation(120, 0); blueLabel.setSize(100, 30); blueLabel.setHorizontalAlignment(0); blueLabel.setForeground(Color.blue); titlePanel.add(blueLabel); // Creation of a Panel to contain the score labels. JPanel scorePanel = new JPanel(); scorePanel.setLayout(null); scorePanel.setLocation(10, 40); scorePanel.setSize(250, 30); totalGUI.add(scorePanel); JLabel redScore = new JLabel(“0”); redScore.setLocation(0, 0); redScore.setSize(100, 30); redScore.setHorizontalAlignment(0); scorePanel.add(redScore); JLabel blueScore = new JLabel(“0”); blueScore.setLocation(120, 0); blueScore.setSize(100, 30); blueScore.setHorizontalAlignment(0); scorePanel.add(blueScore); // Creation of a label to contain all the JButtons. JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(null); buttonPanel.setLocation(10, 80); buttonPanel.setSize(250, 70); totalGUI.add(buttonPanel); // We create a button and manipulate it using the syntax we have // used before. JButton redButton = new JButton(“Red Score!”); redButton.setLocation(0, 0); redButton.setSize(100, 30); buttonPanel.add(redButton); JButton blueButton = new JButton(“Blue Score!”); blueButton.setLocation(120, 0); blueButton.setSize(100, 30); buttonPanel.add(blueButton); JButton resetButton = new JButton(“Reset Score”); resetButton.setLocation(0, 40); resetButton.setSize(220, 30); buttonPanel.add(resetButton); totalGUI.setOpaque(true); return totalGUI; } private static void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame(“[=] JButton Scores! [=]”); //Create and set up the content pane. ButtonExample demo = new ButtonExample(); frame.setContentPane(demo.createContentPane()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(250, 190); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application’s GUI. SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }
산출
이벤트 리스너가 필요할 때 버튼을 눌러도 아무 일도 일어나지 않습니다:
import javax.swing.*; import java.awt.Color; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class ButtonDemo_Extended implements ActionListener{ // Definition of global values and items that are part of the GUI. int redScoreAmount = 0; int blueScoreAmount = 0; JPanel titlePanel, scorePanel, buttonPanel; JLabel redLabel, blueLabel, redScore, blueScore; JButton redButton, blueButton, resetButton; public JPanel createContentPane (){ // We create a bottom JPanel to place everything on. JPanel totalGUI = new JPanel(); totalGUI.setLayout(null); // Creation of a Panel to contain the title labels titlePanel = new JPanel(); titlePanel.setLayout(null); titlePanel.setLocation(10, 0); titlePanel.setSize(250, 30); totalGUI.add(titlePanel); redLabel = new JLabel(“Red Team”); redLabel.setLocation(0, 0); redLabel.setSize(120, 30); redLabel.setHorizontalAlignment(0); redLabel.setForeground(Color.red); titlePanel.add(redLabel); blueLabel = new JLabel(“Blue Team”); blueLabel.setLocation(130, 0); blueLabel.setSize(120, 30); blueLabel.setHorizontalAlignment(0); blueLabel.setForeground(Color.blue); titlePanel.add(blueLabel); // Creation of a Panel to contain the score labels. scorePanel = new JPanel(); scorePanel.setLayout(null); scorePanel.setLocation(10, 40); scorePanel.setSize(260, 30); totalGUI.add(scorePanel); redScore = new JLabel(“”+redScoreAmount); redScore.setLocation(0, 0); redScore.setSize(120, 30); redScore.setHorizontalAlignment(0); scorePanel.add(redScore); blueScore = new JLabel(“”+blueScoreAmount); blueScore.setLocation(130, 0); blueScore.setSize(120, 30); blueScore.setHorizontalAlignment(0); scorePanel.add(blueScore); // Creation of a Panel to contain all the JButtons. buttonPanel = new JPanel(); buttonPanel.setLayout(null); buttonPanel.setLocation(10, 80); buttonPanel.setSize(260, 70); totalGUI.add(buttonPanel); // We create a button and manipulate it using the syntax we have // used before. Now each button has an ActionListener which posts // its action out when the button is pressed. redButton = new JButton(“Red Score!”); redButton.setLocation(0, 0); redButton.setSize(120, 30); redButton.addActionListener(this); buttonPanel.add(redButton); blueButton = new JButton(“Blue Score!”); blueButton.setLocation(130, 0); blueButton.setSize(120, 30); blueButton.addActionListener(this); buttonPanel.add(blueButton); resetButton = new JButton(“Reset Score”); resetButton.setLocation(0, 40); resetButton.setSize(250, 30); resetButton.addActionListener(this); buttonPanel.add(resetButton); totalGUI.setOpaque(true); return totalGUI; } // This is the new ActionPerformed Method. // It catches any events with an ActionListener attached. // Using an if statement, we can determine which button was pressed // and change the appropriate values in our GUI. public void actionPerformed(ActionEvent e) { if(e.getSource() == redButton) { redScoreAmount = redScoreAmount + 1; redScore.setText(“”+redScoreAmount); } else if(e.getSource() == blueButton) { blueScoreAmount = blueScoreAmount + 1; blueScore.setText(“”+blueScoreAmount); } else if(e.getSource() == resetButton) { redScoreAmount = 0; blueScoreAmount = 0; redScore.setText(“”+redScoreAmount); blueScore.setText(“”+blueScoreAmount); } } private static void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame(“[=] JButton Scores! [=]”); //Create and set up the content pane. ButtonDemo_Extended demo = new ButtonDemo_Extended(); frame.setContentPane(demo.createContentPane()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(280, 190); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application’s GUI. SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }
추천 읽을거리
가이드북 http://www.macs.hw.ac.uk
JR의 교육 페이지 http://home.cogeco.ca
역사
제9절 GUI 프로그래밍 소개
제9절
GUI 프로그래밍 소개
지난 두 장에 걸쳐 하나의 서브루틴 안에서 행해지는 일종의 프로그래밍, 즉 “소규모의 프로그래밍”을 배워왔다. 이 교재의 나머지 부분에서는, 더 큰 규모의 프로그램 구조에 더욱 신경을 쓰겠지만, 이미 배운 자료는 다가올 모든 것에 중요한 토대가 될 것이다. 이 절에서는 지금까지 배운 기술을 그래픽 사용자 인터페이스 프로그래밍의 맥락에서 어떻게 적용할 수 있는지 살펴본다. 여기에서, 그리고 이 교재의 나머지 부분에서, GUI 프로그램을 작성하기 위한 “툴킷(toolkit)”을 형성하는 클래스 모음인 JavaFX를 사용하여 GUI 프로그램을 작성한다. 이 절에서 언급한 모든 클래스는 JavaFX의 일부분으로, 해당 클래스를 사용하는 모든 프로그램에서 이를 불러와야 한다. JavaFX를 사용하는 프로그램을 컴파일하고 실행하는 방법은 제2장 제6절을 참조하라.
GUI 프로그램을 실행하면 컴퓨터 화면에 하나 또는 그 이상의 창이 열린다. 프로그래머로서, 창에 나타나는 것과 사용자가 이와 상호작용할 수 있는 방법을 완전히 통제할 수 있다. 첫 번째 만남으로, 간단한 예를 하나 볼 것이다: 사용자와의 상호작용 없이, 창에 직사각형이나 선과 같은 간단한 모양을 표시하는 프로그램의 기능. 일단 텍스트 기반의 명령줄 형식의 프로그램 외에 다른 맥락에서 소규모 프로그래밍이 어떻게 활용될 수 있는지 살펴보는 것이 골자다. 소규모 프로그래밍에 대한 지식이 단순히 main() 이 아닌 서브루틴의 내부를 작성하는 데 적용된다는 것을 알게 될 것이다.
제1관 도형 그리기
컴퓨터 그래픽을 이해하려면 픽셀과 좌표계를 조금 알아야 한다. 컴퓨터 화면은 픽셀(pixel)이라고 불리는 작은 사각형들로 이루어져 있으며, 이들은 행과 열로 배열되어 있는데, 보통 인치당 약 100픽셀 정도 된다. (현대의 많은 화면은 인치당 훨씬 더 많은 물리적 픽셀을 가지고 있다. 이러한 “고해상도(high-resolution)” 화면에서 JavaFX “픽셀”은 물리적 픽셀을 가리킬 수도 있지만, 1/100인치에 다소 가까운 측정 단위인 “논리적 픽셀”을 가리킬 가능성이 더 높다.)
컴퓨터는 픽셀의 색상을 조절하며, 그리기(drawing)는 개별 픽셀의 색상을 변경하여 이루어진다. 각 픽셀에는 픽셀의 수평 및 수직 위치를 지정하는, 종종 x 및 y 로 불리는 정수 좌표 쌍이 있다. 화면의 직사각형 영역에 그릴 때 직사각형의 왼쪽 상단 모서리에 있는 픽셀의 좌표는 (0,0)이다. x 좌표는 왼쪽에서 오른쪽으로 증가하고 y 좌표는 위에서 아래로 증가한다. 도형은 픽셀을 사용하여 명시된다. 예를 들어 직사각형은 왼쪽 위 모서리의 x 및 y 좌표와 픽셀 단위로 측정한 폭(width)과 높이(height)로 지정된다. 여기 x 좌표와 y 좌표의 범위를 보여주는 직사각형 그리기 영역의 그림이 있다. 이 그림의 “폭”과 “높이”는 그리기 영역의 크기를 픽셀 단위로 표시한다:
그리기 영역이 800 X 500픽셀이라고 가정하면, 그림의 왼쪽 위 사각형은 대략 폭 200, 높이 150를 가지며, 좌표 (50,50)에 왼쪽 위 모서리가 위치한다.
자바에서 그리기는 그래픽 컨텍스트(graphics context)를 사용하여 이루어진다. 그래픽 컨텍스트는 객체다. 객체로서 이는 서브루틴과 데이터를 포함할 수 있다. 그래픽 컨텍스트의 서브루틴 중에는 선(line), 직사각형(rectangle), 타원(oval) 및 텍스트(text)와 같은 기본 도형을 그리는 루틴이 있다. (텍스트가 화면에 나타나면, 컴퓨터가 다른 도형을 그리는 것처럼 해당 문자들이 컴퓨터에 의해 그 곳에 그려지는 것이다.) 그래픽 컨텍스트의 데이터 중에는 현재 그리기 위해 선택된 색상과 글꼴이 있다. (글꼴은 문자의 스타일과 크기를 결정한다.) 그래픽 컨텍스트의 다른 데이터 조각은 그리기가 완료된 “그리기 표면(drawing surface)”이다. 다른 그래픽 컨텍스트 객체를 다른 그리기 표면에 그릴 수 있다. 우리에게 그리기 표면은 테두리나 제목 표시줄을 포함하지 않고 창의 내용 영역이 될 것이다.
JavaFX에서 도형을 그리는 방법에는 두 가지가 있다: 도형을 채울(fill) 수 있는데, 이는 도형 안에 있는 픽셀의 색상을 각각 설정할 수 있다는 뜻이다. 또는 도형을 스트로크(stroke) 할 수 있는데, 이는 도형의 테두리를 따라 놓여 있는 픽셀의 색을 설정한다는 의미이다. 선과 같은 몇몇 도형은 스트로크만 할 수 있다. 그래픽 컨텍스트는 실제로 도형 채우기에 사용되는 색상과 도형 스트로크에 사용되는 색상, 두 가지의 개별적인 색상을 추적한다. 도형을 스트로크하는 것은 도형의 테두리를 따라 펜을 끄는 것(dragging)과 같다. 해당 펜의 속성(크기 및 실선 또는 점선을 생성하는지 여부와 같은)은 그래픽 컨텍스트의 속성이다.
그래픽 컨텍스트는 변수로 표현된다. 변수의 자료형은 GraphicsContext (문자열 변수의 자료형이 String 인 것처럼)이다. 변수의 이름은 종종 g 라고 명명되지만, 물론 이는 프로그래머에게 달려 있다. 다음은 그래픽 컨텍스트 g 에서 사용할 수 있는 몇 가지 서브루틴이다. 모든 숫자 매개변수 값은 double 자료형일 수 있다는 점에 유의하라.
g.setFill(c) 은 도형을 채우는 데 사용될 색상을 설정하기 위해 호출된다. 매개변수 c 는 Color 라는 클래스에 속하는 객체다. 이 서브루틴에는 매개변수로 사용할 수 있는 표준 색상을 나타내는 상수가 많이 존재한다. 표준 색상은 Color.BLACK , Color.WHITE , Color.RED , Color.GREEN , Color.BLUE , 그리고 Color.YELLOW 와 같은 일반적인 색부터, Color.CORNFLOWERBLUE 와 같은 좀 더 이국적인 색 이름들까지에 걸쳐 있다. (나중에, 새로운 색을 생성할 수 있다는 것도 알게 될 것이다.) 예를 들어, 도형을 빨간색으로 채우려면 ” g.setFill(Color.RED); “라고 하면 된다. g.setFill() 이 다음에 호출되기 전까지, 지정된 색이 이후의 모든 채우기 작업에 사용된다. 이전에 그려진 도형은 영향을 받지 않는다는 점에 유의하라!
은 도형을 채우는 데 사용될 색상을 설정하기 위해 호출된다. 매개변수 c 는 Color 라는 클래스에 속하는 객체다. 이 서브루틴에는 매개변수로 사용할 수 있는 표준 색상을 나타내는 상수가 많이 존재한다. 표준 색상은 , , , , , 그리고 와 같은 일반적인 색부터, 와 같은 좀 더 이국적인 색 이름들까지에 걸쳐 있다. (나중에, 새로운 색을 생성할 수 있다는 것도 알게 될 것이다.) 예를 들어, 도형을 빨간색으로 채우려면 ” “라고 하면 된다. 이 다음에 호출되기 전까지, 지정된 색이 이후의 모든 채우기 작업에 사용된다. 이전에 그려진 도형은 영향을 받지 않는다는 점에 유의하라! g.setStroke(c) 는 도형을 스트로크하는 데 사용되는 색을 설정하기 위해 호출된다. 이는 g.setFill 과 유사하게 작동한다.
는 도형을 스트로크하는 데 사용되는 색을 설정하기 위해 호출된다. 이는 과 유사하게 작동한다. g.setLineWidth(w) 는 후속 스트로크 연산에 사용할 펜의 크기를 설정하며, 여기서 w 는 픽셀 단위로 측정된다.
는 후속 스트로크 연산에 사용할 펜의 크기를 설정하며, 여기서 는 픽셀 단위로 측정된다. g.strokeLine(x1,y1,x2,y2) 은 좌표 (x1,y1)가 있는 점부터 좌표 (x2,y2)가 있는 점까지 선을 그린다. 선의 너비는, g.setLineWidth() 를 호출하여 다른 선 너비를 설정하지 않는 한 1이고, 색상은 g.setStroke() 를 호출하여 다른 색상을 설정하지 않는 한 검은색이다.
은 좌표 (x1,y1)가 있는 점부터 좌표 (x2,y2)가 있는 점까지 선을 그린다. 선의 너비는, 를 호출하여 다른 선 너비를 설정하지 않는 한 1이고, 색상은 를 호출하여 다른 색상을 설정하지 않는 한 검은색이다. g.strokeRect(x,y,w,h) 는 직사각형의 윤곽을 수직과 수평으로 그린다. 이 서브루틴은 사각형의 윤곽을 그리는데, 그 상단 왼쪽 측면이 그리기 영역의 왼쪽 가장자리에서 x 픽셀만큼, 상단에서 y 픽셀만큼 떨어져 있다. 직사각형의 가로 폭은 w 픽셀이고, 세로 높이는 h 픽셀이다. 색상과 선의 폭은 g.setStroke() 및 g.setLineWidth() 를 호출하여 설정한다.
는 직사각형의 윤곽을 수직과 수평으로 그린다. 이 서브루틴은 사각형의 윤곽을 그리는데, 그 상단 왼쪽 측면이 그리기 영역의 왼쪽 가장자리에서 픽셀만큼, 상단에서 픽셀만큼 떨어져 있다. 직사각형의 가로 폭은 픽셀이고, 세로 높이는 픽셀이다. 색상과 선의 폭은 및 를 호출하여 설정한다. g.fillRect(x,y,w,h) 는 윤곽선을 그리는 대신 사각형의 내부를 채운다는 점을 제외하면 g.strokeRect() 와 유사하며, g.setFill() 에 의해 설정된 색상을 사용한다.
는 윤곽선을 그리는 대신 사각형의 내부를 채운다는 점을 제외하면 와 유사하며, 에 의해 설정된 색상을 사용한다. g.strokeOval(x,y,w,h) 은 타원의 윤곽을 그린다. 타원은 g.strokeRect(x,y,w,h) 로 그려질 직사각형 안에 딱 들어맞는다. 원을 가져오려면 w 와 h 에 대해 동일한 값을 사용하라.
은 타원의 윤곽을 그린다. 타원은 로 그려질 직사각형 안에 딱 들어맞는다. 원을 가져오려면 와 에 대해 동일한 값을 사용하라. g.fillOval(x,y,w,h)은 윤곽선을 그리는 대신 타원의 내부를 채운다는 점을 제외하면 g.strokeOval() 과 비슷하다.
이는 자바 그래픽을 사용하여 몇몇 그림을 그리기에 충분한 정보이다. 간단한 것부터 시작하자면, 다음과 같은 10개의 평행선을 그리고 싶다 가정하자:
선들의 길이가 200픽셀이고 각 선에서 다음 선까지의 거리가 10픽셀이며, 좌표 (100,50)에 있는 픽셀에 첫 번째 선의 시작점을 넣는다고 하자. 선 하나를 그리려면 g.strokeLine(x1,y1,x2,y2) 을 매개변수에 대한 적절한 값과 함께 호출하기만 하면 된다. 자, 모든 선은 x 좌표 100에서 시작되므로 상수 100을 x1 의 값으로 사용할 수 있다. 선 길이가 200픽셀이므로 상수 300을 x2 값으로 사용할 수 있다. 선의 y 좌표는 다르지만, 선의 양쪽 끝점이 모두 동일한 y 좌표를 가지므로 단일 변수를 y1 과 y2 의 값으로 사용할 수 있음을 알 수 있다. y 를 해당 변수의 이름으로 사용하면, 선들 중 하나를 그리는 명령은 g.strokeLine(100,y,300,y) 이 된다. y 의 값은 최상단 선에서는 50이고 한 선에서 다음 선으로 이동할 때마다 10씩 증가한다. 그저 y 가 정확한 값들의 순서를 취하는지를 확인하기만 하면 된다. 1부터 10까지를 세는 for 루프를 사용할 수 있다:
int y; // 선의 y 좌표 int i; // 루프 제어 변수 y = 50; // 첫 번째 선에 대한 y는 50부터 시작 for ( i = 1; i <= 10; i++ ) { g.strokeLine( 100, y, 300, y ); y = y + 10; // 다음 선을 그리기 전에 y를 10씩 증가시킴. } 또는 마지막 선에 대한 y 의 값이 140이라는 점에 주목하여, y 자체를 루프 제어 변수로 사용할 수도 있을 것이다: int y; for ( y = 50; y <= 140; y = y + 10 ) g.strokeLine( 100, y, 300, y ); 선들이 파란색이 되길 바란다면, g.setStroke(Color.BLUE) 를 이들을 그리기 이전에 호출할 수 있다. 색상을 정하지 않고 선만을 그리면, 이들은 검은색이 될 것이다. 선들의 너비가 3픽셀이 되길 원한다면 이들을 그리기 이전에 g.setLineWidth(3) 을 호출할 수 있을 것이다. 좀 더 복잡한 것을 위해서, 무작위로 색칠되고, 배치되고, 채워지는 원들을 많이 그려보자. 몇몇 색상밖에 모르기에 필자는 무작위로 빨강, 초록, 파랑, 또는 노랑으로 색을 고를 것이다. 이 작업은 제3장 제6절 제4관의 것과 유사한 간단한 switch 문으로 수행될 수 있다: switch ( (int)(4*Math.random()) ) { case 0: g.setFill( Color.RED ); break; case 1: g.setFill( Color.GREEN ); break; case 2: g.setFill( Color.BLUE ); break; case 3: g.setFill( Color.YELLOW ); break; } 필자는 무작위로 원의 중심점을 선택할 것이다. 그리기 영역의 폭은 변수 width 에 의해 주어진다고 하자. 그런 다음 중심의 수평 위치에 관한 0부터 width -1까지의 범위 사이의 무작위 값을 원한다. 이와 유사하게, 중심의 수직 위치는 0부터 height -1까지의 범위에서 무작위의 값이 될 것이다. 이는 원의 크기를 결정하게 한다; 필자는 각 원의 반지름을 50픽셀과 같게 만들 것이다. g.fillOval(x,y,w,h) 형식의 문장으로 원을 그릴 수 있다. 그러나 이 명령에서 x 와 y 는 원의 중심 좌표가 아니다; 이들은 원을 중심으로 그려진 직사각형의 왼쪽 상단 모서리가 된다. x 와 y 의 값을 구하려면 원의 중심에서 원의 반지름과 같은 50픽셀씩 뒤로 이동해야 한다. w 와 h 매개변수는 직사각형의 폭과 높이를 제공하며, 이 경우 반지름의 두 배, 즉 100픽셀이어야 한다. 이 모든 것을 고려하여, 무작위의 원을 그리기 위한 코드 조각은 다음과 같다: centerX = (int)(width*Math.random()); centerY = (int)(height*Math.random()); g.fillOval( centerX - 50, centerY - 50, 100, 100 ); 이 코드는 위에 주어진 색상 설정 코드 다음에 등장한다. 마지막에, 필자는 채워진 각 원의 주변을 검은 윤곽선으로 다시 그리면 그림이 더 잘 보인다는 것을 알게 되었고, 따라서 그 끝에 이 코드를 추가하였다: g.setStroke( Color.BLACK ); g.strokeOval( centerX - 50, centerY - 50, 100, 100 ); 최종적으로, 많은 수의 원을 얻기 위해, 필자는 위의 모든 코드를 500회 실행하는 for 루프에 넣었다. 다음은 프로그램의 전형적인 그리기로, 축소된 크기로 표시된 것이다: 제2관 프로그램에서 그리기 자, 알다시피 자립하고 있는 자바 코드 뭉치를 그냥 얻을 수는 없다. 코드는 클래스 정의 안에 있는 서브루틴의 정의 안에 있어야 한다. 사실, 필자의 원 그리기 프로그램의 경우, 그림을 그리는 완전한 서브루틴은 다음과 같이 보인다: public void drawPicture(GraphicsContext g, int width, int height) { g.setFill(Color.WHITE); g.fillRect(0, 0, width, height); // 우선, 배경색을 채움. // 예제로써, 상당한 수의 색칠된 원형(disk)을 그린다. // 다른 그림을 얻으려면 이 코드를 지우고 당신 고유의 것으로 대체하라. int centerX; // 원형의 중심에 관한 x 좌표. int centerY; // 원형의 중심에 관한 y 좌표. int colorChoice; // 무작위 색상을 선택하는데 사용됨. int count; // 원형을 세기 위한 루프 제어 변수 for (count = 0; count < 500; count++) { centerX = (int)(width*Math.random()); centerY = (int)(height*Math.random()); colorChoice = (int)(4*Math.random()); switch (colorChoice) { case 0: g.setFill(Color.RED); break; case 1: g.setFill(Color.GREEN); break; case 2: g.setFill(Color.BLUE); break; case 3: g.setFill(Color.YELLOW); break; } g.fillOval( centerX - 50, centerY - 50, 100, 100 ); g.setStroke(Color.BLACK); g.strokeOval( centerX - 50, centerY - 50, 100, 100 ); } } // drawPicture() 종료 이는 main() 이외의 서브루틴 정의로써 처음 보았을 것이나, 서브루틴 정의에 대해서는 다음 장에서 전부를 배우게 될 것이다. 정의의 첫 번째 행은 서브루틴에서 사용되는 특정 값, 즉 그래픽 컨텍스트 g 와 그리기 영역의 width 와 height 값을 사용할 수 있게 한다. 이 값들은 서브루틴 밖에서 나오지만 서브루틴은 이들을 사용할 수 있다. 여기서 요점은, 무엇을 그리려면 main() 의 안쪽을 채워 프로그램을 작성하는 것처럼 서브루틴의 안쪽만 채우면 된다는 것이다. 서브루틴 정의는 여전히 프로그램을 정의하는 클래스 안에 들어가야 한다. 이 경우 클래스의 이름은 SimpleGraphicsStarter, 전체 프로그램은 샘플 소스 코드 파일 SimpleGraphicsStarter.java에서 이용할 수 있다. 해당 프로그램을 실행하면 그리기를 볼 수 있다. 이 샘플 프로그램을 당신 자신의 그림을 그리는 출발점으로 사용할 수 있다. 해당 프로그램에는 이해하지 못할 많은 것들이 있을 터이다. 직접 그리기 위해서는 소스코드에서 drawPicture() 루틴의 내부를 지우고 자신의 그리기 코드로 대체하기만 하면 된다. 나머지를 이해할 필요는 없다. (그런데, main() 서브루틴은 그 정의에서 static 이라는 단어를 사용하지만, drawPicture() 는 그렇지 않다는 것을 알았을지도 모르겠다. 이는 drawPicture 가 클래스가 아닌 객체의 서브루틴이라는 사실과 관계가 있다. 정적(static) 서브루틴과 비정적(non-static) 서브루틴의 차이는 중요하지만 당분간 걱정해야 할 것은 아니다. 이는 제5장에서 중요한 일이 될 것이다.) 제3관 애니메이션 그림을 그리는 아이디어를 애니메이션(animation) 제작으로 확대할 수 있다. 컴퓨터 애니메이션은 단순히 개별 그림들의 나열일 뿐이며, 이들이 차례대로 빠르게 표시된다. 각 그림에서 다음 그림으로의 변화가 작을 경우 사용자는 이미지의 나열을 연속적인 애니메이션으로 인식하게 된다. 애니메이션에 나오는 각각의 그림을 프레임(frame)이라고 부른다. 샘플 프로그램 SimpleAnimationStarter.java는 애니메이션을 작성하기 위한 출발점으로 사용할 수 있다. 이에는 애니메이션에서 하나의 프레임을 그리는 drawFrame() 이라는 서브루틴이 들어 있다. 이 서브루틴의 정의를 채워 애니메이션을 만들 수 있다. 그래픽 컨텍스트 및 그리기 영역의 폭과 높이 외에도, 코드에서 다른 두 변수들의 값을 사용할 수 있다: frameNumber 및 elapsedSeconds . drawFrame 서브루틴은 초당 약 60회 호출된다. 변수 frameNumber 는 서브루틴의 연속된 호출에서 0, 1, 2, 3, ...의 값을 취하며, elapsedSeconds 의 값은 애니메이션이 실행된 초단위 시간이다. 코드에서 이러한 변수들 중 하나를 사용하면 drawFrame() 그리기를 호출할 때마다 다른 그림을 그릴 수 있으며, 사용자는 일련의 그림을 애니메이션으로 볼 수 있다. 애니메이션의 예로서, 중첩된 직사각형 집합 그리기를 볼 것이다. 직사각형은 그림의 중앙을 향해 축소되어 무한한 움직임의 환영을 일으킬 것이다. 애니메이션의 한 프레임은 다음과 같다: 이런 그림을 어떻게 그리는지 생각해보자. 해당 직사각형들은 바깥쪽에서 시작하여 안으로 들어가는 직사각형을 그리는 while 루프를 이용하여 그릴 수 있다. 어떤 변수가 필요할지, 그리고 while 루프의 한 반복에서 다음으로 넘어갈 때 이들이 어떻게 변화하는지 생각해보라. 매번 루프를 통해 그려지는 직사각형은 이전 직사각형보다 작아지고, 아래와 위로 조금씩 이동하게 된다. 두 직사각형의 차이는 그 크기와 왼쪽 상단 모서리의 좌표에 있다. 직사각형의 폭과 높이를 나타내는 변수가 필요하며, 필자는 이를 rectWidth 과 rectHeight 로 부를 것이다. 왼쪽 상단 모서리의 x 좌표와 y 좌표는 동일하며, 동일한 변수로 나타낼 수 있다. 필자는 이 변수를 inset 이라고 부를 것인데, 왜냐하면 이는 직사각형의 모서리들이 그리기 영역의 가장자리에 삽입(inset)되는 양이기 때문이다. 폭과 높이는 한 직사각형에서 다음 직사각형으로 가면서 감소하는 반면, inset 은 증가한다. while 루프는 폭이나 높이가 0보다 작거나 같을 때 끝이 난다. 일반적으로 하나의 프레임을 그리는 알고리즘은 다음과 같다: 그리기 영역을 흰색으로 채운다 첫 번째 직사각형의 인셋 양을 설정한다 첫 번째 직사각형의 폭과 높이를 설정한다 스트로크 색상을 검은색으로 설정한다 폭과 높이가 모두 0보다 큰 동안에: 직사각형을 그린다(g.strokeRect 서브루틴 사용) 인셋을 증가시킨다(다음 직사각형으로 이동하기 위해) 폭과 높이를 감소시킨다(다음 직사각형이 작아지도록 하기 위해) 필자의 프로그램에서 각 직사각형은 이를 둘러싸고 있는 직사각형으로부터 15픽셀만큼 떨어져 있기 때문에, while 루프를 통할 때마다 inset 이 15픽셀씩 증가한다. 직사각형은 왼쪽으로 15픽셀씩, 그리고 오른쪽으로 15픽셀씩 줄어들기 때문에, 다음 직사각형을 그리기 전에 직사각형의 폭이 30픽셀씩 줄어든다. 높이도 루프를 통하면서 매번 30픽셀씩 줄어든다. 첫 번째 사각형에 관한 인셋, 폭, 높이에 어떤 초기 값을 사용할지 알아야 한다는 점을 제외하면, 해당 유사코드는 자바로 쉽게 번역된다. 이를 알아내기 위해서는 그림이 애니메이션이 되며, 그려지는 것이 어떤 식으로든 프레임 번호에 의존한다는 점을 생각해야 한다. 한 프레임에서 애니메이션의 다음 프레임으로, 바깥쪽 직사각형의 왼쪽 상단 모서리가 아래와 위로 움직인다; 즉, 바깥쪽 직사각형에 대한 inset 이 한 프레임에서 다음 프레임으로 가면서 증가한다. 프레임 번호 0에서 0으로, 프레임 번호 1에서 1로, 등의 각각에 대한 인셋을 설정하여 이런 일이 생기도록 할 수 있다. 하지만 이는 영원히 계속될 수 없으며, 결국 모든 직사각형이 사라질 것이다. 사실, 애니메이션이 프레임 15에 도달하면 새로운 직사각형이 그리기 영역의 바깥쪽에 나타나야 하지만 — 이는 실제로는 "새로운 직사각형"이 아니라, 바깥쪽 직사각형의 inset 이 0으로 되돌아가는 것뿐이다. 그래서 애니메이션이 진행되면서 인셋은 0, 1, 2, ..., 14 값들의 순서를 반복해서 거쳐야 한다. 다음을 설정하여 이를 매우 쉽게 이룰 수 있다: inset = frameNumber % 15; 마지막으로, 첫 번째 직사각형은 해당 직사각형 바깥쪽 주변의 inset 크기의 테두리를 제외하고 그리기 영역을 채운다는 점에 유의하라. 즉, 직사각형의 폭은 그리기 영역의 폭에서 인셋의 2배를 뺀 값이며, 높이도 이와 마찬가지다. 이동하는 직사각형 예제를 위한 drawFrame() 서브루틴이 여기에 있다: public void drawFrame(GraphicsContext g, int frameNumber, double elapsedSeconds, int width, int height) { g.setFill(Color.WHITE); g.fillRect(0,0,width,height); // Fill drawing area with white. double inset; // Gap between edges of drawing area and outer rectangle. double rectWidth, rectHeight; // The size of one of the rectangles. g.setStroke(Color.BLACK); // Draw the rectangle outlines in black. inset = frameNumber % 15 + 0.5; // (The 0.5 is a technicality that gives // a sharper picture.) rectWidth = width - 2*inset; rectHeight = height - 2*inset; while (rectWidth >= 0 && rectHeight >= 0) { g.strokeRect(inset, inset, rectWidth, rectHeight); inset += 15; // rectangles are 15 pixels apart rectWidth -= 30; rectHeight -= 30; } }
프로그램의 전체 소스 코드는 샘플 프로그램 MovingRects.java에서 찾을 수 있다. 한 번 보라! 훌륭한 효과일 것이다. 애니메이션의 다른 예제는 샘플 프로그램 RandomCircles.java를 참고하라. 해당 프로그램은 각 프레임의 그림에 무작위로 색칠된 원형 하나를 추가한다; 이는 다음 프레임이 그려지기 전에 한 프레임의 이미지가 자동으로 지워지지는 않는다는 사실을 보여준다.
제3장 끝
자바 Gui 프로그래밍 개요 | Swing 기본 | Java 프로그래밍 | java gui 프로그래밍 오늘 업데이트
We are using cookies to give you the best experience on our website.
You can find out more about which cookies we are using or switch them off in settings.
JAVA Programming 1 9 GUI AWT SWING 4
명품 JAVA Programming 1 제 9 장 자바 GUI 기초, AWT와 스윙(SWING)
스윙 컴포넌트 예시 4 JButton JCheck. Box JText. Field JRadio. Button JPassword. Field JSlider JSpinner JText. Area JCombo. Box JList
JProgress. Bar JTool. Tip JScroll. Pane JMenu JDialog 5 JApplet JFrame
JTable JTree 6 JEditor. Pane and JText. Pane
JTool. Bar JSplit. Pane JTabbed. Pane 7
Swing 으로 만든 GUI 프로그램 샘플 8 JButton JLabel JText. Field 프레임 윈도우 닫기 버튼 JFrame JMenu. Bar JMenu JTool. Bar JCombo. Box JList JLabel JScroll. Pane JSplit. Pane
GUI 라이브러리 계층 구조 Object Font Componen t Font. Metrics Button Text. Componen t Label Canva s Choic e List Checkbo x JScroll. Bar JCompone nt JCombo. B ox JLayered. Pan e JPanel JEditor. Pan e JTabbed. Pan e JSplit. Pane JSeparator JRoot. Pane JTool. Bar JTool. Tip JColor. Choos er JTree JProgress. Ba r JSpinne r JPopup. Men u JTable JFile. Chooser JTable. Head er JScroll. Pan e JInternal. Fra me Graphics Panel Window Applet Frame Dialog JApplet JFrame JDialog Abstract. Butto n JText. Component JSlider JOption. Pan e JMenu. Bar 9 JList AWT 클래스 Color Container Scrollbar Swing 클래스 JLabel Dimension JText. Field JText. Area JPassword. Fie ld JMenu. Ite m JButton JToggle. Butto n JCheck. Bo x JMenu JCheck. Box. Menu. It em JRadio. Button. Menu. It em JRadio. Butto n
타이틀 프레임 만들기 15 두 가지 방법 300 픽셀 • • main() 메소드에서 JFrame 객체를 생성 확장성, 융통성 결여 • • JFrame 을 상속받은 프레임 클래스 이용 main() 은 단순히 프레임 객체를 생성하는 역할 import javax. swing. *; public class My. App { public static void main(String [] args) { JFrame f = new JFrame(); f. set. Title(“첫번째 프레임”); f. set. Size(300, 300); f. set. Visible(true); } } public class My. Frame extends JFrame { My. Frame() { set. Title(“첫번째 프레임”); set. Size(300, 300); set. Visible(true); } 방법 1. main() 메소드에서 JFrame 객체 생성 추천 } public static void main(String [] args) { My. Frame mf = new My. Frame(); } 방법 2. JFrame 을 상속받은 프레임 클래스 이용
main()의 위치 16 추천 import javax. swing. *; public class My. Frame extends JFrame { My. Frame() { set. Title(“첫번째 프레임”); set. Size(300, 300); set. Visible(true); } } public class My. App { public static void main(String [] args) { My. Frame mf = new My. Frame(); } } } public static void main(String [] args) { My. Frame mf=new My. Frame(); } main()을 프레임 클래스 내의 멤버로 작성 main()을 가진 다른 클래스 My. App 작성
프레임에 컴포넌트 붙이기 17 타이틀 – 타이틀 바에 부착 // JFrame의 생성자 이용 JFrame frame = new JFrame(“타이틀문자열”); // JFrame의 set. Title() 메소드 호출 frame. set. Title(“타이틀문자열”); JFrame frame = new JFrame(); 컨텐트팬 알아내기 스윙 컴포넌트 – 컨텐트 팬에 부착 컨텐트팬에 컴포넌트 달기 컨텐트팬 변경 Container content. Pane = frame. get. Content. Pane(); JFrame frame = new JFrame(); JButton b = new JButton(“Click”); Container c = frame. get. Content. Pane(); c. add(b); JPanel p = new JPanel(); frame. set. Content. Pane(p);
예제 9 -1 : 컴포넌트를 부착한 프레임 예 19 import javax. swing. *; import java. awt. *; public class Content. Pane. Ex extends JFrame { Content. Pane. Ex() { set. Title(“Content. Pane과 JFrame”); set. Default. Close. Operation(JFrame. EXIT_ON_CLOSE); Container content. Pane = get. Content. Pane(); content. Pane. set. Background(Color. ORANGE); content. Pane. set. Layout(new Flow. Layout()); content. Pane. add(new JButton(“OK”)); content. Pane. add(new JButton(“Cancel”)); content. Pane. add(new JButton(“Ignore”)); } } set. Size(350, 150); set. Visible(true); public static void main(String[] args) { new Content. Pane. Ex(); }
컨테이너와 배치관리자 24 컨테이너의 디폴트 배치관리자 � 컨테이너는 생성시 디폴트 배치관리자 설정 컨테이너에 새로운 배치관리자 설정 � Container. set. Layout(Layout. Manager lm) lm을 새로운 배치관리자로 설정 // JPanel 패널에 Border. Layout 배치관리자를 설정 하는 예 JPanel p = new JPanel(); p. set. Layout(new Border. Layout()); JFrame frame = new JFrame(); Container c = frame. get. Conent. Pane(); // 프레임의 컨텐트팬 c. set. Layout(new Flow. Layout()); // 컨텐트팬에 Flow. Layout 설정 혹은 frame. set. Layout(new Flow. Layout()); // JDK 1. 5 이후 버전에서
Flow. Layout 25 배치방법 � 컨테이너 공간 내에 왼쪽에서 오른쪽으로 배치 다시 위에서 아래로 순서대로 컴포넌트를 배치한다. container. set. Layout(new Flow. Layout()); container. add(new JButton(“add”)); container. add(new JButton(“sub”)); container. add(new JButton(“mul”)); container. add(new JButton(“div”)); container. add(new JButton(“Calculate”));
예제 9 -2 : LEFT로 정렬되는 수평 간격이 30 픽 셀, 수직 간격이 40 픽셀인 Flow. Layout 사용 예 28 import javax. swing. *; import java. awt. *; public class Flow. Layout. Ex extends JFrame { Flow. Layout. Ex() { set. Title(“Flow. Layout Sample”); set. Default. Close. Operation(JFrame. EXIT_ON_CLOSE); set. Layout(new Flow. Layout(Flow. Layout. LEFT, 30, 40)); add(new JButton(“add”)); add(new JButton(“sub”)); add(new JButton(“mul”)); add(new JButton(“div”)); add(new JButton(“Calculate”)); } } v. Gap, 40 픽셀 set. Size(300, 250); set. Visible(true); public static void main(String[] args) { new Flow. Layout. Ex(); } h. Gap , 30 픽셀 Flow. Layout. LEFT로 정렬됨
Border. Layout 29 배치방법 � 컨테이너 공간을 5 구역으로 분할, 배치 � East, West, South, North, Center 배치 방법 add(Component comp, int index) � comp를 index의 공간에 배치 컨테이너의 크기가 변하면 재배치 Border. Layout. NORTH Border. Layout. WEST container. set. Layout(new Border. Layout()); container. add(new JButton(“div”), Border. Layout. WEST); container. add(new JButton(“Calculate”), Border. Layout. CENTER); Border. Layout. EAST Border. Layout. SOUTH Border. Layout. CENTER
예제 9 -3 : Border. Layout 사용 예 32 import javax. swing. *; import java. awt. *; public class Border. Layout. Ex extends JFrame { Border. Layout. Ex() { set. Title(“Border. Layout Sample”); set. Default. Close. Operation(JFrame. EXIT_ON_CLOSE); set. Layout(new Border. Layout()); add(new JButton(“add”), Border. Layout. NORTH); add(new JButton(“sub”), Border. Layout. SOUTH); add(new JButton(“mul”), Border. Layout. EAST); add(new JButton(“div”), Border. Layout. WEST); add(new JButton(“Calculate”), Border. Layout. CENTER); } } set. Size(300, 200); set. Visible(true); public static void main(String[] args) { new Border. Layout. Ex(); }
예제 9 -4 : Grid. Layout으로 입력 폼 만들기 35 import javax. swing. *; import java. awt. *; 두 행 사이의 수직 간격 v. Gap이 5 픽셀로 설정됨 public class Grid. Layout. Ex extends JFrame { Grid. Layout. Ex() { set. Title(“Grid. Layout Sample”); set. Default. Close. Operation(JFrame. EXIT_ON_CLOSE); Grid. Layout grid = new Grid. Layout(4, 2); grid. set. Vgap(5); set. Layout(grid); add(new JLabel(” 이름”)); add(new JText. Field(“”)); add(new JLabel(” 학번”)); add(new JText. Field(“”)); add(new JLabel(” 학과”)); add(new JText. Field(“”)); add(new JLabel(” 과목”)); add(new JText. Field(“”)); } } set. Size(300, 200); set. Visible(true); public static void main(String[] args) { new Grid. Layout. Ex(); }
키워드에 대한 정보 java gui 프로그래밍
다음은 Bing에서 java gui 프로그래밍 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 자바 스윙1: 프레임과 페널 JFrame and JPanel
- JFrame
- jPanel
- 자바 스윙
- 자바
- 자바 프레임
- 자바 페널
- 자바 패널
- 스윙
- 프로그래밍
- 자바 기초
- 보여지는
- 멋진
- 자바 기초 스윙
- 자바 프로그램 만들기
- 코딩
- coding
자바 #스윙1: #프레임과 #페널 #JFrame #and #JPanel
YouTube에서 java gui 프로그래밍 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 자바 스윙1: 프레임과 페널 JFrame and JPanel | java gui 프로그래밍, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.