반응형
[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);
}
}
}
반응형
'Dev > Java' 카테고리의 다른 글
[Java] socket서버 실시간 채팅 구현 ( jdk-11.0.12.7-hotspot ) (0) | 2021.12.13 |
---|---|
JDK 1.8 설치중 AdoptOpenJDK (OpenJ9) vs (Hotspot) (0) | 2021.02.18 |
Java 예제 - 로또 번호 만들기 ( random, array, nested For loop) (0) | 2020.09.10 |
Java - 숫자맞추기 게임 (Math.random(), .equals(), BufferedReader) (0) | 2020.09.09 |
Java 가위바위보 게임 ( Math.random(), System.in.read() ) (0) | 2020.09.08 |