Dev/Java

Java - NotePad (Swing)

surimi🍥 2020. 10. 22. 10:12
반응형

 

[Sourcecode]

Package: notePad

Java Files:

NotePad.java - 메모장 디자인, 필드 및 기능

더보기
package notePad;

import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

@SuppressWarnings("serial")
public class NotePad extends JFrame implements ActionListener {

	private JTextArea output;
	private MenuPane menu;
	private FontSettingPane fontSetting;
	private String fileName = null;
	private Font font;
	private File currentFile;

	public NotePad() {
		super("간단메모장");
		setBounds(700, 100, 500, 700);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

		// JFrame 위에 모든 항목을 담는 컨테이너 생성
		Container c = getContentPane();

		// 스크롤 + 텍스트 area 생성
		output = new JTextArea();

		JScrollPane scroll = new JScrollPane(output);
		// 수직 스크롤바 항상 보이게 하기.
		scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

		// 메뉴 추가
		menu = new MenuPane(NotePad.this);
		fontSetting = new FontSettingPane(NotePad.this);
		this.setJMenuBar(menu);

		c.add(scroll);

		output.setLineWrap(true);
		output.setWrapStyleWord(true);

		// 닫기버튼 이벤트
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				// 종료 메소드 호출
				closingMessage();
			}
		});
		// esc 종료. 안됨.
		output.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
					System.out.println(output.getText());
				}
			}
		});
		setVisible(true);
	}

	public void event() {

		// 이벤트
		menu.getNewM().addActionListener(this);
		menu.getOpenM().addActionListener(this);
		menu.getSaveM().addActionListener(this);
		menu.getExitM().addActionListener(this);
		menu.getCutM().addActionListener(this);
		menu.getCopyM().addActionListener(this);
		menu.getPasteM().addActionListener(this);
		menu.getFontM().addActionListener(this);
		menu.getTextWrapM().addActionListener(this);

	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == menu.getNewM()) {
			// 새 파일
			makeNewFile();
		} else if (e.getSource() == menu.getOpenM()) {
			// 열기 메소드 호출
			openDialog();
		} else if (e.getSource() == menu.getSaveM()) {
			// 저장 버튼 이벤트
			saveDialog();
		} else if (e.getSource() == menu.getExitM()) {
			// 종료 메소드 호출
			closingMessage();
		} else if (e.getSource() == menu.getCutM()) {
			// 잘라내기
			output.cut();
		} else if (e.getSource() == menu.getCopyM()) {
			// 복사
			output.copy();
		} else if (e.getSource() == menu.getPasteM()) {
			// 붙여넣기
			output.paste();
		} else if (e.getSource() == menu.getTextWrapM()) {
			// 자동줄바꿈
			if (!output.getLineWrap()) {
				output.setLineWrap(true);
				output.setWrapStyleWord(true);
			} else {
				output.setLineWrap(false);
				output.setWrapStyleWord(false);
			}
		} else if (e.getSource() == menu.getFontM()) {
			// 폰트
			System.out.println("폰트 설정 실행");
			fontSetting.setVisible(true);

		}

	}

	// 종료 이벤트 메소드
	private void closingMessage() {

		if (output.getText().length() != 0) {
			int result = JOptionPane.showConfirmDialog(this, "현재 작성중인 문서를 저장하시겠습니까?", "확인",
					JOptionPane.YES_NO_CANCEL_OPTION);
			if (result == JOptionPane.YES_OPTION) {
				saveDialog();
			} else if (result == JOptionPane.CANCEL_OPTION) {
				return;
			}
		}
		System.exit(0);
	}

	// 파일 저장(1)
	private void saveDialog() {
		JFileChooser chooser = new JFileChooser();
		int result = chooser.showSaveDialog(this); // this : 창 생성 위치
		if (result == JFileChooser.APPROVE_OPTION) {
			currentFile = chooser.getSelectedFile();
			fileSave();
			JOptionPane.showMessageDialog(this, currentFile);
		}
	}

	// 파일 저장(2)
	private void fileSave() {
		System.out.println("저장버튼 실행");
		try {

			BufferedWriter bw = new BufferedWriter(new FileWriter(currentFile));
			String data = output.getText();
			bw.write(data);
			bw.close();

			setTitle(currentFile.getName());

		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	// 열기(1) - 파일 주소를 받아 객체 생성
	private void openDialog() {
		JFileChooser chooser = new JFileChooser();
		int result = chooser.showOpenDialog(this); // this : 창 생성 위치
		if (result == JFileChooser.APPROVE_OPTION) {
			currentFile = chooser.getSelectedFile();
			fileRead();
			JOptionPane.showMessageDialog(this, currentFile);
		}

	}

	// 열기(2) - 파일 읽어오기
	private void fileRead() {
		System.out.println("열기버튼 실행");

		// 입력된 문자가 있을 경우 저장할지 확인
		if (output.getText().length() != 0) {
			int result = JOptionPane.showConfirmDialog(this, "현재 작성중인 문서를 저장하시겠습니까?", "확인", JOptionPane.YES_NO_OPTION);
			if (result == JOptionPane.YES_OPTION) {
				saveDialog();
			}
		}

		try {
			BufferedReader br = new BufferedReader(new FileReader(currentFile));
			output.setText(""); // 입력된 내용 모두 제거
			setTitle(currentFile.getName()); // 윈도우창 파일명으로 변경
			String str;
			// 문자열을 계속 불러오다가 null이 나올때까지
			while ((str = br.readLine()) != null) {
				// output.setText(br.readLine()); // setText() = 덮어쓰기이므로 첫번째 줄에 계속 덮어씌여진다
				output.append(str + "\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private void makeNewFile() {
		// 새로 만들기 버튼
		if (output.getText().length() != 0) {
			int result = JOptionPane.showConfirmDialog(this, "현재 작성중인 문서를 저장하시겠습니까?", "확인",
					JOptionPane.YES_NO_CANCEL_OPTION);
			if (result == JOptionPane.YES_OPTION) {
				saveDialog();
			} else if (result == JOptionPane.CANCEL_OPTION) {
				return;
			}
		}
		output.setText(null); 

	}

	public void setFont(Font f) {
		this.font = f;
		output.setFont(f);
	}

	public static void main(String[] args) {
		new NotePad().event();
	}

}

NotePadMain.java - 메모장을 실행하는 main 메소드

더보기

 

 

 

 

package notePad;

public class NotePadMain {

	public static void main(String[] args) {

		new NotePad().event();

	}

}

MenuPane.java - 메뉴바 및 단축키

더보기

 

 

 

 

package notePad;

import java.awt.Event;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;

@SuppressWarnings("serial")
public class MenuPane extends JMenuBar {

	private NotePad tnp;
	private JMenu fileM, editM, viewM;
	private JMenuItem newM, openM, saveM, exitM, cutM, copyM, pasteM, fontM ,textWrapM;

	public MenuPane(NotePad tnp) {
		this.tnp = tnp;
		fileM = new JMenu("파일");
		editM = new JMenu("편집");
		viewM = new JMenu("보기");

		newM = new JMenuItem("새로만들기");
		openM = new JMenuItem("열기");
		saveM = new JMenuItem("저장");
		exitM = new JMenuItem("나가기");
		cutM = new JMenuItem("자르기");
		copyM = new JMenuItem("복사하기");
		pasteM = new JMenuItem("붙여넣기");
		fontM = new JMenuItem("글꼴 설정");
		textWrapM = new JMenuItem("자동 줄 바꿈");

		fileM.add(newM);
		fileM.add(openM);
		fileM.add(saveM);
		fileM.add(getExitM());

		editM.add(cutM);
		editM.add(copyM);
		editM.add(pasteM);

		viewM.add(fontM);
		viewM.add(textWrapM);

		add(fileM);
		add(editM);
		add(viewM);
		
		// 잘라내기 단축키 : ALT + X 
		cutM.setAccelerator(KeyStroke.getKeyStroke('X', Event.ALT_MASK)); 
		// 붙여넣기 단축키 : ALT + V 
		pasteM.setAccelerator(KeyStroke.getKeyStroke('V', Event.ALT_MASK));
		// 복사 단축키 : ALT + C 
		copyM.setAccelerator(KeyStroke.getKeyStroke('C', Event.ALT_MASK));
		// 새로 만들기 ALT + N
		newM.setAccelerator(KeyStroke.getKeyStroke('N', Event.ALT_MASK)); 
		// 저장 ALT + S
		saveM.setAccelerator(KeyStroke.getKeyStroke('S', Event.ALT_MASK)); 
		// 열기 ALT + O
		openM.setAccelerator(KeyStroke.getKeyStroke('O', Event.ALT_MASK)); 
		// 나가기 CTRL + W
		exitM.setAccelerator(KeyStroke.getKeyStroke('W', Event.CTRL_MASK)); 
		

	}

	public JMenuItem getTextWrapM() {
		return textWrapM;
	}

	public NotePad getTnp() {
		return tnp;
	}

	public JMenu getFileM() {
		return fileM;
	}

	public JMenu getEditM() {
		return editM;
	}

	public JMenu getViewM() {
		return viewM;
	}

	public void setNewM(JMenuItem newM) {
		this.newM = newM;
	}

	public JMenuItem getNewM() {
		return newM;
	}

	public JMenuItem getOpenM() {
		return openM;
	}

	public JMenuItem getSaveM() {
		return saveM;
	}

	public JMenuItem getCutM() {
		return cutM;
	}

	public JMenuItem getCopyM() {
		return copyM;
	}

	public JMenuItem getPasteM() {
		return pasteM;
	}

	public JMenuItem getFontM() {
		return fontM;
	}

	public JMenuItem getExitM() {
		return exitM;
	}


}

FontSettingPane.java - 글꼴 설정창

더보기

 

 

 

package notePad;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

@SuppressWarnings("serial")
public class FontSettingPane extends JFrame implements ActionListener {

	JComboBox<String> fontList;
	JList<String> sizeList, styleList;
	JScrollPane scroll_Style, scroll_Size;
	JButton confirm;
	NotePad tnp;

	public FontSettingPane(NotePad tnp) {
		super("글꼴 설정");
		setBounds(750, 400, 400, 300);
		setResizable(false);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

		this.tnp = tnp;

		// 폰트 리스트
		String[] fonts = { "고딕체", "궁서체", "굴림체" };
		fontList = new JComboBox<String>(fonts);

		// 스타일 리스트
		String[] styles = { "PLAIN", "BOLD", "ITALIC" }; // Font.BOLD = 1, Font.ITALIC = 2
		styleList = new JList<String>(styles);
		scroll_Style = new JScrollPane(styleList);
		scroll_Style.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		styleList.setSelectedIndex(0);

		// 사이즈 리스트
		String[] sizes = { "12", "14", "16", "18", "20", "24", "28", "32", "36", "40", "52", "64", "76", "88", "100" };
		sizeList = new JList<String>(sizes);
		scroll_Size = new JScrollPane(sizeList);
		scroll_Size.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		sizeList.setSelectedIndex(1);

		// 패널, 버튼 생성
		JPanel p = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		confirm = new JButton("확인");
		p.add(confirm);

		// 컨테이너, 메인패널 생성
		Container c = getContentPane();
		JPanel pfont = new JPanel(new GridLayout(8, 1));
		JPanel pstyle = new JPanel(new GridLayout(1, 2));
		pfont.add(fontList);

		c.add("Center", pstyle);
		pstyle.add("West", pfont);
		c.add("South", p);

		pstyle.add(scroll_Style);
		pstyle.add(scroll_Size);

		setVisible(false);

		// 버튼 이벤트
		event();

		// 윈도우 닫기 이벤트
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				FontSettingPane.this.setVisible(false);
//				tnp.setEnabled(true);
			}
		});
	}

	private void event() {
		confirm.addActionListener(this);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == confirm) {
			String a = (String) fontList.getSelectedItem();
			int b = styleList.getSelectedIndex();
			int c = Integer.parseInt(sizeList.getSelectedValue());

			System.out.println(a);
			System.out.println(b);
			System.out.println(c);
			Font f = new Font(a, b, c);

			FontSettingPane.this.tnp.setFont(f);

			FontSettingPane.this.setVisible(false);
		}

	}

}

 

 

 

 

 

 

 

반응형