Java 정리 23
13 Dec 2018
Reading time ~4 minutes
Java 정리 23 - 메모장 구현, Dialog, Swing
숙제 복습
- 12일자 숙제 클래스다이어그램 참고해서 재구현
Event Handling에서 is-a, has-a 관계 정리
-
Event Handling에서 is-a 관계
- Event처리하는 클래스 is a Design 클래스
-
Event Handling에서 has-a 관계
- Event처리하는 클래스 has a Design 클래스
메모장 구현
- 클래스다이어그램과 mockup 이미지
- awt를 이용한 design
- 기본적인 새글, 열기, 저장, 다른 이름으로 저장, 닫기 이벤트처리 구현
Dialog
-
정보를 제공하는 작은 Window
- Window Component : 사용자에게 보여주는 일
- 기본 Layout : BorderLayout
-
부모 윈도우(owner)가 존재하는 Component
-
Dialog has-a 관계
- 부모 has a 다이얼로그
- 부모가 Dialog 클래스를 갖는 구조
- 부모창에서 Dialog 클래스를 바로 객체화 해서 다이얼로그 사용
-
Dialog is-a 관계
-
다이얼로그 자식 클래스 is a 다이얼로그
- 자식은 부모다.
- Dialog를 따로 상속받은 자식클래스로 다이얼로그 구현
- 다이얼로그자식클래스가 생성될 때 부모창의 주소를 넘겨받아 has-a 관계를 형성
- 넘겨받은 부모창의 주소를 이용 Dialog자식클래스 생성자안에 부모클래스(Dialog)의 인자있는 생성자 호출하여 Dialog를 생성
-
다이얼로그 자식 클래스 is a 다이얼로그
///////////////// has a /////////////////////////////////
// 1. 생성
// 반드시 부모 생성자(owner)가 존재
Dialog d = new Dialog(프레임, "타이틀", modal여부);
// modal여부 true는 modal, false는 modaless
// 자식창이 동작시 부모창이 선택되지 않으면 modal, 부모창이 선택되면 modeless
// 2. 컴포넌트 배치
Button b = new Button("버튼");
d.add(b);
d.add(BorderLayout.CENTER, b);
// 3. 크기를 설정
d.setSize(width, height);
d.setBounds(x, y, w, h);
// 4. 가시화
d.setVisible(true);
///////////////////// is a ////////////////////////////
// 1. Dialog 상속
public class Test extends Dialog { ... }
// 2. 생성자 정의하고 부모클래스의 생성자를 호출
public Test(Frame f) {
super(f, "타이틀", modal여부);
// Component 생성
// Component Dialog 배치
// Dialog에 크기설정
// Dialog 가시화
}
- Dialog has-a 관계 예제
- Dialog is-a 관계 예제
메모장 서식 다이얼로그 추가
- List를 클릭하면 item의 값이 해당 List의 TextField에 설정
- 보기가 변경되어야 된다.
- 확인 버튼이 클릭되면 설정한 Font의 정보가 부모창 TextArea에 반영이 되어야한다.
- 취소 버튼이 클릭되면 창이 닫혀야 한다.
-
MemoFormat class
////////////////// MemoFormat class ////////////////////////////////// // TextArea의 Font를 가져와서 글꼴 TextField 초기값으로 설정하는 코드 /// String[] arrStyle = { "일반", "굵게", "기울임꼴", "굵은 기울임꼴" }; for (String style : arrStyle) { listStyle.add(style); } // 부모창 JavaMemo T.A의 글꼴 정보를 가져와서 T.F에 설정한다. Font fontTa = jm.getTaNote().getFont(); tfFont = new TextField(fontTa.getFamily()); tfStyle = new TextField(arrStyle[fontTa.getStyle()]); tfSize = new TextField(Integer.toString(fontTa.getSize()));
-
MemoFormatEvt class
////////////////// MemoFormatEvt class ///////////////////// ///////// 리스트 아이템 클릭했을 때 서식 변경하는 코드 //////// @Override public void itemStateChanged(ItemEvent ie) { // 선택되는 아이템의 값을 먼저 저장하고 // 클릭되는 리스트와 관련있는 TextField에 할당해준다. String selectedValue = ((List)ie.getSource()).getSelectedItem(); Font lblPreviewFont = mf.getLblPreview().getFont(); // 기준 String name = lblPreviewFont.getFamily(); int style = lblPreviewFont.getStyle(); int size = lblPreviewFont.getSize(); // 선택한 아이템을 TextField의 값으로 설정 // 미리보기 라벨을 변경시킴 if (ie.getSource() == mf.getListFont()) { mf.getTfFont().setText(selectedValue); name = selectedValue; } if (ie.getSource() == mf.getListStyle()) { mf.getTfStyle().setText(selectedValue); style = ((List)ie.getSource()).getSelectedIndex(); } if (ie.getSource() == mf.getListSize()) { mf.getTfSize().setText(selectedValue); size = Integer.parseInt(selectedValue); } mf.getLblPreview().setFont(new Font(name, style, size)); } ... /** * MemoFormat 클래스의 미리보기 Label의 Font정보를 * JavaMemo 클래스의 TextArea에 설정 */ public void setTaNoteFont() { mf.getJm().getTaNote().setFont(mf.getLblPreview().getFont()); mf.dispose(); }
MVC 패턴
-
디자인, 업무처리(Business Logic), 데이터처리를 구분하여 만드는 개발 패턴
- 유지보수성이 좋아진다.
- 파일이 많아져 파일관리가 어렵다.
- 값 넘기기가 어렵다.
- 에러처리가 어렵다.
-
Model
- 데이터 처리
-
View
- 화면 디자인
-
Controller
- 이벤트 처리
Swing
-
AWT 후속 Window Design
- AWT는 무겁고 느림, OS마다 다른 디자인 제공, 이미지를 다루기 어렵다.
-
javax.swing 패키지에서 Component 제공
- javax는 자바 확장 패키지
- 장점
- 빠르다
- OS가 달라도 같은 디자인을 제공
- 이미지 기능 추가
- AWT와 구분되는 이름을 가진다.
- 다양하고 미려한 Component.
- Event는 AWT의 Event를 같이 사용
- AWT Component를 Swing에서 같이 사용할 수 있다.
- MVC pattern이 적용된 Component가 제공
- 사용법은 AWT와 거의 동일
// 1. Window Component를 상속
public class Test extends JFrame { ... }
// X를 누르면 인스턴스가 사라짐(다만 종료되지 않고 인스턴스는 살아있음)
// 2. 이벤트 처리와 관련있는 Component를 선언
JButton btn;
public Test() {
super("타이틀명");
// 3. 컴포넌트 생성 - AWT와 동일
btn = new Button("버튼"); // JButton은 버튼에 Icon을 넣을 수 있다.
// 4. 배치 - AWT와 동일
// 5. 윈도우 사이즈 조정 - AWT와 동일
// 6. 가시화 - AWT와 동일
// 7. 윈도우 종료처리
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* Swing을 사용한 Window Application
* @author owner
*/
public class HelloSwing extends JFrame implements ActionListener {
private JButton jb;
private Button btn;
public HelloSwing() {
super("스윙 연습");
// 컴포넌트 생성
jb = new JButton("안녕! 난 스윙이라고 해");
btn = new Button("AWT버튼");
// 배치관리자 전환
setLayout(new GridLayout(1, 2));
// 배치
add(jb);
add(btn);
jb.addActionListener(this);
btn.addActionListener(this);
// 크기설정
setBounds(300, 200, 400, 400);
// 가시화
setVisible(true);
// 윈도우 종료처리
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new HelloSwing();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jb) {
dispose();
}
if (e.getSource() == btn) {
btn.setLabel("AWT라니!!");
}
}
}
숙제풀이
- 기존 작업하던 메모장에 기능추가
- 메뉴아이템 메모장정보 선택시 다음과 같은 다이얼로그가 뜨도록 구현
- 클래스다이어그램