13 장. 스윙사용방법 학습목표 레이아웃관리자 스윙구성요소 비트박스프로그램
스윙을알아봅시다
스윙구성요소 구성요소 (Component) 위젯 (widget) 이라고도부름 GUI에집어넣는모든것 텍스트필드, 버튼, 스크롤목록, 라디오버튼등 javax.swing.jcomponent 의하위클래스 대화형구성요소, 배경구성요소로나뉨 JButton JFrame JPanel JCheckBox JTextField
레이아웃관리자 레이아웃관리자 (layout manager) 특별한구성요소와연관된객체 구성요소내부에들어있는구성요소들을제어함 각배경구성요소마다레이아웃관리자가있음 종류에따라다른정책을사용함 JPanel panela = new JPanel(); JPanel panelb = new JPanel(); panelb.add(new JButton( button 1 )); panelb.add(new JButton( button 2 )); panelb.add(new JButton( button 3 )); panela.add(panelb); button 1 button 2 button 3 다중레이아웃
배치과정 1. 패널을만들고버튼추가 2. 각버튼의크기확인 ( 패널레이아웃관리자 ) 3. 크기수락여부결정 ( 패널레이아웃관리자 ) 4. 패널을프레임에추가 5. 패널의크기확인 ( 프레임레이아웃관리자 ) 6. 크기수락여부결정 ( 프레임레이아웃관리자 )
대표적인레이아웃관리자 BorderLayout 다섯개의지역 각지역마다하나씩의구성요소가들어감 프레임의기본레이아웃관리자 FlowLayout 왼쪽맞춤형태로왼쪽에서오른쪽으로, 위에서아래로배치됨 패널의기본레이아웃관리자 BoxLayout 수직또는수평방향으로배치
BorderLayout 북쪽 (NORTH) 서쪽 (WEST) 중앙 (CENTER) 동쪽 import javax.swing.*; import java.awt.*; (EAST) public class Button1 { public static void main(string[] args) { Button1 gui = new Button1(); gui.go(); } public void go() { JFrame frame = new JFrame(); JButton button = new JButton( click me ); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.getcontentpane().add(borderlayout.east, button); frame.setsize(200, 200); frame.setvisible(true); } } 남쪽 (SOUTH)
FlowLayout 워드프로세처럼왼쪽에서오른쪽으로, 위에서아래로추가된순서대로배치 import javax.swing.*; import java.awt.*; public class Panel1 { public static void main(string[] args) { Panel1 gui = new Panel1(); gui.go(); } public void go() { JFrame frame = new JFrame(); JPanel panel = new JPanel(); panel.setbackground(color.darkgray); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.getcontentpane().add(borderlayout.east, panel); frame.setsize(200, 200); frame.setvisible(true); } }
BoxLayout 수직방향으로추가된순서대로배치
바보같은질문은없습니다 왜패널에하는것처럼프레임에바로위젯을추가하지않나요? JFrame 은화면에뭔가를표시하기위한받침대역할을합니다. 다른스윙구성요소는순수한자바로만들어져있지만 JFrame 은디스플레이를직접접근해야하므로원시코드를사용합니다. JFrame 은창틀, 내용틀은그안에들어가는유리라고생각하면됩니다. myframe.setcontentpane(mypanel);
바보같은질문은없습니다 프레임의레이아웃관리자를바꿀수있나요? 프레임에서 BorderLayout 대신 FlowLayout 을쓰려면어떻게해야하나요? 가장쉬운방법은패널을만들고패널안에원하는 GUI 를만든다음앞에나온것과같은코드를써서그패널을프레임의내용틀로만드는방법입니다.
바보같은질문은없습니다 레이아웃관리자를쓰지않는방법은없나요? 구성요소마다 setlayout(null) 을호출하고정확한위치와크기를직접지정해도됩니다. 장기적인관점에서볼때레이아웃관리자를사용하는편이훨씬쉽습니다.
JTextField JTextField JTextField field = new JTextField(20); JTextField field = new JTextField( Your name ); System.out.println(field.getText()); field.settext( whatever ); field.settext( ); field.addactionlistener(myactionlistener); field.selectall(); field.requestfocus();
JTextArea JTextArea JTextArea text = new JTextArea(10, 20); JScrollPane scrollbar = new JScrollPane(text); text.setlinewrap(true); scroller.setverticalscrollbarpolicy(scrollpaneconstants.vertical_scrollba R_ALWAYS); scroller.sethorizontalscrollbarpolicy(scrollpaneconstants.horitontal_scr OLLBAR_NEVER); panel.add(scroller); text.settext( 새로넣을내용 ); text.append( button clicked ); text.selectall(); text.requestfocus();
JCheckBox JCheckBox JCheckBox check = new JCheckBox( Goes to 11 ); check.additemlistener(this); public void itemstatechanged(itemevent ev) { String onoroff = off ; if (Check.isSelected()) onoroff = on ; System.out.println( Check box is + onoroff); } check.setselected(true); check.setselected(false);
JList JList String[] listentries = { alpha, beta, gamma, delta, epsilon, zeta, eta, theta }; list = new JList(listEntries); JScrollPane scroller = new JScrollPane(list); scroller.setverticalscrollbarpolicy(scrollpaneconstants.vertical_scrollba R_ALWAYS); scroller.sethorizontalscrollbarpolicy(scrollpaneconstants.horizontal_scr OLLBAR_NEVER); panel.add(scroller); list.setvisiblerowcount(4);
JList JList list.setselectionmode(listselectionmodel.single_selection); list.addlistsectionlistener(this); public void valuechanged(listselectionevent lse) { if (!lse.getvalueisadjusting()) { String selection = (String) list.getselectedvalue(); System.out.println(selection); } }
비트박스프로그램
비트박스프로그램 256 개의체크상자, 16 개의레이블, 네개의버튼이있는 GUI 를만듭니다. 네개의버튼에대해 ActionListener 를만듭니다. 미디시스템설정 ( 자바 5.0 에서새로추가된 setloopcount() 메소드사용 ) Start 버튼을누르면 buildtrackandstart() 메소드가실행되면서 256 개의체크박스를확인하고미디트랙을구축하여연주를시작합니다. 사용자가 Stop 을누를때까지연주는계속됩니다.
숙제 본문을꼼꼼하게읽어봅시다. 실행할수있는코드는전부컴파일해서실행시키고조금씩고쳐봅시다. 모든연습문제를자기힘으로해결해봅시다. API 문서에서이장에나와있는클래스및메소드에대한내용을찾아봅시다. 비트박스프로그램에 clear 버튼을추가해봅시다.