天天看點

Head First Java(3)——圖形使用者接口與Swing12 圖形使用者接口13 Swing

12 圖形使用者接口

事件源發出事件:接受注冊、取得使用者事件、并在使用者采取操作時調用監聽的事件處理方法。

監聽獲知事件:實作接口并向按鈕注冊(AddAction…)

Event對象(事件對象攜帶事件資訊):回頭調用接口上的方法時把它當做參數穿進去,将事件的資訊帶給監聽者。

每個事件類型都有相對應的監聽接口。

public void paintComponent(Graphics g){  }

參數g是個Graphics對象,代表它可能是個Graphics的子類。由g參數所引用的對象實際上是個Graphics2D的執行個體。實際上躲在Graphics引用後面的是個Graphics2D對象。編譯器會根據引用的類型而不是實際對象來判定你能夠調用哪些方法。

如果你要調用Graphics2D類的方法,就不能直接使用g參數。但可以将它轉換成Graphics2D變量。(父類的引用轉為子類)

Graphics2D g2d = (Graphics2D) g;

要對事件源注冊就調用事件源的注冊方法,它的方法一定是add<EventType>Listener這種形式,button.addActionListener(this);

内部類可以使用外部所有的方法與變量,就算是私有的也一樣。

内部類的執行個體一定綁在外部類的執行個體上

監聽非GUI事件的最後結果就跟監聽GUI事件是一樣的,實作監聽者的接口,向事件源注冊,等待事件源調用事件處理程式(定義在監聽者的接口中的方法)

13 Swing

布局管理器(Layout Managers)是個與特定元件相關聯的Java對象。

管理器:borderlayout、flow和box

borderlayout:

Head First Java(3)——圖形使用者接口與Swing12 圖形使用者接口13 Swing

把背景元件分割成5個區域。每個被管理的區域隻能放上一個元件。由此管理者安置的元件不會取得預設的大小。這是架構(JFrame)預設的布局管理器。

(南北先占位)

FlowLayout:

Head First Java(3)——圖形使用者接口與Swing12 圖形使用者接口13 Swing

這個管理器的行為跟文書處理程式的版面配置方式差不多。每個元件都會依照理想的大小呈現,并且會從左到右依照加入的順序以可能會換行的方式排列。這是面闆(JPanel)預設的布局管理器。

BoxLayout:

Head First Java(3)——圖形使用者接口與Swing12 圖形使用者接口13 Swing

它像FlowLayout一樣讓每個元件使用預設的大小,并且按照加入的順序來排列。但BoxLayout是以垂直的方向來排列。

把面闆的布局管理器從預設的FlowLayout布局改成BoxLayout布局:

panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS)); ------>它的構造函數需要知道管理哪個元件以及使用哪個軸

question:架構為什麼不能像面闆那樣直接地加上元件?

answer:JFrame這麼特殊是因為它是讓事物顯示在畫面上的特點。Swing的元件純粹由Java構成,JFrame必須要連接配接到底層的作業系統以便來存取顯示裝置。把面闆想做是安置在JFrame上的100%純Java層。把JFrame想做是支撐面闆的架構。

Head First Java(3)——圖形使用者接口與Swing12 圖形使用者接口13 Swing