最近在看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);//搭建两个Menu
mb.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();
}
}