java Swing 实现记事本

这是一个基于Java Swing的简单记事本程序实现。它包括文件操作(新建、打开、保存、另存为)、编辑功能(复制、剪切、粘贴、全选)以及自定义字体设置。程序还实现了右键菜单功能,并提供了帮助和关于窗口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*   
    Copyright (C) 2017 mzy  <1344874077@qq.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
*/

package notepad;

import java.awt.Color;

/**
 *
 * @author 半步疯子
 * @version 1.0
 */

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.filechooser.FileNameExtensionFilter;


public class Notepad extends JFrame implements ActionListener{
	public static void main(String[] args) {
		new Notepad();
		
	}
	
	private static final long serialVersionUID = -2843137103983861960L;
	JTextArea text; // 必须使用JTextArea  不然第二次显示会出问题
	
	
	public Notepad(){
		notepadUI();
		setVisible(true); // setVisible 为true的时候是显示前面添加在JFrame上在组建,所以需要放在最后面
		
	}
	private void notepadUI() {
		// 设置基本属性   
		setTitle("MZY记事本");
		setSize(600, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		
		setIconImage(new ImageIcon("icon/notepad.png").getImage());
		// setIconImage(new ImageIcon(getClass().getResource("icon/notepad.png")).getImage());//图标放在源目录的icon文件夹
		Container cp = getContentPane();
		// 怎么将JMenuItem显示在container层上
		text = new JTextArea();
		text.setFont(new Font("新宋体",Font.PLAIN, 24));
		cp.add(new JScrollPane(text));
	
		String[] captions = {"文件(F)","编辑(E)","格式(O)","帮助(H)"};
		String[][] titles = {
				{"新建","打开...","保存","另存为...", "-", "退出"},
				{"复制","剪切","粘贴","全选"},
				{"字体(F)..."},
				{"帮助","-","关于记事本"}
		};
		// JMenuBar ->  
		JMenuBar menuBar = new JMenuBar();
		JMenu menu;
		JMenuItem item;
		for(int i =0; i<captions.length; i++){
			menu = new JMenu(captions[i]);
			menu.setFont(new Font("黑体",Font.PLAIN, 20));
			menuBar.add(menu);
			for(int j=0; j<titles[i].length; j++ ){
				String caption = titles[i][j];
				if("-".equals(caption)){
					menu.addSeparator(); // 给menuItem加一个分隔符
					continue;
				}
				item = new JMenuItem(titles[i][j]);
				item.setPreferredSize(new Dimension(120, 35));
				item.setFont(new Font("黑体",Font.PLAIN, 18));
				// item.setBorder(BorderFactory.createLineBorder(Color.black,3));
				menu.add(item);
				item.addActionListener(this);
			}
		}
      this.setJMenuBar(menuBar);
      
      final JPopupMenu rightClick = new JPopupMenu();
      // rightClick.setBackground(Color.GRAY);
      rightClick.setPreferredSize(new Dimension(100, 150));
      JMenuItem cut = new JMenuItem("剪切");
      JMenuItem copy = new JMenuItem("复制");
      JMenuItem paste = new JMenuItem("粘贴");
      JMenuItem selectAll = new JMenuItem("全选");
      cut.setFont(new Font("黑体",Font.PLAIN, 18));
      copy.setFont(new Font("黑体",Font.PLAIN, 18));
      paste.setFont(new Font("黑体",Font.PLAIN, 18));
      selectAll.setFont(new Font("黑体",Font.PLAIN, 18));
      
      rightClick.add(cut).addActionListener(this);
      rightClick.add(copy).addActionListener(this);
      rightClick.add(paste).addActionListener(this);
      rightClick.addSeparator();
      rightClick.add(selectAll).addActionListener(this);
      
      text.add(rightClick);
      text.addMouseListener(new MouseAdapter() {
          public void mouseReleased(MouseEvent e) {
              if (e.getButton() == MouseEvent.BUTTON3) {
            	  rightClick.show(text, e.getX(), e.getY());
              }
          }
      });
      
	}
	/**
	 * about my mylistener
	 */
	String pathOld;
	
	@SuppressWarnings("resource")
	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();
		if("新建".equals(s)) {
			text.setText("");
			pathOld = null;
		}
		if("退出".equals(s)) {
			this.dispose();
		}
		if("字体(F)...".equals(s)) {
			new MyFormat(text);
		}
		if("另存为...".equals(s)) {
			aboutSave();
		}
		if("保存".equals(s)) {
			PrintStream printStream = null;
			if(null != pathOld) {
				try {
    				printStream = new PrintStream(pathOld);  // printStream 
    				System.setOut(printStream); // 改变输出流的位置
                    System.out.println(text.getText()); // 将内容打印输出到目标文件上
    			} catch (FileNotFoundException e1) {
    				e1.printStackTrace();
    			} finally {
    				if(null != printStream) {
    					printStream.close();
    				}
    			}
			} else {
				aboutSave();
			}
		}
		
		if("打开...".equals(s)) {
            JFileChooser chooser = new JFileChooser();
            // FileNameExtensionFilter filter = new FileNameExtensionFilter("文本文档(*.txt)", "txt");
            // chooser.setFileFilter(filter);
            chooser.setDialogTitle("文件打开");
            int choose = chooser.showOpenDialog(null);
            // chooser.setVisible(true);

            if(JFileChooser.APPROVE_OPTION  == choose){
            	pathOld= chooser.getSelectedFile().getPath();
                FileReader reader = null;
    			try {
    				reader = new FileReader(pathOld);
    				BufferedReader bufferReader = new BufferedReader(reader);
                    String temp = "", target = "";
                    while ((temp = bufferReader.readLine()) != null) {
    					target += (temp + "\n");
    				}
                    text.setText(target);
    			} catch (FileNotFoundException e1) {
    				e1.printStackTrace();
    			} catch (IOException e1) {
    				e1.printStackTrace();
    			} finally {
    				if(null != reader) {
    					try {
    						reader.close();
    					} catch (IOException e1) {
    						e1.printStackTrace();
    					}
    				}
    			}
            } 
        }
		
		// {"复制","剪切","粘贴","全选","反向选择"},
		if ("剪切".equals(s)) {
            text.cut();
        }
		if ("复制".equals(s)) {
            text.copy();
        }
		if ("粘贴".equals(s)) {
            text.paste();
        }
        if ("全选".equals(s)) {
            text.selectAll();
        }
		
		if("关于记事本".equals(s)) {
			new AboutMyNotepad();
		}
		if("帮助".equals(s)) {
			new AboutHelp();
		}
	}
	
