GUI—— 圖形化用戶界面
JFC(Java Foundation Classed)是開發GUI的API集
JFC包括:AWT(Abstract Window Toolkit抽象窗口工具包)、Swing組件(建立在AWT上功能更強大的圖形組件包)、JAVA 2D(實現高質量二維圖形)
一.AWT框架
AWT的核心類是Component類。
Component類由基本組件和容器(Container)組件組成。
容器組件主要分為兩部分:Window容器和Panel(面板)容器。
*Frame:Window容器的子類,帶有標題和縮放角的窗口。
Frame容器被創建后是不可見的,所以我們需要人為設置可見性。
常用方法:
顯示窗體方法 void setVisible(boolean b)(在Component類中)
設置背景色 setBackground(Color C)
設置尺寸 setSize(int a , int b)(a為長,b為寬,單位為像素)
限制位置和尺寸 setBound(int x,int y,int a,int b)(x,y為窗體橫縱坐標)
Panel容器只能存在于其它的容器中,不能單獨顯示。應用程序可以將其他組件放在面板提供的空間內,這些組件包括其它面板。
面板的默認布局管理器是FlowLayout布局管理器。
若需要要去掉panel指令的默認管理器,可初始化panel后調用方法panel.setLayout(null).
容器可以容納容器和組件,故可以制作出復雜的布局。
二.布局管理器
布局管理器:決定組件的位置和大小。
五種布局管理器:
FlowLayout(流式布局管理器)
 
 
BorderLayout(邊界布局管理器)
 
 
調用方法:
 
 
GridLayout(網格布局管理器)
 
 
CardLayout(卡片布局管理器)
它將容器中的每個組件看作一張卡片。一次只能看到一張卡片,容器則充當卡片的堆棧。當容器第一次顯示時,第一個添加到 CardLayout對象的組件為可見組件。
GridBagLayout(網格包布局管理器)

