(本文爲博主JAVA課程學習總結)
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.處理事件
例:
(圖片源自海同網校)
具體操作方法參照記事本實例。
代碼如下:
package
com.iotek.swing;
import
java.awt.BorderLayout;
import
java.awt.Container;
import
java.awt.Dimension;
import
java.awt.FileDialog;
import
java.awt.Frame;
import
java.awt.Toolkit;
import
java.awt.event.ActionEvent;
import
java.awt.event.ActionListener;
import
javax.swing.JButton;
import
javax.swing.JDialog;
import
javax.swing.JFrame;
import
javax.swing.JLabel;
import
javax.swing.JMenu;
import
javax.swing.JMenuBar;
import
javax.swing.JMenuItem;
import
javax.swing.JOptionPane;
import
javax.swing.JPanel;
import
javax.swing.JScrollPane;
import
javax.swing.JTextArea;
/**
* Created by asus on 2017/2/15.
*
記事本實例
*/
public class
NotePadDemo
{
public
static void main(String
[] args){
new
MyFrame("記事本");
}
}
class
MyFrame
extends
JFrame
{
private
JTextArea
tv_area
=
null;
private
JScrollPane
s_pane
=
null;//帶滾動條的面板
private
JMenuBar
mb
=
null;//菜單欄
private
JMenu
m_file
=
null;//文件菜單
private
JMenu
m_help
=
null;//幫助菜單
private
JMenuItem
f_item_new
=
null;//文件菜單的菜單項(子菜單):新建
private
JMenuItem
f_item_open
=
null;//文件菜單的菜單項(子菜單):打開
private
JMenuItem
f_item_exit
=
null;//文件菜單的菜單項(子菜單):退出
private
JMenuItem
f_item_about
=
null;//文件菜單的菜單項(子菜單):關於
public
MyFrame(String
title) {
super(title);
init();
registerListener();
}
//初始化相關的組件
private
void init()
{
tv_area
=
new
JTextArea();
s_pane
=
new
JScrollPane(tv_area);
//在需要時出現水平滾動條
s_pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
Container
cpane
=
this.getContentPane();
cpane.add(s_pane,
BorderLayout.CENTER);
this.setSize(500,
500);//設置窗體大小
//初始化菜單
mb
=
new
JMenuBar();//新建菜單
m_file
=
new
JMenu("文件");//新建文件菜單和其菜單項
f_item_new
=
new
JMenuItem("新建");
f_item_open
=
new
JMenuItem("打開");
f_item_exit
=
new
JMenuItem("退出");
m_file.add(f_item_new);
m_file.add(f_item_open);
m_file.add(f_item_exit);
m_help
=
new
JMenu("幫助");//新建幫助菜單和其菜單項
f_item_about
=
new
JMenuItem("關於");
m_help.add(f_item_about);
mb.add(m_file);//將文件菜單與幫助菜單添加到菜單欄上
mb.add(m_help);
//把菜單欄添加到窗體中
this.setJMenuBar(mb);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//關閉窗口的時候退出應用程序
//設置窗口在屏幕當中居中顯示
//定義一個工具包
Toolkit
toolkit
=
Toolkit.getDefaultToolkit();
Dimension
screenSize
=
toolkit.getScreenSize();//獲得屏幕尺寸信息
int
screenWidth
=
screenSize.width;//獲得當前屏幕寬度
int
screenHeight
=
screenSize.height;//獲得當前屏幕度
int
windowWidth
=
this.getWidth();//獲得當前窗體寬度
int
windowHeight
=
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(""))
{
int
res
=
JOptionPane.showConfirmDialog(null,
"是否保存?",
this.getTitle(),
JOptionPane.YES_NO_CANCEL_OPTION);
if
(res
==
JOptionPane.YES_OPTION)
{
//彈出文件保存對話框
FileDialog
fd
=
new
FileDialog(this,
"保存文件",
FileDialog.SAVE);
fd.setVisible(true);
}
else
{
tv_area.setText("");//清空記事本中內容
}
}
}
//打開記事本格式文件
private
void openFile(){
FileDialog
of
=
new
FileDialog(this,"打開文件",FileDialog.LOAD);
of.setVisible(true);
}
//退出
private
void exitFile(){
if
(!tv_area.getText().equals(""))
{
int
res
=
JOptionPane.showConfirmDialog(null,
"是否保存?",
this.getTitle(),
JOptionPane.YES_NO_CANCEL_OPTION);
if
(res
==
JOptionPane.YES_OPTION)
{
//彈出文件保存對話框
FileDialog
fd
=
new
FileDialog(this,
"保存文件",
FileDialog.SAVE);
fd.setVisible(true);
}
else
{
tv_area.setText("");//清空記事本中內容
}
}
//退出程序
System.exit(0);
}
//關於
private
void aboutFile(){
AboutDialog
aboutDialog
=
new
AboutDialog(this,"about",true);
}
}