	private void aboutSave() {
		JFileChooser  chooser = new JFileChooser();
		FileNameExtensionFilter filter = new FileNameExtensionFilter("文本文档(*.txt)", "txt");
		chooser.setFileFilter(filter);
        chooser.setDialogTitle("另存为");
        int choose = chooser.showSaveDialog(null);
        // chooser.setVisible(true);
        
        PrintStream printStream = null;
        // getSelectedFile返回选中的文件(得到一个File对象)再调用File的getPath方法
        // getPath返回值为String类型的 抽象路径名
       
        if(JFileChooser.APPROVE_OPTION  == choose){
        	String select = chooser.getSelectedFile().getPath();
            try {
				printStream = new PrintStream(select);  // printStream 
				System.setOut(printStream); // 改变输出流的位置
                System.out.println(text.getText()); // 将内容打印输出到目标文件上
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			} finally {
				if(null != printStream) {
					printStream.close();
				}
			}
        }
	}
}



class MyFormat extends JDialog implements ActionListener{

	private static final long serialVersionUID = 1L;
	
	public static int style = 0;
	public static int bounds = 16;
	public static Font font = new Font("黑体", style, bounds);
	
	JTextArea text;
	
	Container cp = getContentPane();

	// notrh
	
	
	// center
	
	GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();// 获取系统中可用的字体的名字
	String[] fontName = e.getAvailableFontFamilyNames();
	String[] fontStyle = {"常规", "倾斜", "粗体", "粗斜"};
	JList<String> fontList = new JList<String>(fontName);
	JList<String> StyleList = new JList<String>(fontStyle);
	// SpinnerNumberModel(Number value, Comparable minimum, Comparable maximum, Number stepSize) 
	SpinnerModel spinnerModel = new SpinnerNumberModel(bounds, 0, 80, 2);
	JSpinner spinner = new JSpinner(spinnerModel); // 上下的小箭头
	
