仿windows記事本(Java版)

Notepad_Java_Version.png

這個(gè)小玩意兒是寒假第二個(gè)小工程了,用了兩個(gè)晚上搞定。第一個(gè)是我的個(gè)人博客頁(yè)面的重寫,歡迎去踩O(∩_∩)Ohttp://taxuewwl.github.io。

這次還是使用了Java編寫,使用了swing,雖然是線程不安全的,不過(guò)比起awt還是有很多優(yōu)點(diǎn)的。

第一個(gè)版本實(shí)現(xiàn)了文檔的打開(kāi)、關(guān)閉、編輯以及保存?;旧蠈?shí)現(xiàn)了一個(gè)記事本所具有的主要功能。廢話不多說(shuō),用代碼進(jìn)行講解吧。

import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.swing.*;
public class MainFrame extends JFrame{
    //設(shè)置組件
    private JMenuBar menuBar;
    private JMenu fileMenu;
    private JMenu helpMenu;
    private JTextArea jTextArea;
    private JScrollPane jScrollPane;
    private JMenuItem openItem, closeItem, saveItem,aboutItem;
    private FileDialog open,save;
    private File file;  
    
    MainFrame() {
        Init();
    }

這段代碼基本上交代了我的想法,將界面的設(shè)置以及組件添加放到一個(gè)方法中,便于后續(xù)修改及新功能添加。

能看到主要聲明了下拉菜單及其菜單項(xiàng),一個(gè)文本框以及右側(cè)滾動(dòng)條。

public void Init(){
    JFrame frame = new JFrame("記事本·偽");
    frame.setBounds(300, 300, 700, 450);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    menuBar = new JMenuBar();//菜單欄
    fileMenu = new JMenu("文件");
    helpMenu = new JMenu("幫助");
    jTextArea = new JTextArea(10, 40);
    Font x = new Font("Monospaced",1,20);
    
    jTextArea.setFont(x);
    jTextArea.setLineWrap(true);//到達(dá)指定寬度則換行
    //應(yīng)當(dāng)首先利用構(gòu)造函數(shù)指定JScrollPane的控制對(duì)象,此處為JTextArea,然后再添加JScrollPane
    //添加進(jìn)面板
    jScrollPane = new JScrollPane(jTextArea);
    //設(shè)置滾動(dòng)條自動(dòng)出現(xiàn)
    jScrollPane.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
    jScrollPane.setViewportView(jTextArea);
    openItem = new JMenuItem("打開(kāi)");
    saveItem = new JMenuItem("保存");
    closeItem = new JMenuItem("關(guān)閉");
    aboutItem = new JMenuItem("關(guān)于");
    //添加兩個(gè)選項(xiàng)卡到JMenu
    //添加字菜單項(xiàng)到菜單項(xiàng)
    menuBar.add(fileMenu);
    menuBar.add(helpMenu);
    fileMenu.add(openItem);
    fileMenu.add(saveItem);
    fileMenu.add(closeItem);        
    helpMenu.add(aboutItem);
    //放置菜單項(xiàng)及輸入框
    frame.add(menuBar, BorderLayout.NORTH);
    frame.add(jScrollPane, BorderLayout.CENTER);
    
    
    //添加對(duì)話框,參見(jiàn)API文檔Dialog構(gòu)造方法  ;
    //FileDialog 類顯示一個(gè)對(duì)話框窗口,用戶可以從中選擇文件。 
    //由于它是一個(gè)模式對(duì)話框,當(dāng)應(yīng)用程序調(diào)用其 show 方法來(lái)顯示對(duì)話框時(shí),它將阻塞其余應(yīng)用程序,直到用戶選擇一個(gè)文件。 
    open = new FileDialog(frame,"打開(kāi)文檔",FileDialog.LOAD);
    save = new FileDialog(frame,"保存文檔",FileDialog.SAVE); 
    
    Event();
    frame.setVisible(true);
}

這一堆代碼是將組件添加進(jìn)了面板,由于是swing,便使用了JFrame,自帶部分事件監(jiān)聽(tīng),因此設(shè)置了關(guān)閉方式為EXIT_ON_CLOSE。

這里有一個(gè)小插曲,糾結(jié)了二十分鐘。

問(wèn)題發(fā)生在JScrollPane的添加。我原來(lái)的想法是將其指定為文本框的一個(gè)子組件,然后再將文本框添加到框架中。代碼如下

jScrollPane = new JScrollPane(jTextArea);
Container container=frame.getContentPane();
container.add(scroll,BorderLayout.EAST);

但是我這樣做之后發(fā)現(xiàn)滾動(dòng)條被文本框覆蓋。想到是否為添加順序問(wèn)題,便進(jìn)行了幾次調(diào)整,發(fā)現(xiàn)問(wèn)題依舊。

查找API文檔后才發(fā)現(xiàn)是我的想法錯(cuò)了,應(yīng)當(dāng)為JScrollPane指定目標(biāo),然后添加JScrollPane,也就是說(shuō)我的想法正好是相反的。修改后的代碼如下

jScrollPane = new JScrollPane(jTextArea);
...
frame.add(jScrollPane, BorderLayout.CENTER);

接著看代碼

