題目:編寫一個筆記本程序
要求:1.要有圖形化界面
2.能實現編輯、保存、修改、添加功能
3.使用文字輸入流
分析:
1.這個筆記本程序只能是我們個人的,所以得設置一個登錄程序,可不能讓其他人發現我們的小秘密
2.得有圖形化界面,就要用到JFrame
3.設計文件的讀寫,就要用到文件的操作File,和數據流的操作
4.文件的存儲我們以可以自定義文件名稱,然後創建對應的文件,並向裡面寫入我們需要保存的內容
開始編寫代碼:
大概分析了一波我們需要用到的技術點,現在我們就可以開始寫一點代碼了
首先我們需要做一個登錄界面,輸入登錄用戶名和密碼後和我們預先設好的用戶名和密碼做比較,輸入正確就打開筆記本列表,不正確則提示密碼或用戶名錯誤
/** * 登錄界面 * @param panel * @param jFrame */ private static void initLogin(JPanel panel,JFrame jFrame) {
//布局 panel.setLayout(null);
// 創建 JLabel 標籤 用戶名 JLabel userLabel = new JLabel("用戶名:"); //定義組件位置 x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小 userLabel.setBounds(10,20,80,25); panel.add(userLabel);
//創建輸入框組件 用戶名文本域 JTextField userText = new JTextField(20); userText.setBounds(100,20,165,25); panel.add(userText);
// 創建 JLabel 標籤 密碼 JLabel passwordLabel = new JLabel("密碼:"); passwordLabel.setBounds(10,50,80,25); panel.add(passwordLabel);
//創建輸入框組件 輸入密碼的文本域 這個類輸入的信息會以點號代替,用於包含密碼的安全性 JPasswordField passwordText = new JPasswordField(20); passwordText.setBounds(100,50,165,25); panel.add(passwordText);
// 創建登錄按鈕 JButton loginButton = new JButton("登錄"); loginButton.setBounds(120,100,80,25); panel.add(loginButton);
//為按鈕添加點擊事件,點擊後判斷用戶名和密碼正確性 loginButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String userName = userText.getText(); String password = String.valueOf(passwordText.getPassword()); if ("admin".equals(userName) && "123456".equals(password)){ jFrame.dispose(); //接著做後續操作 System.out.println("登錄成功"); //查詢文件列表 List<String> fileNameList = queryFile(); initNotbookList(fileNameList); }else{ //用戶密碼不對 tip("登錄用戶或密碼不正確"); } } }); }對了,還有個消息提示的方法(提示的方法是統一的,提示的內容可以根於具體的需要傳入即可),一個 提示框可以添加一些用戶的友好交互性
/** * 提示信息彈窗 * @param msg */ private static void tip(String msg){ JFrame tipFrame = new JFrame("提示");
tipFrame.setSize(220,100); //設置窗口生出位置 tipFrame.setLocationRelativeTo(null);
JLabel tipLabel = new JLabel(msg); tipLabel.setForeground(Color.red);
tipFrame.add(tipLabel); tipFrame.setVisible(true); }這裡會遇到一個問題:多個窗口的顯示與關閉,只要第一個窗口設置關閉事件,其他窗口不設置就行
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);好了!登錄寫好了,我們接著登錄以後的事情了!登錄成功後要跳轉到文件列表像是已經存在的筆記本文件,這裡得用到文件夾的讀取,以及獲取該文件夾下文件名稱列表,廢話不多說,上代碼
/** * 查詢文件夾下已存在的文件 * FilePath 為文件路徑,之前已設置為全局變量 * @return */ private static List<String> queryFile(){ File file = new File(FilePath); //判斷文件夾是否存在,不存在就先創建 if (!file.exists() || !file.isDirectory()){ //mkdir() : 創建此抽象路徑名指定的目錄。 //mkdirs() : 創建此抽象路徑名指定的目錄,包括創建必需但不存在的父目錄。 file.mkdir(); }
// 讀取目錄下的所有目錄文件信息 String[] files = file.list(); return Arrays.asList(files); }將獲取到文件列表利用循環和swing的按鈕JButton以按鈕的形式在圖形化界面上展示,之後做內容的顯示以及修改可以以按鈕的形式進行
/** * 初始化記事本列表 * @param fileName */ private static void initNotbookList(List<String> fileName){ // 創建 JFrame 實例 JFrame frame = new JFrame("筆記列表(點擊進入修改)"); // Setting the width and height of frame //設置窗口大小 frame.setSize(320, 200); //設置窗口生出位置 frame.setLocationRelativeTo(null); //添加關閉動作 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //創建JPanel 畫布實例 JPanel panel = new JPanel();
for (String name : fileName) { // 創建筆記列表按鈕 JButton fileButton = new JButton(name); fileButton.setBounds(120,100,80,25); panel.add(fileButton); frame.add(panel);
fileButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //讀入文件方法 } }); }
//這裡在添加兩個按鈕(一個添加的按鈕和退出的按鈕) // 設置添加按鈕 JButton addButton = new JButton("+"); addButton.setBounds(120,100,80,25); panel.add(addButton); frame.add(panel); addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { initNotbookMain("",""); } });
// 設置退出按鈕 JButton exitButton = new JButton("退出"); exitButton.setBounds(120,100,80,25); panel.add(exitButton); frame.add(panel); exitButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } });
// 設置界面可見 frame.setVisible(true); }程序取出後在圖形化界面上顯示
現在我們寫好了展示部分!接下來就是文件以及文件內容的存儲和回顯了;
照例,我們先弄個編輯頁面,代碼走著
private static void initNotbookMain(String fileName,String fileContent){ JFrame frame = new JFrame("筆記內容"); frame.setSize(280, 450); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel();
JLabel notbookTitle = new JLabel("標題:"); notbookTitle.setBounds(10,50,80,25); panel.add(notbookTitle);
JTextField notbookTitleText = new JTextField(20); notbookTitleText.setBounds(100,20,165,25); if (!"".equals(fileName)){ String name = fileName.substring(0,fileName.indexOf(".")); notbookTitleText.setText(name); } panel.add(notbookTitleText);
JLabel content = new JLabel("內容:"); content.setBounds(10,100,80,25); panel.add(content);
JTextArea contentText = new JTextArea(20,20); contentText.setLineWrap(true); panel.add(contentText); if(!"".equals(fileContent)){ contentText.setText(fileContent); }
JButton saveButton = new JButton("保存"); saveButton.setBounds(120,100,80,25); panel.add(saveButton);
JButton returnButton = new JButton("返回"); returnButton.setBounds(120,100,80,25); panel.add(returnButton); frame.add(panel);
saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { saveWorld(notbookTitleText.getText(), contentText.getText()); } }); returnButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { frame.dispose(); List<String> fileList = queryFile(); initNotbookList(fileList); } }); frame.setVisible(true); }還有一個保存方法
/** * 文件保存 * @param fileName * @param content */ private static void saveWorld(String fileName,String content){ //讀取文件 File file=new File(FilePath + fileName+".txt"); //判斷文件是否存在 if (!file.exists()){ //如果不存在就嘗試創建 try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } try { OutputStream os = new FileOutputStream(file); PrintWriter pw=new PrintWriter(os); pw.println(content); pw.close(); tip("內容保存成功"); }catch (Exception e){ System.out.println("寫入錯誤"); tip("內容保存失敗"); } }返回列表也有了
這麼一來,我們就是可以寫東西保存了,打開文件夾看下是否有了接著來修改的,之前我們做了文件的顯示,並且用了按鈕來實現,在每個按鈕的點擊事件上加上文件的讀取方法,再將文件回填到界面即可,修改一律調用保存的方法,照例,上代碼
fileButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { frame.dispose(); //用來接收的字符串 StringBuilder result = new StringBuilder(); //獲取文件內容 try {
//構造一個BufferedReader類來讀取文件 BufferedReader br = new BufferedReader(new FileReader(new File(FilePath + name))); String s = null; //使用readLine方法,一次讀一行 while((s = br.readLine())!=null){ result.append(System.lineSeparator()+s); } br.close(); }catch (Exception e1){ System.out.println("文件讀取錯誤"); } frame.dispose(); initNotbookMain(name,result.toString()); }});