Java之GUI

(本文爲博主JAVA課程學習總結)

GUI —— 圖形化用戶界面

JFCJava Foundation Classed)是開發GUIAPI

JFC包括:AWTAbstract Window Toolkit抽象窗口工具包)、Swing組件(建立在AWT上功能更強大的圖形組件包)、JAVA 2D(實現高質量二維圖形)

一.AWT框架

AWT的核心類是Component類。

Component類由基本組件和容器(Container)組件組成。

容器組件主要分爲兩部分:Window容器和Panel(面板)容器。

*FrameWindow容器的子類,帶有標題和縮放角的窗口

Frame容器被創建後是不可見的,所以我們需要人爲設置可見性。

常用方法:

顯示窗體方法      void setVisibleboolean b)(在Component類中)

設置背景色        setBackground(Color C)

設置尺寸        setSizeint a , int b(a爲長,b爲寬,單位爲像素)

限制位置和尺寸  setBoundint x,int y,int a,int b(x,y爲窗體橫縱座標)

Panel容器只能存在於其它的容器中,不能單獨顯示。應用程序可以將其他組件放在面板提供的空間內,這些組件包括其它面板。

面板的默認佈局管理器是FlowLayout佈局管理器。

若需要要去掉panel指令的默認管理器,可初始化panel後調用方法panel.setLayout(null).

容器可以容納容器和組件,故可以製作出複雜的佈局。

二.佈局管理器

佈局管理器:決定組件的位置和大小。

五種佈局管理器:

FlowLayout(流式佈局管理器)  

 

BorderLayout(邊界佈局管理器)

 

調用方法:

 

GridLayout(網格佈局管理器)

 

CardLayout(卡片佈局管理器)

它將容器中的每個組件看作一張卡片。一次只能看到一張卡片,容器則充當卡片的堆棧。當容器第一次顯示時,第一個添加到 CardLayout 對象的組件爲可見組件。

GridBagLayout(網格包佈局管理器)

每個Container都有默認的佈局管理器,但是我們可以通過設置空佈局管理器(setLayoutnull))來控制組件的大小和位置。

設置空佈局管理器後,必須對所有組件調用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.swingjavax.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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章