        public void Event() {
            closeItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
            
        aboutItem.addActionListener(new ActionListener() {      
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "仿記事本\n實(shí)現(xiàn)打開(kāi),關(guān)閉,保存及編輯文本\n"
                        + "made by SnoWalker(踏雪無(wú)痕)\nwudi911psyou@gmail.com");
            }
        });
        
         openItem.addActionListener(new ActionListener()//菜單條目監(jiān)聽(tīng):打開(kāi)  
            {  
                public void actionPerformed(ActionEvent e)  
                {  
                    open.setVisible(true);  
                    String dirPath = open.getDirectory();//獲取對(duì)話框目錄;FileDialog類的方法  
                    String fileName= open.getFile();    //獲取對(duì)話框選定文件  
                    if(dirPath==null || fileName==null) //點(diǎn)取消  
                        return; 
                    
                    jTextArea.setText("");//打開(kāi)文件之前清空文本區(qū)域  
                    
                    file = new File(dirPath,fileName);  
                    try  
                    {  
                        BufferedReader br = new BufferedReader(new FileReader(file));  
                        String line = null;  
                        while ((line=br.readLine()) !=null)  
                        {  
                            //將給定文本追加到文檔結(jié)尾。如果模型為 null 或者字符串為 null 或空,則不執(zhí)行任何操作。 
                            //雖然大多數(shù) Swing 方法不是線程安全的,但此方法是線程安全的。
                            jTextArea.append(line+"\r\n");  
                        }  
                    }  
                    catch (IOException ie){  
                        throw new RuntimeException("讀取失?。?);  
                    }  
                }  
            });  
         
            saveItem.addActionListener(new ActionListener()//菜單條目監(jiān)聽(tīng):保存  
            {     
                public void actionPerformed(ActionEvent e)  
                {  
                    if(file==null)  
                    {  
                        save.setVisible(true);  
                        String dirPath = save.getDirectory();  
                        String fileName= save.getFile();  
                        if(dirPath==null || fileName==null)  
                            return;  
                        file = new File(dirPath,fileName);                
                    }  
                    try  
                    {  
                        BufferedWriter bw = new BufferedWriter(new FileWriter(file));  
                        String text = jTextArea.getText();  
                        bw.write(text);  
                        bw.close();  
                    }  
                    catch (IOException ex)  
                    {  
                        throw new RuntimeException();  
                    }  
                }  
            });  
    }
    
    public static void main(String[] args){
        new MainFrame();
    }
}

這一段是為組件(主要是菜單)添加事件監(jiān)聽(tīng),實(shí)現(xiàn)文件的打開(kāi),關(guān)閉以及寫入。

由于使用了文件io,因此會(huì)拋出異常。詳細(xì)的分析在注釋中寫的很清楚了,此處不再贅述。

小結(jié):

這個(gè)小程式使用了swing圖形界面編程,并用到了文件io以及異常的捕獲,基本實(shí)現(xiàn)了一個(gè)記事本的功能,后續(xù)會(huì)添加新的功能使其更為完善。

PS:有意見(jiàn)或建議以及與我交流的朋友歡迎發(fā)送郵件到

wudi911psyou@gmail.com

本項(xiàng)目的github地址:https://github.com/TaXueWWL/Notepad_Java_version

于1.28

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,327評(píng)論 4 61
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,041評(píng)論 25 709
  • 近來(lái)情緒是有點(diǎn)不穩(wěn)定的,心情有點(diǎn)浮躁,每天正常上班下班,時(shí)間穩(wěn)定,倆點(diǎn)一線,我的煩惱,具體也說(shuō)不上來(lái),可我知...
    落酉閱讀 199評(píng)論 0 0
  • 從劇情到色調(diào),典型的日式電影。 電影講述了一個(gè)得了腦瘤第二天就要死掉的男主人公,遇到了和自己長(zhǎng)得一模一樣的惡魔。惡...
    left的奇思妙想閱讀 694評(píng)論 0 51
  • 藉此懷念南國(guó)朋友。 燈影映池塘,風(fēng)荷瀲滟光。 釣娃專釣況,新婦走新廊。 深夜蛩聲冷,羈人意氣張。 幽幽思友處,脈脈...
    晴鶴1閱讀 343評(píng)論 9 3

友情鏈接更多精彩內(nèi)容