記事本的打開與保存
一些總結
* Swing中有時方法不顯示,需要把方setVisible(true)放到最后執行
* AWT中的TextArea默認是中間布局
* fileDialog對話框Load模式需要對取消事件進行處理
* 快捷鍵使用需要用到JmenuItem
主方法
package cn.work.demo.demo03;
public class NotePad {
public static void main(String[] args) {
NotepadWindow MyNotePad = new NotepadWindow();
//生成窗體
MyNotePad.frameWindow();
}
}
窗口面板
package cn.work.demo.demo03;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
public class NotepadWindow {
//靜態文本區域對象,由該類調用
static TextArea textArea;
//記事本窗體
public void frameWindow() {
//新建一個JFrame窗體,並為其實現Swing程序中的各個組件
JFrame frame = new JFrame("記事本");
//窗口大小
frame.setSize(1200,680);
//設置窗口在屏幕的位置,null居中
frame.setLocationRelativeTo(null);
//設置關閉響應,直接關閉
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//添加記事本的文本區域
addTextArea(frame);
//添加窗口的菜單項
addMenu(frame);
//窗口可見
frame.setVisible(true);
}
//記事本的文本區域
private void addTextArea(JFrame frame) {
textArea = new TextArea();
//設置字體顯示格式
textArea.setFont(new Font("宋體",Font.PLAIN,23));
frame.add(textArea);
}
//記事本的菜單
private void addMenu(JFrame frame) {
//使用Swing工具包替代AWT,方便添加快捷鍵
//創建菜單欄對象
JMenuBar menuBar = new JMenuBar();
//創建“文件”菜單
JMenu file = new JMenu("文 件");
// 創建 打開 菜單選項
JMenuItem open = new JMenuItem("打開文件 ");
open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
java.awt.Event.CTRL_MASK));
// 創建 保存 菜單選項
JMenuItem save = new JMenuItem("保存文件 ");
save.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S,java.awt.Event.CTRL_MASK));
//把菜單欄添加到窗口上
frame.setJMenuBar(menuBar);
//把file添加到菜單欄中
menuBar.add(file);
//將選項添加進file中
file.add(open);
file.add(save);
//給 打開 添加OpenActionListener監聽器
open.addActionListener(new OpenActionListener(frame));
//給 保存 SaveActionListener監聽器
save.addActionListener(new SaveActionListener(frame));
}
}
"打開"監聽器
package cn.work.demo.demo03;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
// "打開" 監聽器從硬盤文件中讀入內容
public class OpenActionListener implements ActionListener {
//定義一個窗體容器用來接受傳入的窗體
private JFrame frame;
//構造方法接受傳送進來的窗體
OpenActionListener(JFrame frame){
this.frame = frame;
}
//必須要重寫ActionListener的抽象方法,寫入事件發生后需要執行的內容
@Override
public void actionPerformed(ActionEvent e) {
//創建一個文件對話框,默認load,傳入對話框窗體frame
FileDialog fileDialog = new FileDialog(frame);
//顯示文件選擇對話框
fileDialog.setVisible(true);
//獲取選擇的目錄路徑
//獲取選擇的文件名
//獲取文件的絕對路徑
String absPath = fileDialog.getDirectory() + fileDialog.getFile();
//如果選中文件,但點擊了取消,會得到null直接返回null,不影響后續操作
if(fileDialog.getFile() == null){
System.out.println(fileDialog.getFile());
return;
}
BufferedReader bufre = null;
//try catcah 處理編譯異常
try {
//創建字符緩沖輸入流對象,構造方法由字符輸入流綁定輸入地址
bufre = new BufferedReader(new FileReader(absPath));
//創建字節數組,存儲讀入的數據
char[] chars = new char[1024];
//len為讀取的有效位數
int len = 0;
//打開前清空文本區域
NotepadWindow.textArea.setText("");
//使用read讀取內容
while ((len = bufre.read(chars)) != -1) {
//提取每次讀的字符,生成字符串
String str = new String(chars,0,len);
//拼接每一次得到的字符串
NotepadWindow.textArea.append(str);
}
bufre.close();
}catch(IOException obj){
//獲取異常信息
obj.getMessage();
}
}
}
“保存”監聽器
package cn.work.demo.demo03;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
// "保存" 監聽器從硬盤文件中讀入內容
public class SaveActionListener implements ActionListener{
//定義一個窗體容器用來接受傳入的窗體
private JFrame frame;
//構造方法接受傳送進來的窗體
SaveActionListener(JFrame frame){
this.frame = frame;
}
@Override
public void actionPerformed(ActionEvent e) {
//創建一個文件對話框,傳入對話框窗體frame
FileDialog fileDialog = new FileDialog(frame);
//設置為SAVE模式
fileDialog.setTitle("保存");
fileDialog.setMode(FileDialog.SAVE);
//顯示文件選擇對話框
fileDialog.setVisible(true);
//獲取保存的目錄路徑
String absPath = fileDialog.getDirectory() +fileDialog.getFile();
BufferedWriter bufw = null;
try {
//字符緩沖輸出流,構造方法傳入字符輸出流綁定輸出路徑
bufw = new BufferedWriter(new FileWriter(absPath));
String str = NotepadWindow.textArea.getText();
//向文件寫入數據
bufw.write(str);
//關閉並刷新輸出流
bufw.close();
}catch (IOException obj){
obj.getMessage();
}
}
}
- bug:swing編程時而不顯示菜單選項,改變語句順課序解決,后查閱資料需要將可見性設置在邏輯最后。