最近在幫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();
}
}