每個Container都有默認的布局管理器,但是我們可以通過設置空布局管理器(setLayout(null))來控制組件的大小和位置。
設置空布局管理器后,必須對所有組件調用setLocation(),setSize()或setBound()進行一個重定位。
二.AWT事件處理
AWT事件處理主要針對下述三類對象:
Event(事件):用戶對組件的一個操作
Event Source(事件源):事件發生的場所,如Button1
Event Monitor(事件監聽器):監聽事件是否被處理。
 
 
(引自海同網校)
(一)AWT事件
AWT相關事件繼承于java.awt.AWTEvent類。
這些事件分為兩大類:低級事件和高級事件。
1.低級事件:基于組件的事件,如:
ComponentEvent 組建事件:組件尺寸與位置變化
ContainerEvent 容器事件:組件增加、移動
WindowEvent 窗口事件:關閉窗口、窗口閉合、圖標化
FocusEvent 焦點事件:焦點的獲得和丟失
KeyEvent 鍵盤事件
MouseEvent 鼠標事件
2.高級事件:基于語義的事件,如:
ActionEvent 動作事件:當特定于組件的動作(比如被按下)發生時,由組件(比如Button)生成此高級別事件。事件被傳遞給每一個ActionListener 對象,這些對象是使用組件的addActionListener 方法注冊的,用以接收這類事件。
AdjustmentEvent 調節事件:滾動條的滑動影響數目的改變等
ItemEvent 項目事件:選定或取消選定語義事件
TextEvent 文本事件:對文本對象的改變
(二)事件監聽器
事件監聽器通常是指一個類,通過該類必須實現與該事件類型相對應的接口。
注:事件監聽器接口類名稱與事件名稱相對應。如:MouseEvent—— MouseListener
(三)事件適配器類
某些事件監聽接口有對應的事件適配器類。通過事件適配器類,我們可以更簡單地實現事件監聽,從而縮短程序代碼。
java.awt.event包中定義的事件適配器類包括以下七個:
MouseAdapter(鼠標適配器)、MouseMotionAdapter(鼠標運動適配器)、KeyAdapter(鍵盤適配器)、WindowAdapter(窗口適配器)、ComponentAdapter(組件適配器)、ContainerAdapter(容器適配器)、FocusAdapter(焦點適配器)
(四)觀察者模式
定義對象間的一對多依賴關系,當一方的對象改變狀態時所有的依賴著都會得到通知并自動更新。
觀察者模式中任意數目的觀察者不必知道彼此的存在。這種狀態使代碼具有較好的可重用性。
1. Subject(主題)
提供注冊和注銷觀察者的接口
2. Observer(觀察者)
為需要在主題變化時獲得通知的對象定義一個更新接口。
3. ConcreteSubject(具體主題)
主題接口的一個實現類
4. ConcreteObserver(具體觀察者)
觀察者接口的實現類
三.Swing
Swing:用于開發Java應用程序用戶界面的開發工具包
Swing控件可跨平臺運行。
獨立于本地平臺的Swing控件稱為輕量級控件,依賴于本地平臺的AWT控件稱為重量級控件。
工具包中所有的包都是以swing作為名稱的,如:
javax.swing,javax.swing.event
swing組件的層次框架圖:
 
 
(圖片源自海通網校)
創建圖形界面的主要步驟:
1.導入Swing包
2.設置頂層容器
3.設置按鈕和標簽等Swing組件
4.將組件添加至容器中
5.處理事件
例:
 
 
(圖片源自海同網校)
具體操作方法參照記事本實例。
代碼如下:
packagecom.iotek.swing;importjava.awt.BorderLayout;importjava.awt.Container;importjava.awt.Dimension;importjava.awt.FileDialog;importjava.awt.Frame;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JDialog;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;/** * Created by asus on 2017/2/15. *記事本實例 */public classNotePadDemo{ public static void main(String[] args){ newMyFrame("記事本"); }}classMyFrameextendsJFrame{ PRivateJTextAreatv_area=null; privateJScrollPanes_pane=null;//帶滾動條的面板 privateJMenuBarmb=null;//菜單欄 privateJMenum_file=null;//文件菜單 privateJMenum_help=null;//幫助菜單 privateJMenuItemf_item_new=null;//文件菜單的菜單項(子菜單):新建 privateJMenuItemf_item_open=null;//文件菜單的菜單項(子菜單):打開 privateJMenuItemf_item_exit=null;//文件菜單的菜單項(子菜單):退出 privateJMenuItemf_item_about=null;//文件菜單的菜單項(子菜單):關于 publicMyFrame(Stringtitle) { super(title); init(); registerListener(); } //初始化相關的組件 private void init() { tv_area=newJTextArea(); s_pane=newJScrollPane(tv_area); //在需要時出現水平滾動條 s_pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); Containercpane=this.getContentPane(); cpane.add(s_pane,BorderLayout.CENTER); this.setSize(500,500);//設置窗體大小 //初始化菜單 mb=newJMenuBar();//新建菜單 m_file=newJMenu("文件");//新建文件菜單和其菜單項 f_item_new=newJMenuItem("新建"); f_item_open=newJMenuItem("打開"); f_item_exit=newJMenuItem("退出"); m_file.add(f_item_new); m_file.add(f_item_open); m_file.add(f_item_exit); m_help=newJMenu("幫助");//新建幫助菜單和其菜單項 f_item_about=newJMenuItem("關于"); m_help.add(f_item_about); mb.add(m_file);//將文件菜單與幫助菜單添加到菜單欄上 mb.add(m_help); //把菜單欄添加到窗體中 this.setJMenuBar(mb); this.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);//關閉窗口的時候退出應用程序 //設置窗口在屏幕當中居中顯示 //定義一個工具包 Toolkittoolkit=Toolkit.getDefaultToolkit(); DimensionscreenSize=toolkit.getScreenSize();//獲得屏幕尺寸信息 intscreenWidth=screenSize.width;//獲得當前屏幕寬度 intscreenHeight=screenSize.height;//獲得當前屏幕度 intwindowWidth=this.getWidth();//獲得當前窗體寬度 intwindowHeight=this.getHeight();//獲得當前窗體高度 this.setLocation((screenWidth-windowWidth)/2, (screenHeight-windowHeight)/2);//使屏幕居中 this.setVisible(true);//顯示窗體 } //給相關組件設置事件監聽器 private void registerListener() { f_item_new.addActionListener(e -> newFile()); f_item_open.addActionListener(e->openFile()); f_item_exit.addActionListener(e->exitFile()); f_item_about.addActionListener(e->aboutFile()); } private void newFile() { if(!tv_area.getText().equals("")) { intres=JOptionPane.showConfirmDialog(null,"是否保存?",this.getTitle(),JOptionPane.YES_NO_CANCEL_OPTION); if(res==JOptionPane.YES_OPTION) { //彈出文件保存對話框 FileDialogfd=newFileDialog(this,"保存文件",FileDialog.SAVE); fd.setVisible(true); }else{ tv_area.setText("");//清空記事本中內容 } } } //打開記事本格式文件 private void openFile(){ FileDialogof=newFileDialog(this,"打開文件",FileDialog.LOAD); of.setVisible(true); } //退出 private void exitFile(){ if(!tv_area.getText().equals("")) { intres=JOptionPane.showConfirmDialog(null,"是否保存?",this.getTitle(),JOptionPane.YES_NO_CANCEL_OPTION); if(res==JOptionPane.YES_OPTION) { //彈出文件保存對話框 FileDialogfd=newFileDialog(this,"保存文件",FileDialog.SAVE); fd.setVisible(true); }else{ tv_area.setText("");//清空記事本中內容 } } //退出程序 System.exit(0); } //關于 private void aboutFile(){ AboutDialogaboutDialog=newAboutDialog(this,"about",true); }}
新聞熱點
疑難解答