最近在看Sindar的Java课的作业,遇到了Java的GUI编程,每次遇到GUI这种就很头疼,C++的,MatLab的,都不是很会用。弄了差不多一天吧,因为安装的是jdk12而无法运行applet,重装了jdk1.8才行,写前面的一两个小实验题加重装环境基本上花了一个上午233。
虽然说我写出来了这个东西,不过也是东拼西凑,自己实际上不是很清楚内在的逻辑(毕竟一天之前我对JavaGUI一无所知)
主要使用的是Frame,然后之前一直不理解的地方是自己要怎么写保存文件的时候那个窗口,后来发现原来是系统提供的现成的,舒服233.
大体思路:先搭建一个菜单,一个文本域,然后对于菜单的每种操作再写一个处理函数。
有点问题就是,没有实现新建,不过从操作上来说,可以分解成先另存为再保存,或者直接在当前文本域编辑再另存为(不过没注意按了保存就会覆盖掉当前内容,比较危险)
基本的内容还是实现了
顺便IDEA还是np,觉得自己以前用DevC++属实是和用记事本一样(x
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;class FileMenu extends Menu{//FileMenu的内容public FileMenu(ActionListener action){super("File");MenuItem mi1,mi2,mi3,mi4;mi1=(new MenuItem("Save as"));mi2=(new MenuItem("Save"));mi3=(new MenuItem("Open"));mi4=(new MenuItem("Exit"));mi1.addActionListener(action);//添加监听,点击的时候才能捕捉到mi2.addActionListener(action);mi3.addActionListener(action);mi4.addActionListener(action);add(mi1);add(mi2);add(mi3);addSeparator();add(mi4);}
}class FontMenu extends Menu{//FontMenu的内容public FontMenu(ActionListener action){super("Font");MenuItem mi1,mi2,mi3,mi4,mi5;mi1=new MenuItem("TimesRoman");mi2=new MenuItem("Comic Sans MS");mi3=new MenuItem("consolas");mi4=new MenuItem("Increase font size");mi5=new MenuItem("Decrease font size");mi1.addActionListener(action);//添加监听mi2.addActionListener(action);mi3.addActionListener(action);mi4.addActionListener(action);mi5.addActionListener(action);add(mi1);add(mi2);add(mi3);addSeparator();add(mi4);add(mi5);}
}public class Solution extends Frame implements ActionListener{private String strFont="consolas";//记录字体,以便换字体private int Fontsize=30;//字体大小private JTextArea jt2;//文本域private JFrame jf;//窗口private String path="";//记录路径,以便保存private String filename="";//记录文件名,以便保存private Solution(){//搭建基础框架jt2=new JTextArea();//new一个文本区String title = "记事本";jf=new JFrame(title);MenuBar mb=new MenuBar();//新建一个菜单栏FileMenu fileMenu=new FileMenu(this);//搭建两个Menumb.add(fileMenu);FontMenu fontMenu=new FontMenu(this);mb.add(fontMenu);jf.setMenuBar(mb);//菜单栏放上去jf.setVisible(true);//窗体可见jf.setSize(600, 400);//窗体大小jf.setLayout(new BorderLayout());//边界布局jf.add(BorderLayout.CENTER,jt2);//文本框边界中间放置jt2.setBackground(Color.white);jt2.setFont(new Font(strFont,Font.PLAIN,Fontsize));}public void SaveAsAction(){//Save动作的处理FileDialog fd = new FileDialog(jf, "Save as", FileDialog.SAVE);fd.setVisible(true);path = fd.getDirectory();//获取路径filename = fd.getFile();//获取文件名try {FileOutputStream out = new FileOutputStream(path + filename, false);String s = jt2.getText();//输出到文件byte[] b = s.getBytes();out.write(b);out.close();} catch (IOException ex) {System.out.println(ex);}}public void SaveAction(){//保存的处理if (path.length() != 0) {try {FileOutputStream out = new FileOutputStream(path + filename, false);//这里flase是覆盖,否则是加到原文件末尾String s = jt2.getText();byte[] b = s.getBytes();out.write(b);out.close();} catch (IOException ex) {System.out.println(ex);}} else {JOptionPane jo = new JOptionPane();jo.showMessageDialog(null, "还没有将其保存到文件,请选择Save as将内容保存到文件");}}public void OpenAction(){//打开的处理FileDialog fd = new FileDialog(jf, "Open", FileDialog.LOAD);fd.setVisible(true);path = fd.getDirectory();filename = fd.getFile();if (path == null || filename == null) return;jt2.setText("");//清空当前的内容try {BufferedReader re = new BufferedReader(new FileReader(path + filename));//读取文件String s = null;while ((s = re.readLine()) != null) { //写入文本域jt2.append(s + "\r\n");//对于不同操作系统的回车处理}re.close();} catch (IOException e1) {e1.printStackTrace();}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();switch (arg) {case "Exit": //退出System.exit(0);case "Comic Sans MS": //三个if换字体strFont = "Comic Sans MS";break;case "TimesRoman":strFont = "TimesRoman";break;case "consolas":strFont = "consolas";break;case "Increase font size": //改变字体大小Fontsize = Fontsize + 3;break;case "Decrease font size":Fontsize = Fontsize - 3;break;case "Save as": { SaveAsAction();break; }//另存为,把文件内容导出存放case "Save": { SaveAction();break; }//保存文件内容,和另存为相似case "Open": { OpenAction();break; }//打开文件}jt2.setFont(new Font(strFont,Font.PLAIN,Fontsize));System.out.println(arg);}public void paint(Graphics g){g.setFont(new Font(strFont,Font.BOLD,Fontsize));g.drawString("",50,150);}public static void main(String[] args){new Solution();}
}