Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 12일 그래픽사용자인터페이스 (Graphic User Interface)

Similar presentations


Presentation on theme: "제 12일 그래픽사용자인터페이스 (Graphic User Interface)"— Presentation transcript:

1 제 12일 그래픽사용자인터페이스 (Graphic User Interface)
12일 강의 목표 상속을 이용한 프레임 구성법 이해 컨테이너를 이용하는 컴포넌트 배치 방법 이해 배치관리자 사용법 연습 Swing 컴포넌트 사용법 및 문서 찾는 요령 습득 객체지향프로그래밍 강원대학교

2 상속을 이용한 맞춤제작 프레임 복잡한 프레임을 작성할 때 사용하는 기법 JFrame을 확장하여 사용
컴포넌트들을 인스턴스 필드로 저장 프레임 구성자에서 인스턴스 필드를 초기화 초기화 작업이 복잡한 경우 helper 메소드를 별도로 구현 객체지향프로그래밍 강원대학교

3 public class InvestmentFrame extends JFrame { public InvestmentFrame()
account = new BankAccount(INITIAL_BALANCE); resultLabel = new JLabel("balance=" + account.getBalance()); // Use helper methods createRateField(); createButton(); createPanel(); setSize(FRAME_WIDTH, FRAME_HEIGHT); } private void createRateField() rateLabel = new JLabel("Interest Rate: "); final int FIELD_WIDTH = 10; rateField = new JTextField(FIELD_WIDTH); rateField.setText("" + DEFAULT_RATE); // createButton(), createPanel() 등 helper 메소드 이곳에 추가! private JLabel rateLabel; private JTextField rateField; // 인스턴스 필드들 private JButton button; private JLabel resultLabel; private BankAccount account; 객체지향프로그래밍 강원대학교

4 Investment Viewer Program
01: import javax.swing.JFrame; 02: 03: /** 04: This program tests the InvestmentFrame. 05: */ 06: public class InvestmentFrameViewer 07: { 08: public static void main(String[] args) 09: { 10: JFrame frame = new InvestmentFrame(); 11: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 12: frame.setVisible(true); 13: } 14: } 15: 객체지향프로그래밍 강원대학교

5 Investment Viewer Program
01: import java.awt.event.ActionEvent; 02: import java.awt.event.ActionListener; 03: import javax.swing.JButton; 04: import javax.swing.JFrame; 05: import javax.swing.JLabel; 06: import javax.swing.JPanel; 07: import javax.swing.JTextField; 08: 09: /** 10: This program displays the growth of an investment. 11: */ 12: public class InvestmentFrame extends JFrame 13: { 14: public InvestmentFrame() 15: { 16: account = new BankAccount(INITIAL_BALANCE); 17: 객체지향프로그래밍 강원대학교

6 Investment Viewer Program
18: // Use instance fields for components 19: resultLabel = new JLabel( 20: "balance=" + account.getBalance()); 21: 22: // Use helper methods 23: createRateField(); 24: createButton(); 25: createPanel(); 26: 27: setSize(FRAME_WIDTH, FRAME_HEIGHT); 28: } 29: 30: public void createRateField() 31: { 32: rateLabel = new JLabel("Interest Rate: "); 33: final int FIELD_WIDTH = 10; 34: rateField = new JTextField(FIELD_WIDTH); 객체지향프로그래밍 강원대학교

7 Investment Viewer Program
35: rateField.setText("" + DEFAULT_RATE); 36: } 37: 38: public void createButton() 39: { 40: button = new JButton("Add Interest"); 41: 42: class AddInterestListener implements ActionListener 43: { 44: public void actionPerformed(ActionEvent event) 45: { 46: double rate = Double.parseDouble( 47: rateField.getText()); 48: double interest = account.getBalance() 49: * rate / 100; 50: account.deposit(interest); 51: resultLabel.setText( 52: "balance=" + account.getBalance()); 객체지향프로그래밍 강원대학교

8 Investment Viewer Program
53: } 54: } 55: 56: ActionListener listener = new AddInterestListener(); 57: button.addActionListener(listener); 58: } 59: 60: public void createPanel() 61: { 62: JPanel panel = new JPanel(); 63: panel.add(rateLabel); 64: panel.add(rateField); 65: panel.add(button); 66: panel.add(resultLabel); 67: add(panel); 68: } 69: 객체지향프로그래밍 강원대학교

9 Investment Viewer Program
70: private JLabel rateLabel; 71: private JTextField rateField; 72: private JButton button; 73: private JLabel resultLabel; 74: private BankAccount account; 75: 76: private static final double DEFAULT_RATE = 10; 77: private static final double INITIAL_BALANCE = 1000; 78: 79: private static final int FRAME_WIDTH = 500; 80: private static final int FRAME_HEIGHT = 200; 81: } 객체지향프로그래밍 강원대학교

10 배치 관리 Layout Management
컨테이너는 배치관리자(layout manager)를 갖는다. 배치관리자 border layout flow layout grid layout 객체지향프로그래밍 강원대학교

11 Layout Management JPanel은 기본으로 FlowLayout manager를 갖는다.
JPanel이 다른 종류의 layout manager를 사용하도록 할 수도 있다. JPanel panel1 = new Jpanel(); panel.setLayout(new BorderLayout()); 객체지향프로그래밍 강원대학교

12 Border Layout 객체지향프로그래밍 강원대학교

13 Border Layout Frame (실제로는 frame의 content pane)의 기본 배치관리자는 BorderLayout
컴포넌트를 넣는 법 전체 컨테이너 면적을 꽉 채우도록 각 컴포넌트의 크기를 늘여 조절함 JPanel panel1 = new Jpanel(); panel.setLayout(new BorderLayout()); panel.add(component, BorderLayout.NORTH); 객체지향프로그래밍 강원대학교

14 Grid Layout 전체 영역을 격자형으로 구획하고 차례로 컴포넌트를 삽입 컴포넌트들이 같은 크기를 갖도록 크기 조정
JPanel numberPanel = new JPanel(); numberPanel.setLayout(new GridLayout(4, 3)); numberPanel.add(button7); numberPanel.add(button8); numberPanel.add(button9); numberPanel.add(button4); 객체지향프로그래밍 강원대학교

15 Grid Bag Layout 격자 모양으로 컴포넌트 배치 넓이를 다르게 할 수 있음 컴포넌트를 여러 칸에 걸쳐 놓을 수 있음
사용하기 복잡 이것을 사용하는 대신 패널을 패널 속에 넣는 방법으로 모양을 조정할 수 있음 패널은 경계선이 보이지 않음 객체지향프로그래밍 강원대학교

16 Choices Radio buttons Check boxes Combo boxes 객체지향프로그래밍 강원대학교

17 Radio Buttons Font sizes are mutually exclusive:
JRadioButton smallButton = new JRadioButton("Small"); JRadioButton mediumButton = new JRadioButton("Medium"); JRadioButton largeButton = new JRadioButton("Large"); // Add radio buttons into a ButtonGroup so that // only one button in group is on at any time ButtonGroup group = new ButtonGroup(); group.add(smallButton); group.add(mediumButton); group.add(largeButton); 객체지향프로그래밍 강원대학교

18 Radio Buttons Button group은 버튼들을 가까이 모아 놓지는 않음, 프로그래머가 알아서 버튼을 배치해야 함
isSelected: 버튼이 선택됐는지 알아보기 위해 호출 setSelected(true) 프레임을 화면이 보이기 전에 (setVisible(true)) 라디오버튼 하나에게 호출 (largeButton.isSelected()) size = LARGE_SIZE; 객체지향프로그래밍 강원대학교

19 Borders (경계선) 어느 컴포넌트에건 경계선을 넣을 수 있으나 주로 panel에 사용됨
Jpanel panel = new JPanel (); panel.setBorder(new EtchedBorder ()); Panel.setBorder(new TitledBorder(new EtchedBorder(), “Size”)); 객체지향프로그래밍 강원대학교

20 Borders (경계선) 객체지향프로그래밍 강원대학교

21 Check Boxes JCheckBox italicCheckBox = new JCheckBox("Italic");
객체지향프로그래밍 강원대학교

22 Combo Boxes 선택지가 많을 때는 Combo Box를 사용 라디오 버튼에 비해 공간을 적게 차지하므로
"Combo": combination of a list and a text field The text field displays the name of the current selection 객체지향프로그래밍 강원대학교

23 Combo Boxes If combo box is editable, user can type own selection
Use setEditable method Add strings with addItem method: JComboBox facenameCombo = new JComboBox(); facenameCombo.addItem("Serif"); facenameCombo.addItem("SansSerif"); 객체지향프로그래밍 강원대학교

24 Combo Boxes Get user selection with getSelectedItem (return type is Object) Select an item with setSelectedItem String selectedString = (String) facenameCombo.getSelectedItem(); 객체지향프로그래밍 강원대학교

25 Radio Buttons, Check Boxes, and Combo Boxes
이 컴포넌트들은 아이템이 선택될 때ActionEvent를 발생시킴 객체지향프로그래밍 강원대학교

26 Swing Components 객체지향프로그래밍 강원대학교

27 An example: ChoiceFrame
객체지향프로그래밍 강원대학교

28 Classes of the Font Choice Program
객체지향프로그래밍 강원대학교

29 File ChoiceFrameViewer.java
01: import javax.swing.JFrame; 02: 03: /** 04: This program tests the ChoiceFrame. 05: */ 06: public class ChoiceFrameViewer 07: { 08: public static void main(String[] args) 09: { 10: JFrame frame = new ChoiceFrame(); 11: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 12: frame.setVisible(true); 13: } 14: } 15: 객체지향프로그래밍 강원대학교

30 File ChoiceFrame.java 001: import java.awt.BorderLayout;
002: import java.awt.Font; 003: import java.awt.GridLayout; 004: import java.awt.event.ActionEvent; 005: import java.awt.event.ActionListener; 006: import javax.swing.ButtonGroup; 007: import javax.swing.JButton; 008: import javax.swing.JCheckBox; 009: import javax.swing.JComboBox; 010: import javax.swing.JFrame; 011: import javax.swing.JLabel; 012: import javax.swing.JPanel; 013: import javax.swing.JRadioButton; 014: import javax.swing.border.EtchedBorder; 015: import javax.swing.border.TitledBorder; 016: 객체지향프로그래밍 강원대학교

31 File ChoiceFrame.java 017: /**
018: This frame contains a text field and a control panel 019: to change the font of the text. 020: */ 021: public class ChoiceFrame extends JFrame 022: { 023: /** 024: Constructs the frame. 025: */ 026: public ChoiceFrame() 027: { 028: // Construct text sample 029: sampleField = new JLabel("Big Java"); 030: add(sampleField, BorderLayout.CENTER); 031: 객체지향프로그래밍 강원대학교

32 File ChoiceFrame.java 032: // This listener is shared among all components 033: class ChoiceListener implements ActionListener 034: { 035: public void actionPerformed(ActionEvent event) 036: { 037: setSampleFont(); 038: } 039: } 040: 041: listener = new ChoiceListener(); 042: 043: createControlPanel(); 044: setSampleFont(); 045: setSize(FRAME_WIDTH, FRAME_HEIGHT); 046: } 047: 객체지향프로그래밍 강원대학교

33 File ChoiceFrame.java 048: /**
048: /** 049: Creates the control panel to change the font. 050: */ 051: public void createControlPanel() 052: { 053: JPanel facenamePanel = createComboBox(); 054: JPanel styleGroupPanel = createCheckBoxes(); 055: JPanel sizeGroupPanel = createRadioButtons(); 056: 057: // Line up component panels 058: 059: JPanel controlPanel = new JPanel(); 060: controlPanel.setLayout(new GridLayout(3, 1)); 061: controlPanel.add(facenamePanel); 062: controlPanel.add(styleGroupPanel); 063: controlPanel.add(sizeGroupPanel); 064: 객체지향프로그래밍 강원대학교

34 File ChoiceFrame.java 065: // Add panels to content pane 066:
067: add(controlPanel, BorderLayout.SOUTH); 068: } 069: 070: /** 071: Creates the combo box with the font style choices. 072: @return the panel containing the combo box 073: */ 074: public JPanel createComboBox() 075: { 076: facenameCombo = new JComboBox(); 077: facenameCombo.addItem("Serif"); 078: facenameCombo.addItem("SansSerif"); 079: facenameCombo.addItem("Monospaced"); 080: facenameCombo.setEditable(true); 081: facenameCombo.addActionListener(listener); 082: 객체지향프로그래밍 강원대학교

35 File ChoiceFrame.java 083: JPanel panel = new JPanel();
084: panel.add(facenameCombo); 085: return panel; 086: } 087: 088: /** 089: Creates the check boxes for selecting bold and // italic styles. 090: @return the panel containing the check boxes 091: */ 092: public JPanel createCheckBoxes() 093: { 094: italicCheckBox = new JCheckBox("Italic"); 095: italicCheckBox.addActionListener(listener); 096: 097: boldCheckBox = new JCheckBox("Bold"); 098: boldCheckBox.addActionListener(listener); 099: 객체지향프로그래밍 강원대학교

36 File ChoiceFrame.java 100: JPanel panel = new JPanel();
101: panel.add(italicCheckBox); 102: panel.add(boldCheckBox); 103: panel.setBorder 104: (new TitledBorder(new EtchedBorder(), "Style")); 105: 106: return panel; 107: } 108: 109: /** 110: Creates the radio buttons to select the font size 111: @return the panel containing the radio buttons 112: */ 113: public JPanel createRadioButtons() 114: { 115: smallButton = new JRadioButton("Small"); 116: smallButton.addActionListener(listener); 객체지향프로그래밍 강원대학교

37 File ChoiceFrame.java 117:
118: mediumButton = new JRadioButton("Medium"); 119: mediumButton.addActionListener(listener); 120: 121: largeButton = new JRadioButton("Large"); 122: largeButton.addActionListener(listener); 123: largeButton.setSelected(true); 124: 125: // Add radio buttons to button group 126: 127: ButtonGroup group = new ButtonGroup(); 128: group.add(smallButton); 129: group.add(mediumButton); 130: group.add(largeButton); 131: 객체지향프로그래밍 강원대학교

38 File ChoiceFrame.java 132: JPanel panel = new JPanel();
133: panel.add(smallButton); 134: panel.add(mediumButton); 135: panel.add(largeButton); 136: panel.setBorder 137: (new TitledBorder(new EtchedBorder(), "Size")); 138: 139: return panel; 140: } 141: 142: /** 143: Gets user choice for font name, style, and size 144: and sets the font of the text sample. 145: */ 146: public void setSampleFont() 147: { 객체지향프로그래밍 강원대학교

39 File ChoiceFrame.java 148: // Get font name 149: String facename
150: = (String) facenameCombo.getSelectedItem(); 151: 152: // Get font style 153: 154: int style = 0; 155: if (italicCheckBox.isSelected()) 156: style = style + Font.ITALIC; 157: if (boldCheckBox.isSelected()) 158: style = style + Font.BOLD; 159: 160: // Get font size 161: 162: int size = 0; 163: 객체지향프로그래밍 강원대학교

40 File ChoiceFrame.java 164: final int SMALL_SIZE = 24;
165: final int MEDIUM_SIZE = 36; 166: final int LARGE_SIZE = 48; 167: 168: if (smallButton.isSelected()) 169: size = SMALL_SIZE; 170: else if (mediumButton.isSelected()) 171: size = MEDIUM_SIZE; 172: else if (largeButton.isSelected()) 173: size = LARGE_SIZE; 174: 175: // Set font of text field 176: 177: sampleField.setFont(new Font(facename, style, size)); 178: sampleField.repaint(); 179: } 객체지향프로그래밍 강원대학교

41 File ChoiceFrame.java 180: 181: private JLabel sampleField;
182: private JCheckBox italicCheckBox; 183: private JCheckBox boldCheckBox; 184: private JRadioButton smallButton; 185: private JRadioButton mediumButton; 186: private JRadioButton largeButton; 187: private JComboBox facenameCombo; 188: private ActionListener listener; 189: 190: private static final int FRAME_WIDTH = 300; 191: private static final int FRAME_HEIGHT = 400; 192: } 객체지향프로그래밍 강원대학교

42 Advanced Topic: Layout Management
객체지향프로그래밍 강원대학교

43 Advanced Topic: Layout Management
객체지향프로그래밍 강원대학교

44 Advanced Topic: Layout Management
객체지향프로그래밍 강원대학교

45 Menus 프레임은 메뉴바를 가짐 메뉴바는 메뉴를 가짐 메뉴는 서브메뉴와 메뉴아이템을 가짐 객체지향프로그래밍 강원대학교

46 Menus 객체지향프로그래밍 강원대학교

47 Menu Items 메뉴에 서브메뉴와 메뉴아이템을 넣기 위해서는 메뉴의 add 메소드를 사용함
메뉴아이템은 서브메뉴를 갖지 않음 메뉴아이템은 액션 이벤트를 발생시킴 JMenuItem fileExitItem = new JMenuItem("Exit"); fileMenu.add(fileExitItem); 객체지향프로그래밍 강원대학교

48 Menu Items 메뉴아이템에는 액션리스너를 등록함 메뉴나 메뉴바에는 액션리스너를 등록하지 않음
fileExitItem.addActionListener(listener); 객체지향프로그래밍 강원대학교

49 예 간단하고 일반적인 메뉴를 구축 각 메뉴아이템으로부터의 이벤트를 처리
각 메뉴 혹은 메뉴 그룹을 만들기 위해 별도의 메소드를 사용 – 읽기 쉽게 createFaceItem: creates menu item to change the font face createSizeItem createStyleItem 객체지향프로그래밍 강원대학교

50 File MenuFrameViewer.java
01: import javax.swing.JFrame; 02: 03: /** 04: This program tests the MenuFrame. 05: */ 06: public class MenuFrameViewer 07: { 08: public static void main(String[] args) 09: { 10: JFrame frame = new MenuFrame(); 11: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 12: frame.setVisible(true); 13: } 14: } 15: 객체지향프로그래밍 강원대학교

51 File MenuFrame.java 001: import java.awt.BorderLayout;
002: import java.awt.Font; 003: import java.awt.GridLayout; 004: import java.awt.event.ActionEvent; 005: import java.awt.event.ActionListener; 006: import javax.swing.ButtonGroup; 007: import javax.swing.JButton; 008: import javax.swing.JCheckBox; 009: import javax.swing.JComboBox; 010: import javax.swing.JFrame; 011: import javax.swing.JLabel; 012: import javax.swing.JMenu; 013: import javax.swing.JMenuBar; 014: import javax.swing.JMenuItem; 015: import javax.swing.JPanel; 016: import javax.swing.JRadioButton; 객체지향프로그래밍 강원대학교

52 File MenuFrame.java 017: import javax.swing.border.EtchedBorder;
018: import javax.swing.border.TitledBorder; 019: 020: /** 021: This frame has a menu with commands to change the font 022: of a text sample. 023: */ 024: public class MenuFrame extends JFrame 025: { 026: /** 027: Constructs the frame. 028: */ 029: public MenuFrame() 030: { 031: // Construct text sample 032: sampleField = new JLabel("Big Java"); 033: add(sampleField, BorderLayout.CENTER); 034: 객체지향프로그래밍 강원대학교

53 File MenuFrame.java 035: // Construct menu
036: JMenuBar menuBar = new JMenuBar(); 037: setJMenuBar(menuBar); 038: menuBar.add(createFileMenu()); 039: menuBar.add(createFontMenu()); 040: 041: facename = "Serif"; 042: fontsize = 24; 043: fontstyle = Font.PLAIN; 044: 045: setSampleFont(); 046: setSize(FRAME_WIDTH, FRAME_HEIGHT); 047: } 048: 049: /** 050: Creates the File menu. 051: @return the menu 052: */ 객체지향프로그래밍 강원대학교

54 File MenuFrame.java 053: public JMenu createFileMenu() 054: {
054: { 055: JMenu menu = new JMenu("File"); 056: menu.add(createFileExitItem()); 057: return menu; 058: } 059: 060: /** 061: Creates the File->Exit menu item and sets its // action listener. 062: @return the menu item 063: */ 064: public JMenuItem createFileExitItem() 065: { 066: JMenuItem item = new JMenuItem("Exit"); 067: class MenuItemListener implements ActionListener 068: { 069: public void actionPerformed(ActionEvent event) 객체지향프로그래밍 강원대학교

55 File MenuFrame.java 070: { 071: System.exit(0); 072: } 073: }
070: { 071: System.exit(0); 072: } 073: } 074: ActionListener listener = new MenuItemListener(); 075: item.addActionListener(listener); 076: return item; 077: } 078: 079: /** 080: Creates the Font submenu. 081: @return the menu 082: */ 083: public JMenu createFontMenu() 084: { 085: JMenu menu = new JMenu("Font"); 086: menu.add(createFaceMenu()); 객체지향프로그래밍 강원대학교

56 File MenuFrame.java 087: menu.add(createSizeMenu());
088: menu.add(createStyleMenu()); 089: return menu; 090: } 091: 092: /** 093: Creates the Face submenu. 094: @return the menu 095: */ 096: public JMenu createFaceMenu() 097: { 098: JMenu menu = new JMenu("Face"); 099: menu.add(createFaceItem("Serif")); 100: menu.add(createFaceItem("SansSerif")); 101: menu.add(createFaceItem("Monospaced")); 102: return menu; 103: } 104: 객체지향프로그래밍 강원대학교

57 File MenuFrame.java 105: /** 106: Creates the Size submenu.
105: /** 106: Creates the Size submenu. 107: @return the menu 108: */ 109: public JMenu createSizeMenu() 110: { 111: JMenu menu = new JMenu("Size"); 112: menu.add(createSizeItem("Smaller", -1)); 113: menu.add(createSizeItem("Larger", 1)); 114: return menu; 115: } 116: 117: /** 118: Creates the Style submenu. 119: @return the menu 120: */ 121: public JMenu createStyleMenu() 122: { 객체지향프로그래밍 강원대학교

58 File MenuFrame.java 123: JMenu menu = new JMenu("Style");
124: menu.add(createStyleItem("Plain", Font.PLAIN)); 125: menu.add(createStyleItem("Bold", Font.BOLD)); 126: menu.add(createStyleItem("Italic", Font.ITALIC)); 127: menu.add(createStyleItem("Bold Italic", Font.BOLD 128: Font.ITALIC)); 129: return menu; 130: } 131: 132: 133: /** 134: Creates a menu item to change the font face and // set its action listener. 135: @param name the name of the font face 136: @return the menu item 137: */ 138: public JMenuItem createFaceItem(final String name) 139: { 객체지향프로그래밍 강원대학교

59 File MenuFrame.java 140: JMenuItem item = new JMenuItem(name);
141: class MenuItemListener implements ActionListener 142: { 143: public void actionPerformed(ActionEvent event) 144: { 145: facename = name; 146: setSampleFont(); 147: } 148: } 149: ActionListener listener = new MenuItemListener(); 150: item.addActionListener(listener); 151: return item; 152: } 153: 객체지향프로그래밍 강원대학교

60 File MenuFrame.java 154: /**
154: /** 155: Creates a menu item to change the font size 156: and set its action listener. 157: @param name the name of the menu item 158: @param ds the amount by which to change the size 159: @return the menu item 160: */ 161: public JMenuItem createSizeItem(String name, final int ds) 162: { 163: JMenuItem item = new JMenuItem(name); 164: class MenuItemListener implements ActionListener 165: { 166: public void actionPerformed(ActionEvent event) 167: { 168: fontsize = fontsize + ds; 169: setSampleFont(); 170: } 171: } 객체지향프로그래밍 강원대학교

61 File MenuFrame.java 172: ActionListener listener = new MenuItemListener(); 173: item.addActionListener(listener); 174: return item; 175: } 176: 177: /** 178: Creates a menu item to change the font style 179: and set its action listener. 180: @param name the name of the menu item 181: @param style the new font style 182: @return the menu item 183: */ 184: public JMenuItem createStyleItem(String name, final int style) 185: { 186: JMenuItem item = new JMenuItem(name); 187: class MenuItemListener implements ActionListener 188: { 객체지향프로그래밍 강원대학교

62 File MenuFrame.java 189: public void actionPerformed(ActionEvent event) 190: { 191: fontstyle = style; 192: setSampleFont(); 193: } 194: } 195: ActionListener listener = new MenuItemListener(); 196: item.addActionListener(listener); 197: return item; 198: } 199: 200: /** 201: Sets the font of the text sample. 202: */ 203: public void setSampleFont() 204: { 객체지향프로그래밍 강원대학교

63 File MenuFrame.java 205: Font f = new Font(facename, fontstyle, fontsize); 206: sampleField.setFont(f); 207: sampleField.repaint(); 208: } 209: 210: private JLabel sampleField; 211: private String facename; 212: private int fontstyle; 213: private int fontsize; 214: 215: private static final int FRAME_WIDTH = 300; 216: private static final int FRAME_HEIGHT = 400; 217: } 218: 219: 객체지향프로그래밍 강원대학교

64 Text Areas 문자열을 여러 줄 보이고 싶을 때는 JTextArea 사용 행과 열 수를 지정
setText: 화면에 나타날 문자열를 지정 append: 기존 문자열에 추가 final int ROWS = 10; final int COLUMNS = 30; JTextArea textArea = new JTextArea(ROWS, COLUMNS); 객체지향프로그래밍 강원대학교

65 Text Areas 줄바꿈을 위해서는 newline 문자 사용 사용자가 편집을 하지 못하게 하려면
textArea.append(account.getBalance() + "\n"); textArea.setEditable(false); // program can call setText and append to change it 객체지향프로그래밍 강원대학교

66 Text Areas To add scroll bars to a text area:
JTextArea textArea = new JTextArea(ROWS, COLUMNS); JScrollPane scrollPane = new JScrollPane(textArea); 객체지향프로그래밍 강원대학교

67 Text Areas 객체지향프로그래밍 강원대학교

68 File TextAreaViewer.java
01: import java.awt.BorderLayout; 02: import java.awt.event.ActionEvent; 03: import java.awt.event.ActionListener; 04: import javax.swing.JButton; 05: import javax.swing.JFrame; 06: import javax.swing.JLabel; 07: import javax.swing.JPanel; 08: import javax.swing.JScrollPane; 09: import javax.swing.JTextArea; 10: import javax.swing.JTextField; 11: 12: /** 13: This program shows a frame with a text area that 14: displays the growth of an investment. 15: */ 16: public class TextAreaViewer 17: { 객체지향프로그래밍 강원대학교

69 File TextAreaViewer.java
18: public static void main(String[] args) 19: { 20: JFrame frame = new JFrame(); 21: 22: // The application adds interest to this bank account 23: final BankAccount account = new BankAccount(INITIAL_BALANCE); 24: // The text area for displaying the results 25: final int AREA_ROWS = 10; 26: final int AREA_COLUMNS = 30; 27: 28: final JTextArea textArea = new JTextArea( 29: AREA_ROWS, AREA_COLUMNS); 30: textArea.setEditable(false); 31: JScrollPane scrollPane = new JScrollPane(textArea); 32: 33: // The label and text field for entering the // interest rate 객체지향프로그래밍 강원대학교

70 File TextAreaViewer.java
34: JLabel rateLabel = new JLabel("Interest Rate: "); 35: 36: final int FIELD_WIDTH = 10; 37: final JTextField rateField = new JTextField(FIELD_WIDTH); 38: rateField.setText("" + DEFAULT_RATE); 39: 40: // The button to trigger the calculation 41: JButton calculateButton = new JButton("Add Interest"); 42: 43: // The panel that holds the input components 44: JPanel northPanel = new JPanel(); 45: northPanel.add(rateLabel); 46: northPanel.add(rateField); 47: northPanel.add(calculateButton); 48: 49: frame.add(northPanel, BorderLayout.NORTH); 50: frame.add(scrollPane); 51: 객체지향프로그래밍 강원대학교

71 File TextAreaViewer.java
52: class CalculateListener implements ActionListener 53: { 54: public void actionPerformed(ActionEvent event) 55: { 56: double rate = Double.parseDouble( 57: rateField.getText()); 58: double interest = account.getBalance() 59: * rate / 100; 60: account.deposit(interest); 61: textArea.append(account.getBalance() + "\n"); 62: } 63: } 64: 65: ActionListener listener = new CalculateListener(); 66: calculateButton.addActionListener(listener); 67: 객체지향프로그래밍 강원대학교

72 File TextAreaViewer.java
68: frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 69: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 70: frame.setVisible(true); 71: } 72: 73: private static final double DEFAULT_RATE = 10; 74: private static final double INITIAL_BALANCE = 1000; 75: 76: private static final int FRAME_WIDTH = 400; 77: private static final int FRAME_HEIGHT = 200; 78: } 객체지향프로그래밍 강원대학교

73 Swing Documentation을 찾아보는 법
매우 방대한 문서임 객체지향프로그래밍 강원대학교

74 Example: A Color Mixer RGB 색깔을 배합하여 임의의 색깔을 보임 객체지향프로그래밍 강원대학교

75 Example: A Color Mixer slider라는 컴포넌트가 있다는 사실을 어떻게 아는가?
Swing component 책을 사서 본다. JDK에 들어 있는 sample application을 돌려본다. J로 시작하는 모든 클래스를 살펴본다. JSlider 객체지향프로그래밍 강원대학교

76 Example: A Color Mixer 다음에 알아야 할 것들 JSlider는 어떻게 구성하는가?
사용자가 슬라이더를 움직였을 때 그 사실을 어떻게 알 수 있나? 사용자가 슬라이더를 어느 값에 세트했는지 어떻게 알 수 있나? 기타 슬라이더에 눈금은 어떻게 만드나? 등등 객체지향프로그래밍 강원대학교

77 Example: A Color Mixer JSlider class에는 50개의 고유 메소드와 250개의 상속한 메소드가 있음
어떤 메소드는 그 설명이 엄청 어려워 무슨 말인지 이해할 수 없음 기본적인 핵심만 이해하고 이용하면 됨 지나치게 복잡하고 지엽적인 내용에 함몰되지 않는 것이 좋음 객체지향프로그래밍 강원대학교

78 JSlider는 어떻게 구성하나? API documentation을 찾아봄 여섯개의 구성자 그 중 한두 개 정도 읽어봄
가장 간단한 것과 가장 복잡한 것의 중간 쯤 되는 것이 통상 효용이 높음 객체지향프로그래밍 강원대학교

79 JSlider는 어떻게 구성하나? 지나치게 제한적 Range 0 to 100, initial value of 50
지나치게 복잡        실용적 public JSlider() public JSlider(BoundedRangeModel brm) public JSlider(int min, int max, int value) 객체지향프로그래밍 강원대학교

80 사용자가 슬라이더를 움직였을 때 그 사실을 어떻게 알 수 있나?
addActionListener 메소드가 없음 아래 메소드가 있음 ChangeListener를 클릭하여 자세히 알아봄 하나의 메소드만을 가짐 public void addChangeListener(ChangeListener l) void stateChanged(ChangeEvent e) 객체지향프로그래밍 강원대학교

81 사용자가 슬라이더를 움직였을 때 그 사실을 어떻게 알 수 있나?
사용자가 슬라이더를 움질이면 이 메소드가 호출될 것임 ChangeEvent는 무엇인가? 슈퍼클래스인 EventObject로부터 getSource 메소드를 상속함 getSource: 어떤 컴포넌트에서 이벤트가 만들어졌는지 알려줌 객체지향프로그래밍 강원대학교

82 사용자가 슬라이더를 움직였을 때 그 사실을 어떻게 알 수 있나?
아래와 같이 하면 될 것이라는 것을 알게 됨 슬라이더에 change event listener를 등록함 슬라이더가 변경될 때마다 stateChanged 메소드가 호출됨 새로 설정된 슬라이더 값을 읽음 색깔 값을 계산함 칼라 패널을 repaint 객체지향프로그래밍 강원대학교

83 사용자가 슬라이더를 어느 값에 세트했는지 어떻게 알 수 있나?
JSlider 클래스에서 get으로 시작하는 메소드를 살펴보면 아래 메소드를 찾을 수 있음 public int getValue() 객체지향프로그래밍 강원대학교

84 The Components of the SliderFrame
객체지향프로그래밍 강원대학교

85 File SliderFrameViewer.java
01: import javax.swing.JFrame; 02: 03: public class SliderFrameViewer 04: { 05: public static void main(String[] args) 06: { 07: SliderFrame frame = new SliderFrame(); 08: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 09: frame.setVisible(true); 10: } 11: } 12: 객체지향프로그래밍 강원대학교

86 File SliderFrame.java 01: import java.awt.BorderLayout;
02: import java.awt.Color; 03: import java.awt.GridLayout; 04: import javax.swing.JFrame; 05: import javax.swing.JLabel; 06: import javax.swing.JPanel; 07: import javax.swing.JSlider; 08: import javax.swing.event.ChangeListener; 09: import javax.swing.event.ChangeEvent; 10: 11: public class SliderFrame extends JFrame 12: { 13: public SliderFrame() 14: { 15: colorPanel = new JPanel(); 16: 객체지향프로그래밍 강원대학교

87 File SliderFrame.java 17: add(colorPanel, BorderLayout.CENTER);
18: createControlPanel(); 19: setSampleColor(); 20: setSize(FRAME_WIDTH, FRAME_HEIGHT); 21: } 22: 23: public void createControlPanel() 24: { 25: class ColorListener implements ChangeListener 26: { 27: public void stateChanged(ChangeEvent event) 28: { 29: setSampleColor(); 30: } 31: } 32: 객체지향프로그래밍 강원대학교

88 File SliderFrame.java 33: ChangeListener listener = new ColorListener(); 34: 35: redSlider = new JSlider(0, 100, 100); 36: redSlider.addChangeListener(listener); 37: 38: greenSlider = new JSlider(0, 100, 70); 39: greenSlider.addChangeListener(listener); 40: 41: blueSlider = new JSlider(0, 100, 70); 42: blueSlider.addChangeListener(listener); 43: 44: JPanel controlPanel = new JPanel(); 45: controlPanel.setLayout(new GridLayout(3, 2)); 46: 47: controlPanel.add(new JLabel("Red")); 48: controlPanel.add(redSlider); 49: 객체지향프로그래밍 강원대학교

89 File SliderFrame.java 50: controlPanel.add(new JLabel("Green"));
51: controlPanel.add(greenSlider); 52: 53: controlPanel.add(new JLabel("Blue")); 54: controlPanel.add(blueSlider); 55: 56: add(controlPanel, BorderLayout.SOUTH); 57: } 58: 59: /** 60: Reads the slider values and sets the panel to 61: the selected color. 62: */ 63: public void setSampleColor() 64: { 65: // Read slider values 66: 객체지향프로그래밍 강원대학교

90 File SliderFrame.java 67: float red = 0.01F * redSlider.getValue();
68: float green = 0.01F * greenSlider.getValue(); 69: float blue = 0.01F * blueSlider.getValue(); 70: 71: // Set panel background to selected color 72: 73: colorPanel.setBackground(new Color(red, green, blue)); 74: colorPanel.repaint(); 75: } 76: 77: private JPanel colorPanel; 78: private JSlider redSlider; 79: private JSlider greenSlider; 80: private JSlider blueSlider; 81: 82: private static final int FRAME_WIDTH = 300; 83: private static final int FRAME_HEIGHT = 400; 84: } 객체지향프로그래밍 강원대학교


Download ppt "제 12일 그래픽사용자인터페이스 (Graphic User Interface)"

Similar presentations


Ads by Google