一、GUI——圖形化界面,人與計算機交流的橋樑。java.awt:重量級控件,需要調用本地系統方法實現。javax.swing:輕量級控件,完全由java實現,增強可移植性。
二、佈局管理器:容器中組件的排放方式。
- 流式佈局(FlowLayout):從左到右佈局;
- 邊界式佈局(BorderLayout):上北下南左西右東,不指定方位,填充整個區域,是默認的佈局方式。
- 網格式佈局(GridLayout):比如計算器式佈局;
- 網格包式佈局(GridBagLayout):組件佔多個格子;
卡片式佈局(CardLayout):比如屬性佈局。
注:當一個窗體涉及多個佈局方式時,需先將窗體用面板(Panel)劃分,再添加組件。
三、GUI的製作步驟:1、創建Frame窗體;
&emso;2、對Frame窗體做基本設置,比如:大小、位置、佈局等;
3、創建組件;
4、用Frame的add功能將組件添加到Frame窗體中;
5、添加監聽器;
6、讓窗體顯示,f.setVisiable(true);
四、事件監聽機制:先確定事件源,確定事件,確定添加哪種監聽器,做出何種處理。
1、WindowListener:窗體事件監聽器,比如關閉窗體;
2、ActionListener:活動監聽器,活動事件;
3、MouseListener:鼠標監聽器,點擊(雙擊)、滑過、移出、按下時、釋放時;
4、KeyListener:鍵盤監聽器:鍵入、按下時、釋放時。
五、練習
1、讀取目錄
/*
讀取目錄:
步驟:
1、先做出圖形界面;
2、再添加監聽器;
3、容錯處理;
4、添加鍵盤迴車事件。
其他說明:1、ta.setText():添加新內容時,之前的內容會被覆蓋;
ta.append():將內容追加到後面
2、TextField:創建時可以指定列數;
3、TextArea:創建時,參數列表:行數、列數;
4、Dialog:參數列表:所屬窗體,對話框名稱,狀態模式;
注:監聽器一個一個添加,添加一個測試一個,全部添加再測試問題不好找。
我添加的順序:窗體關閉監聽器、添加按鈕監聽器、對話框監聽器、文本框監聽器。
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class GuiTest
{
//基本的Frame窗體,及組件
private Frame f;
private TextField tf;
private Button b;
private TextArea ta;
//彈出對話框及裏面的組件
private Dialog d;
private Button okB;
private Label l;
GuiTest()
{
init();
}
public void init()
{
//創建Frame窗體
try
{
f = new Frame("my frame");
//對Frame窗體進行基本的設置
f.setBounds(300,200,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(54);
b = new Button("轉到");
ta = new TextArea(26,60);
//將組件添加到Frame窗體中
f.add(tf);
f.add(b);
f.add(ta);
//給窗體綁定事件
myEvent();
//顯示窗體
f.setVisible(true);
}
catch (Exception e)
{
throw new RuntimeException("窗體建立失敗");
}
}
//事件函數
public void myEvent()
{
//添加窗體關閉事件
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//添加按鈕事件
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
buttonEvent();
}
});
//添加文本框事件
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_ENTER)
{
buttonEvent();
}
}
});
}
//按鈕、回車鍵觸發的事件相同,所以提取出來
public void buttonEvent()
{
//獲取文本框內容,並將封裝成File對象
String dirPath = tf.getText();
File dir = new File(dirPath);
//如果是目錄,則將目錄下的文件名寫在文本區域
if(dir.exists() && dir.isDirectory())
{
ta.setText("");
String[] names = dir.list();
for(String name : names)
{
ta.append(name+"\r\n");
}
}
//如果不是目錄,彈出對話框
else
{
try
{
//建立對話框及組件
d = new Dialog(f,"提示",true);
okB = new Button("確定");
l = new Label();
//對對話框做基本設置
d.setBounds(500,300,200,100);
d.setLayout(new FlowLayout());
//想對話框中添加組件
d.add(l);
d.add(okB);
//想標籤裏添加文字
l.setText("目錄不存在,請重新輸入!");
//給對話框添加關閉對話框事件
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
//給確定按鈕對象添加關閉對話框的事件
okB.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
d.setVisible(true);
}
catch (Exception ie)
{
throw new RuntimeException("對話框添加失敗!");
}
}
}
public static void main(String[] args)
{
new GuiTest();
}
}
2、簡單的文本編輯器
/*
文本編輯器:
步驟:1、做好界面;
2、添加監聽器;
3、容錯處理;
其他說明:文本打開對話框和文本保存對話框都是用FileDialog創建的,文本打開對話框用:FileDialog.LOAD模式;
而文本保存對話框用:FileDialog.SAVE模式。彈出文本保存對話框之前,需要判斷文本是否已經存在,
若存在不彈文本保存對話框,直接保存,若不存在,則彈文本保存對話框。
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenu
{
//創立窗體及組件
private Frame f;
private TextArea ta;
//菜單欄及菜單
private MenuBar bar;
private Menu filem;
private MenuItem openm;
private MenuItem savem;
private MenuItem exitm;
//打開文本、保存文本框
private FileDialog openfd,savefd;
//用於將文件的目錄封裝成File對象
private File dir;
MyMenu()
{
init();
}
public void init()
{
//創建窗體,並對其做基本設置
f = new Frame("我的文本編輯器");
f.setBounds(300,200,600,500);
//創建窗體組件
ta = new TextArea();
bar = new MenuBar();
//添加窗體組件
f.setMenuBar(bar);
f.add(ta);
//創建菜單
filem = new Menu("文件");
openm = new MenuItem("打開");
savem = new MenuItem("保存");
exitm = new MenuItem("退出");
//將菜單添加到菜單欄
bar.add(filem);
filem.add(openm);
filem.add(savem);
filem.add(exitm);
//創建保存、打開文本框
openfd = new FileDialog(f,"打開",FileDialog.LOAD);
savefd = new FileDialog(f,"保存",FileDialog.SAVE);
//綁定窗體事件
myEvent();
//顯示窗體
f.setVisible(true);
}
public void myEvent()
{
//添加關閉窗體事件
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//添加退出事件
exitm.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
//添加打開事件
openm.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//點擊“打開”,彈出打開文本對話框
openfd.setVisible(true);
//獲取文本存儲路徑及名字
String path = openfd.getDirectory();
String name = openfd.getFile();
//System.out.println(name+path);
//容錯處理
if(path == null || name == null)
return;
//打開新的文本之前,先清空文本區域
ta.setText("");
//將文本存放路徑封裝成File對象
dir = new File(path,name);
try
{
//建立讀取流,並與指定文本相關聯
BufferedReader bufr = new BufferedReader(new FileReader(dir));
String line = null;
//從硬盤讀取文本並書寫到文本區域
while((line = bufr.readLine()) != null)
{
ta.append(line+"\r\n");
}
//關閉讀取流
bufr.close();
}
catch (IOException ie)
{
throw new RuntimeException("讀取文件失敗!");
}
}
});
//添加保存事件
savem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//打開文本保存對話框之前,先判斷該文本是否存在,
if(dir == null)
{
//若不存在彈出文本保存對話框
savefd.setVisible(true);
//獲取文本保存路徑及名字
String path = savefd.getDirectory();
String name = savefd.getFile();
//容錯處理
if(path == null || name == null)
return;
//將路徑及文本名稱封裝成File對象
dir = new File(path,name);
try
{
//建立寫流,將文本區域的文本寫到指定硬盤裏
BufferedWriter bufw = new BufferedWriter(new FileWriter(dir));
String text = ta.getText();
//System.out.println(text);
bufw.write(text);
//關閉寫流
bufw.close();
}
catch (IOException ie)
{
throw new RuntimeException("文件保存失敗");
}
}
//如果文本存在,不彈文本保存對話框
else
{
try
{
//建立寫流,將文本區域的內容,寫到硬盤中
BufferedWriter bufw = new BufferedWriter(new FileWriter(dir));
String text = ta.getText();
bufw.write(text);
bufw.close();
}
catch(IOException ie)
{}
}
}
});
}
public static void main(String[] args)
{
new MyMenu();
}
}