1.1、GUI概述
Graphical User Interface(圖形用戶接口)
用圖形的方式,來顯示計算機操作的界面,
CLI:
Command line User Interface(命令行用戶接口)
如DOS,
java為GUI提供的對象都存在java.Awt和javax.Swing兩個包中.
1.2、Awt與Swing
java.Awt:Abstract Window ToolKit(抽象窗口工具包)需要調用本地系統方法實現功能。屬于重量級級控件
javax.Swing:在AWT的基礎上,建立的一套圖形界面系統,其中提供了更多的組件,而且完全由Java實現。增強了移植必,屬于輕量級控件。
1.3、結構
2.1、布局
容器中的組件的排放方式,就是布局。
2.2、常見的布局管理
FlowLayout(流式布局管理器)
從左到右的順序排列
Panel默認的布局管理器。
BorderLayout(邊界布局管理器)
東、南、西、北、中
Fram默認的面布局管理器。
GridLayout(網格布局管理器)
規則的矩陣
CardLayout(卡片布局管理器)
選項卡
GridBagLayout(網絡包布局管理器)
非規則的矩陣
2.3、
import java.awt.*;public class AwtDemo1 { public static void main(String[] args) { //聲明一個容器,Frame并設置標題 Frame f=new Frame("Hello World"); //設置窗體大小第一個參數是寬度,第二個參數是高度 f.setSize(600, 300); //設置窗體運行的位置,屏幕中顯示的位置 f.setLocation(400, 200); //設置窗體布局方式,默認為BorderLayout,設置為流式布局 f.setLayout(new FlowLayout()); //聲明新的控件 Button btn=new Button("按鍵"); //將控件添加到窗體 f.add(btn); //設置窗體可見,默認是不可見的 f.setVisible(true); }}
3.1、事件監聽機制
事件源(組件)awt包或者swing中的那些圖形界面組件
事件(Event):每一個事件源都自己的特有的對應的事件和共性事件
監聽器(Listener):將可以觸發某一個事件的動作(不只一個動作)都已經封閉到了監聽器中.
以上3種,都在java中已經定義好了,直接獲取對象用使用就可以
事件處理(引發事件后處理方式):我們要做的事情是,就是產生的動作進行處理.
3.2、事件監聽機制特點
3.3、 示例
WindowsListener 接口有7個方法要重寫,一般為直接實現而使用其子類
WindwoAdapter()
接收窗口事件的抽象適配器類。此類中的方法為空。此類存在的目的是方便創建偵聽器對象。
擴展此類可創建 WindowEvent
偵聽器并為所需事件重寫該方法。(如果要實現 WindowListener
接口,則必須定義該接口內的所有方法。此抽象類將所有方法都定義為 null,所以只需針對關心的事件定義方法。)
只需要繼承 WindwoAdapter類,實現需要的方法即可
import java.awt.*;import java.awt.event.*;public class AwtDemo1 { public static void main(String[] args) { //聲明一個容器,Frame并設置標題 Frame f=new Frame("Hello World"); //設置窗體大小第一個參數是寬度,第二個參數是高度 f.setSize(600, 300); //設置窗體運行的位置,屏幕中顯示的位置 f.setLocation(400, 200); //設置窗體布局方式,默認為BorderLayout,設置為流式布局 f.setLayout(new FlowLayout()); //聲明新的控件 Button btn=new Button("按鍵"); //添加監聽事件 //將控件添加到窗體 f.add(btn); //設置窗體可見,默認是不可見的 f.setVisible(true); //添加監聽器 f.addWindowListener(new MyWinEvent()); }}class MyWinEvent extends WindowAdapter{ @Override public void windowActivated(WindowEvent e) { // 激活窗口時調用 super.windowActivated(e); System.out.); } @Override public void windowClosed(WindowEvent e) { // 當窗口已被關閉時調用 super.windowClosed(e); System.out.println("我被關閉了"); } @Override public void windowClosing(WindowEvent e) { // 窗口正處在關閉過程中時調用。 super.windowClosing(e); System.out.println("我正在被關閉"); } @Override public void windowDeactivated(WindowEvent e) { // 停用窗口時調用。 super.windowDeactivated(e); System.out.println("我被停用了"); } @Override public void windowDeiconified(WindowEvent e) { // 取消圖標化窗口時調用 super.windowDeiconified(e); System.out.println("取消圖標化窗口"); } @Override public void windowGainedFocus(WindowEvent e) { // 該 Window 被設置為聚焦 Window 時調用,聚焦 Window 意味著該 Window 或其某個子組件將接收鍵盤事件。 super.windowGainedFocus(e); System.out.println("獲取焦點"); } @Override public void windowIconified(WindowEvent e) { //圖標化窗口時調用。 super.windowIconified(e); System.out.println("圖標化窗口時調用。"); } @Override public void windowLostFocus(WindowEvent e) { // 該 Window 不再為聚焦 Window 時調用,不再為聚焦 Window 意味著鍵盤事件不再傳遞到該 Window 或其任意子組件。 super.windowLostFocus(e); System.out.println("失去焦點"); } @Override public void windowOpened(WindowEvent e) { //已打開窗口時調用。 super.windowOpened(e); System.out.println("窗口打開了"); } @Override public void windowStateChanged(WindowEvent e) { // 窗口狀態改變時調用。 super.windowStateChanged(e); System.out.println("窗口狀態改變時調用。"); } }
4.1、Action事件
addActionListener(ActionListener l)
添加指定的動作偵聽器,以接收發自此按鈕的動作事件
只有一個方法
actionPerformed(ActionEvent e)
發生操作時調用。
用于接收操作事件的偵聽器接口。對處理操作事件感興趣的類可以實現此接口,而使用該類創建的對象可使用組件的 addActionListener
方法向該組件注冊。在發生操作事件時,調用該對象的 actionPerformed
方法。
4.2、示例
import java.awt.*;import java.awt.event.*;class ActionDemo { public static void main(String[] args) { new FrameDemo(); }}class FrameDemo{ //定義成員變量frame和Button private Frame f; private Button btn; public FrameDemo() { init(); } public void init() { //初始人成員變量,并設置初始值 f=new Frame("我的Frame窗體"); //設置窗口位置水平與垂直坐標,寬度與高度 f.setBounds(200,200,600,500); // f.setLocation(400,100); //可見的 f.setVisible(true); //設置布局 f.setLayout(new FlowLayout()); //給窗體添中監聽器,事件 myEvent(); btn=new Button("我的按鍵"); //添控件添加到frame窗體上 f.add(btn); //給按鍵添加Action事件 btn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("按鍵事件!,按鍵關閉窗口"); System.exit(0); } }); } //事件方法 private void myEvent() { //添加事件 f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.out.println("myFram 關閉"); System.exit(0); } }); }}
5.1、示例
/*鼠標與鍵盤事件*/import java.awt.*;import java.awt.event.*;class AwtDemo3 { public static void main(String[] args) { new mouseAndKey(); }}class mouseAndKey{ private Frame f; private Button btn; private TextField tf; public mouseAndKey() { init(); } //初始化 public void init() { f=new Frame("My Frame"); btn=new Button("My Button"); //指定列數 tf=new TextField(20); //設置位置,大小 f.setBounds(200,300,500,400); f.setLayout(new FlowLayout()); //流式布局 f.add(btn); f.add(tf); f.setVisible(true); //為窗口添加監聽器 myEvent(); //添加鼠標監聽器 addMouseEvent(); //添加鍵盤監聽器 addMykeyEvent(); //添加文件框監聽器 addTfEvent(); } //窗口監聽器 private void myEvent() { f.addWindowListener(new WindowAdapter(){ //添加關閉事件 public void windowClosing(WindowEvent e) { System.out.println("窗口關閉了"); System.exit(0); } }); } //添加鼠標事件 private void addMouseEvent() { btn.addActionListener(new ActionListener(){ //活動狀態 public void actionPerformed(ActionEvent e){ System.out.println("窗口活動狀態action"); } }); //添加鼠標監聽器 btn.addMouseListener(new MouseAdapter(){ /* int clickedCount=1; //單擊事件 public void mouseClicked(MouseEvent e) { System.out.println("鼠標單擊"+clickedCount++); } }); */ //雙擊事件 int doubleClickCount=1; public void mouseClicked(MouseEvent e) { if (e.getClickCount()==2) { System.out.println("鼠標雙擊"+doubleClickCount++); } } //鼠標進入事件 int count=1; public void mouseEntered(MouseEvent e) { System.out.println("鼠標進入控件"+count++); } }); } private void addMykeyEvent() { btn.addKeyListener(new KeyAdapter(){ //按下某個鍵時調用此方法 public void keyPressed(KeyEvent e) { //System.out.println("按下:"+KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode()); /* //按下esc鍵關閉窗口 if(e.getKeyCode()==KeyEvent.VK_ESCAPE) { System.exit(0); } */ if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER) { System.out.println("ctrl+enter"); } } //釋放某個鍵時調用此方法。 public void keyReleased(KeyEvent e) { //System.out.println("釋放:"+KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode()); } //鍵入某個鍵時調用此方法。 public void keyTyped(KeyEvent e) { //System.out.println("輸入:"+KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode()); } }); } private void addTfEvent(){ tf.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e) { int code=e.getKeyCode(); if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9)) { System.out.println(code+"....是不合法的!"); //不能輸入進去 e.consume(); } } }); }}
示例、
/*在文本框中輸入目錄,點擊轉到 按鍵,將該目錄中的文件與文件夾名稱列在下面的文本區域中*/import java.awt.*;import java.awt.event.*;import java.io.*;class TextFieldDemo { public static void main(String[] args) { new MyTextField(); }}/* private Frame f; 窗體 private Button btn; 按鍵 private TextField tf; 文本框 private TextArea ta; 多行文本域 private Dialog d; 對話框 private Label lab; 文本信息 private Button okBtn; 確定按鍵*/class MyTextField{ private Frame f; private Button btn; private TextField tf; private TextArea ta; private Dialog d; private Label lab; private Button okBtn; public MyTextField() { init(); } //初始化 public void init() { f=new Frame("根據目錄列出所有文件"); f.setBounds(300,100,600,500); f.setLayout(new FlowLayout()); tf=new TextField(30); btn=new Button("轉到"); ta=new TextArea(20,50); /* 提示窗口 */ d=new Dialog(f,"提示信息",true); lab=new Label(); okBtn=new Button("確定"); d.add(lab); d.add(okBtn); d.setBounds(400,200,240,150); d.setLayout(new FlowLayout()); //將控件添回到窗體 f.add(tf); f.add(btn); f.add(ta); //設置窗體可見 f.setVisible(true); //添加事件 myEvent(); } public void myEvent() { //窗體監聽器, f.addWindowListener(new WindowAdapter(){ //關閉事件 public void windowClosing(WindowEvent e) { System.exit(0); } }); //文本框添加事件監聽,輸入完成,敲回車執行 tf.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER) { //調用 showDir(); } } } ); //按鍵添加監聽器,事件輸入完成,點按鍵執行 btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //調用顯示 showDir(); } } ); //對話框事件 //窗體監聽器, d.addWindowListener(new WindowAdapter(){ //關閉事件 public void windowClosing(WindowEvent e) { //將對話框隱藏 d.setVisible(false); } }); okBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {//將對話框隱藏 d.setVisible(false); } }); } private void showDir() { //獲取文本框輸入的內容 String dirPath=tf.getText(); //封裝為文件 File dir=new File(dirPath); //判斷是不是目錄同時是否存在 if(dir.exists()&&dir.isDirectory()) { //存在并且目錄存在就把多行文本框清空 ta.setText(""); //獲取文件列表 File [] files=dir.listFiles(); for(File f:files) { //向多行文本域中添加內容,增加 ta.append(f.getName()+"/n"); } }else { //對話框信息設置 String info="您輸入的路徑:"+dirPath+" 是錯誤的請重新輸入"; lab.setText(info); //對話框顯示 d.setVisible(true); } //將文本框清空 tf.setText(""); }}
6.1、示例
/* 菜單:private Frame f; 窗體 private MenuBar mb; 菜單欄 private Menu m; 菜單 private MenuItem closeItem; 菜單項關閉菜單*/import java.awt.*;import java.awt.event.*;class MenuDemo { private Frame f; private MenuBar mb; private Menu m; private Menu subMenu;//子菜單的子菜單 private MenuItem closeItem; private MenuItem subItem; //子菜單條目屬于subMenu的子菜單項 //構造方法 public MenuDemo() { init(); } /* 初始化 */ public void init() { //窗體 f=new Frame("有菜單的窗體"); //設置位置,寬,高 f.setBounds(300,100,500,400); //布局 f.setLayout(new FlowLayout()); //菜單欄 mb=new MenuBar(); //菜單 m=new Menu("文件"); subMenu=new Menu("子菜單"); //菜單項 closeItem=new MenuItem("退出"); subItem=new MenuItem("子菜單條目"); //菜單添加菜單項 subMenu.add(subItem); m.add(subMenu); m.add(closeItem); //菜單欄添加菜單 mb.add(m); //窗體設置菜單欄 f.setMenuBar(mb); //設置顯示 f.setVisible(true); myEvent(); } /* 設置監聽器 */ private void myEvent() { /* 通過右上角X關閉窗體 */ f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.out.println("通過關閉X退出,這個窗體"); System.exit(0); } }); /* 通過菜單退出 */ closeItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("通過菜單退出,這個窗體"); System.exit(0); } }); } /* 測試 */ public static void main(String[] args) { new MenuDemo (); }}
七、打開與關閉文件
7.1、示例,添加打開菜單項
public FileDialog(Frame parent, String title, int mode)
如果 mode
的值為 LOAD
,那么文件對話框將查找要讀取的文件,所顯示的文件是當前目錄中的文件。如果 mode
的值為 SAVE
,則文件對話框將查找要寫入文件的位置。
parent
- 對話框的所有者title
- 對話框的標題mode
- 對話框的模式,可以是 FileDialog.LOAD
或 FileDialog.SAVE
/* 菜單: private Frame f; 窗體 private MenuBar mb; 菜單欄 private Menu m; 菜單 private MenuItem openItem; 打開 private MenuItem closeItem; 關閉 private MenuItem saveItem;保存 //構造方法*/package mymenu;import java.awt.*;import java.awt.event.*;import java.io.*;public class MenuDemo1 { private Frame f; private MenuBar mb; private Menu fileMenu; private MenuItem openItem; private MenuItem closeItem; private MenuItem saveItem; private FileDialog openDia; //打開對話框 private FileDialog saveDia;//保存對話框 private TextArea ta; private File file; //構造方法 public MenuDemo1() { init(); } /* 初始化 */ public void init() { //窗體 f=new Frame("有菜單的窗體"); //設置位置,寬,高 f.setBounds(300,100,650,500); //布局 //f.setLayout(new FlowLayout()); //菜單欄 mb=new MenuBar(); //菜單 fileMenu=new Menu("文件"); //菜單項 openItem=new MenuItem("打開"); saveItem=new MenuItem("保存"); closeItem=new MenuItem("退出"); //菜單添加菜單項 fileMenu.add(openItem); //添加打開 fileMenu.add(saveItem); //添加保存 fileMenu.add(closeItem); //添加關閉 //菜單欄添加菜單 mb.add(fileMenu); //窗體設置菜單欄 f.setMenuBar(mb); //打開,關閉對話框 openDia=new FileDialog(f,"打開",FileDialog.LOAD); saveDia=new FileDialog(f,"保存",FileDialog.SAVE); ta=new TextArea(); f.add(ta); myEvent(); //設置顯示 f.setVisible(true); } /* 設置監聽器 */ private void myEvent() { /* 通過右上角X關閉窗體 */ f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.out.println("通過關閉X退出,這個窗體"); System.exit(0); } }); /* 打開 */ openItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { openDia.setVisible(true); show(); } }); /* 保存 */ saveItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { save(); } }); /* 通過菜單退出 */ closeItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("通過菜單退出,這個窗體"); System.exit(0); } }); } private void show() { String dirPath=openDia.getDirectory(); //路徑 String fileName=openDia.getFile();//文件名 //打印路徑 System.out.println(dirPath+"..."+fileName); if(dirPath==null || fileName==null) return; ta.setText(""); File file=new File(dirPath,fileName); //封裝為文件 BufferedReader br=null; try{ br=new BufferedReader(new FileReader(file)); String line=null; while((line=br.readLine())!=null) { ta.append(line+"/n"); } }catch(IOException e) { }finally{ try { if(br!=null) br.close(); } catch (IOException e) { } } } /* 保存 */ private void save() { if(file==null){ //設置 saveDia.setVisible(true); String dirPath=saveDia.getDirectory(); // 目錄 String fileName=saveDia.getFile();//文件 //判斷路徑和文件名是否為空 if (dirPath==null || fileName==null)//啥也不做 return; //如果文件為空就,new file=new File(dirPath,fileName); } //不為空就直接保存 BufferedWriter bw=null; try { bw =new BufferedWriter(new FileWriter(file)); //獲取多行文本框內容 String context=ta.getText(); //System.out.println(context); bw.write(context); //bw.flush(); } catch (IOException e) { }finally{ try { if (bw!=null) bw.close(); } catch (IOException ex) { } } } /* 測試 */ public static void main(String[] args) { new MenuDemo1 (); }}/*FileDialogpublic FileDialog(Frame parent, String title, int mode)創建一個具有指定標題的文件對話框窗口,用于加載或保存文件。 如果 mode 的值為 LOAD,那么文件對話框將查找要讀取的文件,所顯示的文件是當前目錄中的文件。如果 mode 的值為 SAVE,則文件對話框將查找要寫入文件的位置。 參數:parent - 對話框的所有者title - 對話框的標題mode - 對話框的模式,可以是 FileDialog.LOAD 或 FileDialog.SAVE */
8.1、將示中打所為jar文件
編譯帶包的源文件
javac -d F:/java/day22/menu MenuDemo1.java
打包
Manifest-Version: 1.0
Created-By: 1.8.0_60 (Oracle Corporation)
Main-Class: mymenu.MenuDemo1
每個標簽冒號后都跟上一個空格
最后一行需要有一個回車鍵,否則后面那一行是不能打包進去的
沒有空格會報
java.io.IOException: invalid header field at java.util.jar.Attributes.read(Attributes.java:393) at java.util.jar.Manifest.read(Manifest.java:182) at java.util.jar.Manifest.<init>(Manifest.java:52) at sun.tools.jar.Main.run(Main.java:132) at sun.tools.jar.Main.main(Main.java:1022)
1.txt
Main-Class: mymenu.MenuDemo1
新聞熱點
疑難解答