學習swing不久,想寫個記事本,才疏學淺,請多指教。
目前實作了建立、打開、儲存、複制粘貼的基本功能,查找替換等功能日後再實作吧,java的String類應該可以幫上忙,調用下API就行了吧。
package notepad;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.filechooser.FileNameExtensionFilter;
public class Main extends JFrame {
private JTextArea jta = new JTextArea();
private JScrollPane jsp = new JScrollPane(jta);// 建立滾動文本框
private JMenuBar jmb = new JMenuBar();
private JMenu jm1 = new JMenu("File");
private JMenu jm2 = new JMenu("Edit");
private JMenu jm3=new JMenu("Help");
private JMenuItem newFile = new JMenuItem("New");
private JMenuItem openFile = new JMenuItem("Open");
private JMenuItem saveFile = new JMenuItem("Save");
private JMenuItem saveFileAs = new JMenuItem("SaveAs");
private JMenuItem exit = new JMenuItem("Exit");
private JPopupMenu jpm = new JPopupMenu();
private JMenuItem copy = new JMenuItem("Copy");
private JMenuItem paste = new JMenuItem("Paste");
private JMenuItem cut = new JMenuItem("Cut");
private JMenuItem version =new JMenuItem("Version");
private String tmp = "";
private String address = "";
private boolean modified = false;
public Main() {
setLayout(new BorderLayout());
/*
* 建立右鍵菜單
*/
jpm.add(copy);
jpm.add(paste);
jpm.add(cut);
copy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (!jta.getSelectedText().equals("")) {
modified = true;
jta.copy();
}
}
});
paste.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
jta.paste();
modified = true;
}
});
cut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (!jta.getSelectedText().equals("")) {
modified = true;
jta.cut();
}
}
});
/*
* 菜單欄
*/
//File
jm1.add(newFile);
jm1.add(openFile);
jm1.add(saveFile);
jm1.add(saveFileAs);
jm1.add(exit);
newFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
jta.setText("");
modified = false;
}
});
openFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
/*
* 檔案選擇器
*/
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"文本文檔", "txt");// 過濾器
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(getParent());
if (returnVal == JFileChooser.APPROVE_OPTION) {// 如果點選取消則不會産生異常
address = chooser.getSelectedFile().getAbsolutePath();
try {
Scanner sin = new Scanner(chooser.getSelectedFile());
StringBuffer sb = new StringBuffer();
while (sin.hasNextLine())
sb.append(sin.nextLine());
sin.close();
jta.setText(sb.toString());
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "FileNotFound!");
}
}
modified = false;
}
});
saveFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (saveFile(address, jta.getText()))
modified = false;
}
});
saveFileAs.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (saveFile("", jta.getText()))
modified = false;
}
});
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (!modified)
System.exit(0);
else {
int sav = JOptionPane.showConfirmDialog(null,
"You have modified the text!\nSave Or Not?");
switch (sav) {
case JOptionPane.OK_OPTION:
saveFile(address, jta.getText());
System.exit(0);
case JOptionPane.NO_OPTION:
System.exit(0);
default:
}
}
}
});
//Edit
jm2.add(copy);
jm2.add(paste);
jm2.add(cut);
//Help
jm3.add(version);
version.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, "JNotePad\n"
+ "作者:獨孤九劍\n"
+ "版本:1.0\n"
+ "感想:求知欲是治愈無聊的良方,求知欲本身無藥可治。");
}
});
jmb.add(jm1);
jmb.add(jm2);
jmb.add(jm3);
add(jmb, BorderLayout.NORTH);
/*
* 建立具有滾動、自動換行功能的文本框
*/
jta.setLineWrap(true);// 自動換行
jta.setWrapStyleWord(true);// 對單詞自動換行
add(jsp, BorderLayout.CENTER);
jta.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent arg0) {
if (arg0.getButton() == MouseEvent.BUTTON3)// 左中右鍵分别是BUTTON1、2、3
jpm.show(jta, arg0.getX(), arg0.getY());
}
});
jta.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
modified = true;
}
});
}
public static boolean saveFile(String address, String text) {
// 若不存在,則建立
if (address.equals("")) {
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"文本文檔", "txt");// 過濾器
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {// 如果點選取消則不會産生異常
// 如果目前是文本格式儲存,并且沒有txt字尾則自動添加
address = chooser.getSelectedFile().getAbsolutePath();
if ((!address.endsWith(".txt"))
&& (chooser.getFileFilter() == filter))
address += ".txt";
} else
return false;
}
// 儲存
try {
PrintWriter pw = new PrintWriter(new File(address));
pw.println(text);
pw.close();
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "FileNotFound!");
return false;
}
return true;
}
public static void main(String[] args) {
Main main = new Main();
main.setSize(600, 400);
main.setLocationRelativeTo(null);
main.setVisible(true);
main.setTitle("NotePad");
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}