	// south
	
	JButton ok = new JButton("确定");
	JButton cancel = new JButton("取消");

	
	MyFormat(JTextArea text){
		this.text = text;
		setIconImage(new ImageIcon("icon/notepad.png").getImage());
		
		cp.setPreferredSize(new Dimension(500, 300));
        cp.setLayout(null);
		
		JLabel l2 = new JLabel("字形");
		JLabel l1 = new JLabel("字体");
		JLabel l3 = new JLabel("大小");
		l1.setFont(new Font("华文行楷",Font.BOLD, 28));
		l2.setFont(new Font("华文行楷",Font.BOLD, 28));
		l3.setFont(new Font("华文行楷",Font.BOLD, 28));
	
		l1.setBounds(40, 20, 140, 35);
		l2.setBounds(215, 20, 120, 35);
		l3.setBounds(360, 20, 75, 35);
		cp.add(l1);
		cp.add(l2);
		cp.add(l3);
		
		StyleList.setFont(new Font("新宋体",0 , 18));
		JScrollPane j2 = new JScrollPane(StyleList);
		
		
		fontList.setFont(new Font("新宋体",0 , 12));
		JScrollPane j1 = new JScrollPane(fontList);
		
		
		spinner.setFont(new Font("新宋体",1 , 18));
		
		j1.setBounds(40, 75, 150, 175);
		j2.setBounds(215, 75, 80, 120);
		spinner.setBounds(360, 75, 45, 50);
		cp.add(j1);
		cp.add(j2);
		cp.add(spinner);
		
		ok.addActionListener(this);
		cancel.addActionListener(this);
		cp.add(ok);
		cp.add(cancel);
		
		ok.setBounds(245, 240, 80, 30);
		cancel.setBounds(380, 240, 80, 30);
		
		setTitle("字体");
		setVisible(true);
        setLocationRelativeTo(null);
        setResizable(false); // 设置为大小不可变的
		pack(); // 调整计算全部都可显示的大小  这一句必须放在最后不然没法显示
	}
	
	public void actionPerformed(ActionEvent e) {	
		String s = e.getActionCommand();
		if("确定".equals(s)) {
			style = myGetType();
			bounds = Integer.parseInt(spinner.getValue().toString());
			font = new Font((String)fontList.getSelectedValue(), style, bounds);
			text.setFont(font);
			this.dispose();
		}
		if("取消".equals(s)) {
			dispose();
		}
	}
	
	private int myGetType() {
		if("常规".equals(StyleList.getSelectedValue())) {
			return 0;
		} else if("倾斜".equals(StyleList.getSelectedValue())) {
			return 1;
		} else if("粗体".equals(StyleList.getSelectedValue())) {
			return 2;
		} else if("粗斜".equals(StyleList.getSelectedValue())) {
			return 3;
		}
		return 0;
	}
}

class AboutHelp extends JDialog {// 关于窗口
	
	private static final long serialVersionUID = 1L;

	AboutHelp() {
		
		JTextArea t = new JTextArea();
		t.setFont(new Font("微软雅黑",1 , 16));
		String s = "   作者:半步疯子          "
				+ "实现功能均可点击 :"
				+ "右键点击也可操作";
				
        t.setText(s);
        t.setEditable(false);
        add(t);
        setIconImage(new ImageIcon("icon/notepad.png").getImage());
        setSize(480, 100);
        setVisible(true);
        setLocationRelativeTo(null);
        setResizable(false); // 设置为大小不可变的
  
	}
}

class AboutMyNotepad extends JDialog {// 关于窗口
	
	private static final long serialVersionUID = 1L;

	AboutMyNotepad() {
		
		JTextArea t = new JTextArea();
		t.setFont(new Font("微软雅黑",1 , 16));
		String s = "   作者:半步疯子          "
				+ "版本:mzy1.0     "
				+ " 联系:1344874077@qq.com";
        t.setText(s);
        t.setEditable(false);
        add(t);
        setIconImage(new ImageIcon("icon/notepad.png").getImage());
        setSize(550, 100);
        setVisible(true);
        setLocationRelativeTo(null);
        setResizable(false); // 设置为大小不可变的
  
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值