ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java) 메모장 만들기 1) 메뉴 + 열기 + 저장
    JAVA/멀티스레드, 이벤트 2024. 5. 27. 10:59

    ▤ 목차

      ✔ 메뉴바 만들기

      💻 코드로 보기

      
      // 메모장 만들기
      public class Memojang extends JFrame implements ActionListener {
      
      	private JTextArea txtMemo = new JTextArea("", 10, 30);
      	private String copyText;
      
      	private JMenuItem mnuNew, mnuSave, mnuOpen, mnuExit;
      	private JMenuItem mnuCopy, mnuPaste, mnuCut, mnuDel, mnuFontSize;
      	private JMenuItem mnuAbout, mnuEtc1, mnuEtc2;
      
      	public Memojang() {
      		super("메모장");
      
      		initLayout();
      		menuLayout();
      
      		setBounds(200, 200, 400, 350);
      		setVisible(true);
      		addWindowListener(new WindowAdapter() {
      			@Override
      			public void windowClosing(WindowEvent e) { // 무명 클래스여서 this를 지정해줘야한다.
      				int close = JOptionPane.showConfirmDialog(Memojang.this, "종료하시겠습니까?", "종료",
      						JOptionPane.YES_NO_OPTION); // 내부 무명클래스에서는 클래스명을 넣어줘야한다.
      
      				switch (close) {
      				case JOptionPane.YES_OPTION:
      					System.exit(0);
      					break;
      				case JOptionPane.NO_OPTION:
      					break;
      				}
      			}
      		});
      	}
      
      	private void initLayout() {
      		JScrollPane scroollpane = new JScrollPane(txtMemo); // 스크롤바 생김
      		txtMemo.setFont(new Font("돋음", Font.PLAIN, 16));
      		add("Center", scroollpane);
      	}
      
      	private void menuLayout() {
      		JMenuBar menuBar = new JMenuBar(); // 메뉴바
      
      		JMenu mnuFile = new JMenu("파일"); // 주메뉴
      		mnuNew = new JMenuItem("새문서");
      		mnuOpen = new JMenuItem("열기..."); // ... > 사용자 배려
      		mnuSave = new JMenuItem("저장...");
      		mnuExit = new JMenuItem("종료");
      		mnuFile.add(mnuNew);
      		mnuFile.add(mnuOpen);
      		mnuFile.add(mnuSave);
      		mnuFile.addSeparator(); // 구분선 : 같은 성격끼리 묶어놓는다.
      		mnuFile.add(mnuExit); // 메뉴에 부메뉴 등록
      
      		JMenu mnuEdit = new JMenu("편집");
      		mnuCopy = new JMenuItem("복사(c)");
      		mnuCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
      		mnuPaste = new JMenuItem("붙여넣기");
      		mnuCut = new JMenuItem("잘라내기");
      		mnuDel = new JMenuItem("삭제");
      		mnuFontSize = new JMenuItem("글꼴 크기...");
      		mnuEdit.add(mnuCopy);
      		mnuEdit.add(mnuPaste);
      		mnuEdit.add(mnuCut);
      		mnuEdit.add(mnuDel);
      		mnuEdit.addSeparator(); // 구분선
      		mnuEdit.add(mnuFontSize);
      
      		JMenu mnuShow = new JMenu("보기");
      		mnuAbout = new JMenuItem("메모장이란..");
      		mnuEtc1 = new JMenuItem("계산기");
      		mnuEtc2 = new JMenuItem("프리셀");
      		mnuShow.add(mnuAbout);
      		mnuShow.addSeparator(); // 구분선
      		mnuShow.add(mnuEtc1);
      		mnuShow.add(mnuEtc2);
      
      		menuBar.add(mnuFile); // 메뉴바에 주메뉴 등록
      		menuBar.add(mnuEdit);
      		menuBar.add(mnuShow);
      
      		setJMenuBar(menuBar); // JFrame에 메뉴바 등록
      
      		// 메뉴에 리스너 달기 > actionPerformed()넘어간다.
      		mnuNew.addActionListener(this);
      		mnuSave.addActionListener(this);
      		mnuOpen.addActionListener(this);
              
      
      	}
      
      	@Override
      	public void actionPerformed(ActionEvent e) {
      		// System.out.println(e.getActionCommand());
      		// System.out.println(e.getSource());
      		if (e.getSource() == mnuNew) { // 새문서
      			txtMemo.setText(""); // 덮어쓰기
      			setTitle("제목 없음");
                  
      		} else if (e.getSource() == mnuOpen) { // 열기
              
      			// 파일 열기을 위한 경로명과 파일명 얻기는 os지원 창을 사용
      			FileDialog dialog = new FileDialog(this, "열기", FileDialog.LOAD);
      			dialog.setDirectory("."); // 현재 디렉토리
      			dialog.setVisible(true);
      			if (dialog.getFile() == null)
      				return;
      			String dfName = dialog.getDirectory() + dialog.getFile();
      			
      			try {
      				BufferedReader reader = new BufferedReader(new FileReader(dfName));
      				txtMemo.setText("");
      				String line = "";
      				while((line = reader.readLine()) != null) {
      					txtMemo.append(line + "\n");
      				}
      				reader.close();
      				setTitle(dialog.getFile() + " - 메모장");
      			} catch (Exception e2) {
      				System.out.println(e2.getMessage()); // 개발자용
      				JOptionPane.showMessageDialog(this, e2.getMessage(), "에러", JOptionPane.WARNING_MESSAGE); // 사용자용
      			}
      
      		} else if (e.getSource() == mnuSave) { // 저장
              
      			// 파일 저장을 위한 경로명과 파일명 얻기는 os지원 창을 사용
      			FileDialog dialog = new FileDialog(this, "저장", FileDialog.SAVE);
      			dialog.setDirectory("."); // 현재 디렉토리
      			dialog.setVisible(true);
      			if (dialog.getFile() == null)
      				return;
      			String dfName = dialog.getDirectory() + dialog.getFile();
      //			System.out.println("dfName " + dfName);
      
      			try {
      				// BufferedWriter writer = new BufferedWriter(new FileWriter("c:/work/a.txt"));
      				// 윈도우 타입으로 경로 지정 방식 : "c:\\work\\a.txt"
      				BufferedWriter writer = new BufferedWriter(new FileWriter(dfName));
      				writer.write(txtMemo.getText());
      				writer.close();
      				setTitle(dialog.getFile() + " - 메모장");
      
      			} catch (Exception e2) {
      				System.out.println(e2.getMessage()); // 개발자용
      				JOptionPane.showMessageDialog(this, e2.getMessage(), "에러", JOptionPane.WARNING_MESSAGE); // 사용자용
      			}
      
      	}
      
      	public static void main(String[] args) {
      		// TODO Auto-generated method stub
      		new Memojang();
      	}
      
      }

      👏 결과

       

      📝  ...

       

      메뉴바에서 ...에서 누르면  윈도우 os에서 지원하는 창을 띄울것이다. ... 표시는 일종의 사용자 배려이다.

      ... 표시가 있으면 새 창이 띄워지는 것은 일종의 약속이다.

       

      😊정리

      저장하기 위해 OS에서 지원하는 창을 띄울 것이다.

      사용자가 창에서 위치를 누르고 '저장'버튼을 누르면 프로그램에 경로를 가지고 와서

      java 프로그램에서 사용자가 창을 통해 전달한 경로를 통해 저장해준다.

       

    Designed by Tistory.