명품 JAVA Essential 1
2 학습목표 1. 이벤트기반 GUI 프로그래밍이해 2. 자바 GUI 패키지이해 3. 스윙으로 GUI 프로그램작성 4. 컨테이너와컴포넌트, 배치 5. FlowLayout 배치관리자활용 6. BorderLayout 배치관리자활용 7. GridLayout 배치관리자활용 8. 배치관리자없는컨테이너만들기
자바의 GUI(Graphical User Interface) 3 GUI 응용프로그램 GUI 사용자가편리하게입출력할수있도록그래픽으로화면을구성하고, 마우스나키보드로입력받을수있도록지원하는사용자인터페이스자바언어에서 GUI 응용프로그램작성 AWT와 Swing 패키지에강력한 GUI 컴포넌트제공 쉬운 GUI 프로그래밍 AWT 와 Swing 패키지 AWT(Abstract Windowing Toolkit) 패키지 자바가처음나았을때부터배포된 GUI 패키지, 최근에는거의사용하지않음 AWT 컴포넌트는중량컴포넌트 (heavy weight component) AWT 컴포넌트의그리기는운영체제에의해이루어지며, 운영체제에의자원을많이소모하고부담을줌 운영체제가직접그리기때문에속도는빠름 Swing 패키지 AWT 기술을기반으로작성된자바라이브러리 모든 AWT 기능 + 추가된풍부하고화려한고급컴포넌트 AWT 컴포넌트를모두스윙으로재작성. AWT 컴포넌트이름앞에 J자를덧붙임 순수자바언어로구현 스윙컴포넌트는경량컴포넌트 (light weight component) 스윙컴포넌트는운영체제의도움을받지않고직접그리기때문에운영체제에부담주지않음 현재자바의 GUI 로사용됨
스윙컴포넌트예시 4 JButton JCheckBox JRadioButton JSlider JTextField JPasswordField JSpinner JTextArea JComboBox JList
JProgressBar JToolTip JMenu JScrollPane JDialog JApplet JFrame 5
JTable 6 JTree JEditorPane and JTextPane
JToolBar JSplitPane JTabbedPane 7
오라클에서제공하는스윙데모 8 스윙데모사이트 http://www.oracle.com/technetwork/java/javase/downloads/index.html Demos and Samples 다운로드 스윙데모실행사례 C:\Program Files\Java\ jdk1.8.0_05\demo\jfc\ SwingSet2 SwingSet2.jar 파일더블클릭 다양한스윙컴포넌트실행 소스코드제공
스윙 GUI 프로그램샘플 9 스윙응용프로그램은스윙컴포넌트를이용하여레고블록을조립하듯이작성
GUI 패키지계층구조 Object Font FontMetrics Component Dimension Color Graphics AWT 클래스 Button Label TextComponent Container List Canvas Scrollbar Panel Window Checkbox Choice Applet Frame Dialog Swing 클래스 JComponent JApplet JFrame JDialog JLabel JList JComboBox JSlider JTextComponent AbstractButton JScrollBar JPanel JLayeredPane JEditorPane JTextField JTextArea JOptionPane JTabbedPane JSplitPane JSeparator JRootPane JToolBar JPasswordField JMenuItem JButton JToggleButton JMenuBar JToolTip JPopupMenu JFileChooser JMenu JCheckBox JColorChooser JTree JTable JTableHeader JCheckBoxMenuItem JRadioButton JProgressBar JSpinner JScrollPane JInternalFrame JRadioButtonMenuItem 10
컨테이너와컴포넌트 11 컨테이너 다른컴포넌트를포함할수있는 GUI 컴포넌트 java.awt.container를상속받음다른컨테이너에포함될수있음 AWT 컨테이너 : Panel, Frame, Applet, Dialog, Window Swing 컨테이너 : JPanel JFrame, JApplet, JDialog, JWindow 컴포넌트 컨테이너에포함되어야화면에출력될수있는 GUI 객체다른컴포넌트를포함할수없는순수컴포넌트모든 GUI 컴포넌트가상속받는클래스 : java.awt.component 스윙컴포넌트가상속받는클래스 : javax.swing.jcomponent 최상위컨테이너 다른컨테이너에포함되지않고도화면에출력되며독립적으로존재가능한컨테이너 스스로화면에자신을출력하는컨테이너 : JFrame, JDialog, JApplet
컨테이너와컴포넌트의포함관계 12 컴포넌트 컨테이너 컨테이너 컨테이너 최상위컨테이너를바닥에깔고, 그위에컨테이너를놓고, 다시컴포넌트를쌓아가는방식, 즉레고블록을쌓는듯이 GUI 프로그램을작성한다.
스윙 GUI 프로그램만들기 13 스윙 GUI 프로그램을만드는과정 1. 스윙프레임만들기 2. main() 메소드작성 3. 스윙프레임에스윙컴포넌트붙이기 스윙프로그램작성에필요한 import 문 import java.awt.*; // 그래픽처리를위한클래스들의경로명 import java.awt.event.*; // AWT 이벤트사용을위한경로명 import javax.swing.*; // 스윙컴포넌트클래스들의경로명 import javax.swing.event.*; // 스윙이벤트를위한경로명
스윙프레임 14 스윙프레임 : 모든스윙컴포넌트를담는최상위컨테이너 JFrame을상속받아구현컴포넌트들은화면에보이려면스윙프레임에부착되어야함 프레임을닫으면프레임에부착된모든컴포넌트가보이지않게됨 스윙프레임 (JFrame) 기본구성 프레임 스윙프로그램의기본틀메뉴바 메뉴들이부착되는공간컨텐트팬 GUI 컴포넌트들이부착되는공간 타이틀바를가진 Frame JFrame 메뉴바 Menu Bar Frame 컨텐트팬 : 화면에출력될모든컴포넌트들이부착되는공간 Content Pane
프레임만들기, JFrame 클래스상속 15 스윙프레임 JFrame 클래스를상속받은클래스작성프레임의크기반드시지정 : setsize() 호출프레임을화면에출력하는코드반드시필요 : setvisible(true) 호출 JFrame 을상속받은 MyFrame 작성 생성자에서타이틀설정 import javax.swing.*; public class MyFrame extends JFrame { MyFrame() { settitle(" 첫번째프레임 "); 타이틀 생성자에서프레임크기지정 생성자에서프레임이화면에출력되도록지정 MyFrame 객체즉스윙프레임생성 setsize(300, 300); setvisible(true); public static void main(string [] args) { MyFrame mf = new MyFrame(); 300 픽셀 300 픽셀
예제 8-1 : 300x300 크기의스윙프레임만들기 16 300 300 크기의스윙프레임을만들어라. import javax.swing.*; public class MyFrame extends JFrame { MyFrame() { settitle("300x300 스윙프레임만들기 "); setsize(300,300); // 프레임크기 300x300 setvisible(true); // 프레임출력 public static void main(string[] args) { MyFrame frame = new MyFrame();
스윙응용프로그램에서 main() 의기능과위치 17 스윙응용프로그램에서 main() 의기능최소화바람직 스윙응용프로그램이실행되는시작점으로서의기능만 스윙프레임을생성하는정도의코드로최소화 public static void main(string [] args) { MyFrame frame = new MyFrame(); // 스윙프레임생성
프레임에컴포넌트붙이기 18 타이틀달기 super() 나 settitle() 이용 MyFrame() { // 생성자 super(" 타이틀문자열 "); MyFrame() { // 생성자 settitle(" 타이틀문자열 "); 컨텐트팬에컴포넌트달기 컨텐트팬이란? - 스윙컴포넌트들이부착되는공간 컨텐트팬알아내기 스윙프레임에붙은디폴트컨텐트팬알아내기 컨텐트팬에컴포넌트붙이기 컨텐트팬변경 public class MyFrame extends JFrame { MyFrame() {... // 프레임의컨텐트팬을알아낸다. Container contentpane = getcontentpane();... // 버튼컴포넌트생성 JButton button = new JButton("Click"); contentpane.add(button); // 컨텐트팬에버튼부착 class MyPanel extends JPanel {... // JPanel 을상속받은패널을구현한다. // frame 의컨텐트팬을 MyPanel 객체로변경 frame.setcontentpane(new MyPanel());
컨텐트팬에대한 JDK 1.5 이후의추가사항 19 JDK 1.5 이전 프레임의컨텐트팬을알아내어반드시컨텐트팬에컴포넌트부착 Container c = frame.getcontentpane(); c.add(new JButton("Click")); // 컨텐트팬에직접컴포넌트부착 JDK 1.5 이후추가된사항 프레임에컴포넌트를부착하면프레임이대신컨텐트팬에부착 frame.add(new JButton("Click")); // 프레임이버튼컴포넌트를컨텐트팬에대신부착 저자의결론 JDK1.5 이전처럼직접컨텐트팬에컴포넌트를부착하는것이바람직함 컨텐트팬다루기능력필요하기때문
예제 8-2 : 3 개의버튼컴포넌트를가진스윙프레임만들기 20 다음그림과같이콘텐트팬의배경색을오렌지색으로하고, OK, Cancel, Ignore 버튼을부착한스윙프로그램을작성하라. import javax.swing.*; import java.awt.*; public class ContentPaneEx extends JFrame { ContentPaneEx() { settitle("contentpane 과 JFrame 예제 "); // 프레임의타이틀달기 setdefaultcloseoperation(jframe.exit_on_close); Container contentpane = getcontentpane(); // 컨텐트팬알아내기 contentpane.setbackground(color.orange); // 오렌지색배경설정 contentpane.setlayout(new FlowLayout()); // 컨텐트팬에 FlowLayout // 배치관리자달기 FlowLayout 의배치관리자는뒤에서배울내용으로서, 컴포넌트를순서대로부착하는일을맡은객체 contentpane.add(new JButton("OK")); // OK 버튼달기 contentpane.add(new JButton("Cancel")); // Cancel 버튼달기 contentpane.add(new JButton("Ignore")); // Ignore 버튼달기 setsize(300, 150); // 프레임크기 300x150 설정 setvisible(true); // 화면에프레임출력 public static void main(string[] args) { new ContentPaneEx();
스윙응용프로그램의종료 21 응용프로그램내에서스스로종료하는방법 System.exit(0); 언제어디서나무조건종료 프레임의오른쪽상단의종료버튼 (X) 이클릭되면어떤일이일어나는가? 프레임종료, 프레임윈도우를닫음 프레임이화면에서보이지않게됨프레임이보이지않게되지만응용프로그램이종료한것아님 키보드나마우스입력을받지못함 다시 setvisible(true) 를호출하면, 보이게되고이전처럼작동함 프레임종료버튼이클릭될때, 프레임과함께프로그램을종료시키는방법 frame.setdefaultcloseoperation(jframe.exit_on_close);
컨테이너와배치, 배치관리자개념 22 컨테이너의배치관리자 컨테이너마다하나의배치관리자존재 컨테이너에부착되는컴포넌트의위치와크기결정 컨테이너의크기가변경되면, 컴포넌트의위치와크기재결정 컨테이너 (Container) 이쪽으로가세요. 배치관리자 (Layout Manager) 컴포넌트 (Component)
배치관리자대표유형 4 가지 23 FlowLayout 배치관리자 컴포넌트가삽입되는순서대로왼쪽에서오른쪽으로배치 배치할공간이없으면아래로내려와서반복한다. BorderLayout 배치관리자 컨테이너의공간을동 (EAST), 서 (WEST), 남 (SOUTH), 북 (NORTH), 중앙 (CENTER) 의 5 개영역으로나눔 5 개영역중응용프로그램에서지정한영역에컴포넌트배치 GridLayout 배치관리자 컨테이너를프로그램에서설정한동일한크기의 2 차원격자로나눔 컴포넌트는삽입순서대로좌에서우로, 다시위에서아래로배치 CardLayout 컨테이너의공간에카드를쌓아놓은듯이컴포넌트를포개어배치
배치관리자대표유형 4 가지 24 java.awt 패키지에구현되어있음 FlowLayout BorderLayout 이쪽으로가세요. 이쪽으로가세요. GridLayout CardLayout 이쪽으로가세요. 이쪽으로가세요.
컨테이너와디폴트배치관리자 25 컨테이너의디폴트배치관리자 컨테이너생성시자동으로생성되는배치관리자
컨테이너에새로운배치관리자설정 26 컨테이너에새로운배치관리자설정 setlayout(layoutmanager lm) 메소드호출 lm 을새로운배치관리자로설정 사례 JPanel 컨테이너에 BorderLayout 배치관리자를설정하는예 JPanel p = new JPanel(); p.setlayout(new BorderLayout()); // JPanel 에 BorderLayout 설정 컨텐트팬의배치관리자를 FlowLayout 배치관리자로설정 Container c = frame.getconentpane(); // 프레임의컨텐트팬알아내기 c.setlayout(new FlowLayout()); // 컨텐트팬에 FlowLayout 설정 오류 c.setlayout(flowlayout); // 오류
FlowLayout 배치관리자 27 배치방법 컴포넌트를컨테이너내에왼쪽에서오른쪽으로배치 다시위에서아래로순서대로배치 container.setlayout(new FlowLayout()); 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"));
FlowLayout 의생성자 28 생성자 FlowLayout() FlowLayout(int align, int hgap, int vgap) align : 컴포넌트를정렬하는방법지정. 왼쪽정렬 (FlowLayout.LEFT), 오른쪽정렬 (FlowLayout.RIGHT), 중앙정렬 (FlowLayout.CENTER( 디폴트 )) hgap : 좌우두컴포넌트사이의수평간격, 픽셀단위. 디폴트는 5 vgap : 상하두컴포넌트사이의수직간격, 픽셀단위. 디폴트는 5 vgap hgap FlowLayout.LEFT 로정렬됨
예제 8-3 : FlowLayout 배치관리자활용 29 FlowLayout 배치관리자를사용하여다음그림과같이 5 개의버튼을배치하라. import javax.swing.*; import java.awt.*; vgap, 40 픽셀 public class FlowLayoutEx extends JFrame { FlowLayoutEx() { settitle("flowlayout 예제 "); setdefaultcloseoperation(jframe.exit_on_close); Container contentpane = getcontentpane(); // 컨텐트팬알아내기 hgap, 30 픽셀 FlowLayout.LEFT 로정렬됨 // 왼쪽정렬로, 수평간격을 30, 수직간격을 40 픽셀로배치하는 // FlowLayout 생성 contentpane.setlayout(new FlowLayout(FlowLayout.LEFT, 30, 40)); contentpane.add(new JButton("add")); contentpane.add(new JButton("sub")); contentpane.add(new JButton("mul")); contentpane.add(new JButton("div")); contentpane.add(new JButton("Calculate")); setsize(300, 200); // 프레임크기 300x200 설정 setvisible(true); // 화면에프레임출력 public static void main(string[] args) { new FlowLayoutEx();
BorderLayout 배치관리자 30 배치방법 컨테이너공간을 5 구역으로분할, 배치 동, 서, 남, 북, 중앙 배치방법 add(component comp, int index) comp 를 index 의공간에배치 BorderLayout.NORTH BorderLayout.EAST container.setlayout(new BorderLayout()); container.add(new JButton("div"), BorderLayout.WEST); container.add(new JButton("Calculate"), BorderLayout.CENTER); BorderLayout.WEST BorderLayout.SOUTH BorderLayout.CENTER
BorderLayout 생성자와 add() 메소드 31 생성자 BorderLayout() BorderLayout(int hgap, int vgap) hgap : 좌우두컴포넌트사이의수평간격, 픽셀단위 ( 디폴트 : 0) vgap : 상하두컴포넌트사이의수직간격, 픽셀단위 ( 디폴트 : 0) add() 메소드 void add(component comp, int index) comp 컴포넌트를 index 위치에삽입한다. index : 컴포넌트의위치동 : BorderLayout.EAST 서 : BorderLayout.WEST 남 : BorderLayout.SOUTH 북 : BorderLayout.NORTH 중앙 : BorderLayout.CENTER
예제 8-4 : BorderLayout 배치관리자활용 32 BorderLayout 배치관리자를사용하여다음그림과같이 5 개의버튼을배치하라. import javax.swing.*; import java.awt.*; vgap, 20 픽셀 public class BorderLayoutEx extends JFrame { BorderLayoutEx() { settitle("borderlayout 예제 "); setdefaultcloseoperation(jframe.exit_on_close); Container contentpane = getcontentpane(); // 컨텐트팬알아내기 hgap, 30 픽셀 // 컨텐트팬에 BorderLayout 배치관리자설정 contentpane.setlayout(new BorderLayout(30, 20)); contentpane.add(new JButton("Calculate"), BorderLayout.CENTER); contentpane.add(new JButton("add"), BorderLayout.NORTH); contentpane.add(new JButton("sub"), BorderLayout.SOUTH); contentpane.add(new JButton("mul"), BorderLayout.EAST); contentpane.add(new JButton("div"), BorderLayout.WEST); setsize(300, 200); // 프레임크기 300x200 설정 setvisible(true); // 프레임을화면에출력 public static void main(string[] args) { new BorderLayoutEx();
GridLayout 배치관리자 33 배치방법 컨테이너공간을동일한사각형격자 ( 그리드 ) 로분할하고각셀에컴포넌트하나씩배치 생성자에행수와열수지정 셀에왼쪽에서오른쪽으로, 다시위에서아래로순서대로배치 container.setlayout(new GridLayout(4,3,5,5)); // 4 3 분할로컴포넌트배치 container.add(new JButton("1")); // 상단왼쪽첫번째셀에버튼배치 container.add(new JButton("2")); // 그옆셀에버튼배치 4x3 그리드레이아웃설정 총 11 개의버튼이순서대로 add 됨 수직간격 vgap : 5 픽셀 수평간격 hgap : 5 픽셀
GridLayout 생성자 34 생성자 GridLayout() GridLayout(int rows, int cols) GridLayout(int rows, int cols, int hgap, int vgap) rows : 격자의행수 ( 디폴트 : 1) cols : 격자의열수 ( 디폴트 : 1) hgap : 좌우두컴포넌트사이의수평간격, 픽셀단위 ( 디폴트 : 0) vgap : 상하두컴포넌트사이의수직간격, 픽셀단위 ( 디폴트 : 0) rows x cols 만큼의셀을가진격자로컨테이너공간을분할, 배치
예제 8-5 : GridLayout 배치관리자를사용하는예 35 GridLayout 을활용하여다음그림과같이한줄에 10 개의버튼을동일한크기로배치하는스윙프로그램을작성하라. import java.awt.*; import javax.swing.*; public class GridLayoutEx extends JFrame { public GridLayoutEx() { super("gridlayout 예제 "); setdefaultcloseoperation(jframe.exit_on_close); Container contentpane = getcontentpane(); // 1x10 의 GridLayout 배치관리자 contentpane.setlayout(new GridLayout(1, 10)); for(int i=0; i<10; i++) { // 10개의버튼부착 String text = Integer.toString(i); // i를문자열로변환 JButton button = new JButton(text); contentpane.add(button); // 컨텐트팬에버튼부착 setsize(500, 200); setvisible(true); public static void main(string[] args) { new GridLayoutEx();
배치관리자없는컨테이너 36 배치관리자가없는컨테이너가필요한경우 응용프로그램에서직접컴포넌트의크기와위치를결정하고자하는경우 1. 컴포넌트의크기나위치를개발자임의로결정하고자하는경우 2. 게임프로그램과같이시간이나마우스 / 키보드의입력에따라컴포넌트들의위치와크기가수시로변하는경우 3. 여러컴포넌트들이서로겹쳐출력하고자하는경우 컨테이너의배치관리자제거방법 container.setlayout(null); JPanel p = new JPanel(); p.setlayout(null); // JPanel 의배치관리자삭제 컨테이너의배치관리자가없어지면, 컴포넌트에대한어떤배치도없음 추가된컴포넌트의크기가 0 으로설정, 위치는예측할수없게됨 // 패널 p 에는배치관리자가없으면아래두버튼은배치되지않는다. p.add(new JButton("click")); // 폭과높이가 0 인상태로화면에보이지않는다. p.add(new JButton("me!")); // 폭과높이가 0 인상태로화면에보이지않는다.
컴포넌트의절대위치와크기설정 37 배치관리자가없는컨테이너에컴포넌트를삽입할때 프로그램에서컴포넌트의절대크기와위치설정컴포넌트들이서로겹치게할수있음 컴포넌트의크기와위치설정메소드 void setsize(int width, int height) // 컴포넌트크기설정 void setlocation(int x, int y) // 컴포넌트위치설정 void setbounds(int x, int y, int width, int height) // 위치와크기동시설정 예 ) 버튼을 100 40 크기로하고, JPanel 의 (50, 50) 위치에배치 JPanel p = new JPanel(); p.setlayout(null); // 패널 p 의배치관리자제거 JButton clickbutton = new JButton("Click"); clickbutton.setsize(100, 40); // 버튼크기를 100 40으로지정 clickbutton.setlocation(50, 50); // 버튼위치를 (50, 50) 으로지정 p.add(clickbutton); // 패널내 (50, 50) 에 100 40 크기의버튼출력
38 예제 8-6 : 배치관리자없는컨테이너에컴포넌트를절대위치와절대크기로지정 다음그림과같이컨텐트팬에배치관리자를삭제하고 9 개의버튼과하나의문자열을출력하는프로그램을작성하라. import javax.swing.*; import java.awt.*; public class NullContainerEx extends JFrame { NullContainerEx() { settitle(" 배치관리자없이절대위치에배치하는예제 "); setdefaultcloseoperation(jframe.exit_on_close); Container contentpane = getcontentpane(); contentpane.setlayout(null); // 컨텐트팬의배치관리자제거 JLabel la = new JLabel("Hello, Press Buttons!"); la.setlocation(130, 50); // la 를 (130,50) 위치로지정 la.setsize(200, 20); // la 를 200x20 크기로지정 contentpane.add(la); // la 를컨텐트팬에부착 // 9개의버튼컴포넌트를생성하고동일한크기로설정한다. // 위치는서로겹치게설정한다. for(int i=1; i<=9; i++) { JButton b = new JButton(Integer.toString(i)); // 버튼생성 b.setlocation(i*15, i*15); // 버튼의위치설정 b.setsize(50, 20); // 버튼의크기는동일하게 50x20 contentpane.add(b); // 버튼을컨텐트팬에부착 setsize(300, 200); setvisible(true); public static void main(string[] args) { new NullContainerEx();