ch12 GUI

《Head First Java 2nd Edition》 摘錄

JFrame 代表屏幕上的一個窗口,可以把 buttons, checkboxes, test fields 等等界面相關的東西置于其上。它可以有一個有菜單項的菜單條。無論在哪個平臺上,都有窗口圖標,最小化、最大化和關閉窗口的按鈕。

JFrame 在不同平臺上的外觀是不一樣的。

可以把 javax.swing 包下的許多部件添加到 JFrame 中,最常用的控件是:

  • JButton
  • JRadioButton
  • JCheckBox
  • JLabel
  • JList
  • JScrollPane
  • JSlider
  • JTextArea
  • JTextField
  • JTable
    大多數都易于使用,只有某些比較復雜(例如 JTable)。

創建一個GUI非常簡單

第一步:新建一個JFrame

JFrame frame = new JFrame();

第二步:新建一個小部件

JButton button = new JButton("點擊我呀");

第三步:把小部件添加到JFrame 中

frame.getContentPane().add(button);

第四步:顯示窗體

frame.setSize(300, 300);
frame.setVisible(true);

一個最簡GUI示例

package ch12;import javax.swing.*;import java.awt.event.*; // 監聽事件public class SimpleGUI01 implements ActionListener{JButton button;int count = 0;public static void main(String[] args) {SimpleGUI01 gui = new SimpleGUI01();gui.go();}public void go(){JFrame frame = new JFrame("最簡GUI");button= new JButton("點擊我呀");// 添加事件監聽器才能響應事件button.addActionListener(this);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(button); // 從這里把 JButton 添加到 JFrameframe.setSize(300, 300);frame.setVisible(true); // 這一步是必須的,不然看到GUI }@Overridepublic void actionPerformed(ActionEvent e) {count ++;button.setText("點擊我了" + count);}}

響應事件

單擊按鈕如何讓按鈕響應事件?
我們需要準備兩樣東西:

  • 一個method,特殊事件發生時調用它,比如單擊按鈕
  • 一個方式,讓我們知道何時會觸發上面的方法

得到用戶事件

想像一下,你希望單擊按鈕之后按鈕上的文字由click me變成I've been clicked,首先我們可以寫一個方法來改變按鈕的文字:

public void changeIt(){button.setText("I've been clicked!");
}

但是,現在怎么辦?我們怎么知道按鈕何時被單擊了。

在 Java 中,獲取和處理用戶事件的過程被稱作 event-handling,在Java中有許多不同的事件類型,幾乎絕大部分和GUI用戶動作相關。如果用戶單擊按鈕,這就是一個事件。這個事件表明用戶期望的按鈕的事件發生了。如果這是一個Slow Tempo按鈕,用戶期望slow tempo事件發生。如果是聊天客戶端上的發送按鈕,用戶期望的發送我的消息的事件發生了。所以最直截了當的事件是用戶單擊按鈕,表明他們期望一個動作發生。

對于按鈕,你通常都不會考慮中間狀態,例如按鈕按下了或者按鈕釋放了。你對按鈕的期望是:不管用戶是怎么單擊、雙擊按鈕的,不管鼠標按住了多長時間,不管用戶在釋放按鈕之前想法發生了什么變化,僅僅通知我用戶是何時發生了動作。

1、按鈕需要知道我們代碼關注它的狀態
2、當事件發生時按鈕需要以某種方式告知我們

以上兩個問題的解決辦法就是 listener interface,它是一座溝通listener(你)和 event source(按鈕)的橋梁。

Swing GUI 組件都是event sources (事件源),在Java語言中,事件源就是一個能把用戶動作(單擊鼠標,敲擊按鍵,關閉窗口)轉變成事件的對象。就像在Java語言中事實上所有的事物都可以用對象來代表。是某種event class的對象。如果你瀏覽API中的java.awt.event包,可以看見許許多多的事件類(顯而易見,它們的名字中都有Event)。你可以看到MouseEvent, KeyEvent, WindowEvent, ActionEvent 還有許許多多的。

當用戶做出某種動作的時候,source(事件源,比如按鈕)就會創建一個event object(事件對象)。你的絕大部分代碼都是接收事件而不是創建事件。換一句話說,你花費幾乎所有的時間都在作為一個事件監聽器(event listener),而不是事件源(event source)。

每一個事件類型都有與之對應的監聽器接口(listener interface)。如果你期待MouseEvent,就實現MouseListener interface。期待WindowEvents,就實現 WindowListener。明白了否?另外需要謹記實現接口的規則:實現一個你要聲明實現的接口,就需要實現這個接口里面所有的方法。

有的接口有不止一個方法,因為這個接口有多重作用。舉例說明,如果你要實現MouseListener,你就要實現mousePressed, mouseReleased, mouseMoved 等等。盡管它們都來自 MouseEvent,但它們有不同的實現方法。如果你實現MouseListener,當用戶按下鼠標的時候會調用方法mousePressed()。當用戶釋放鼠標的時候,會調用mouseReleased()方法。對于鼠標事件,只有一個事件對象 MouseEvent,但是對于不同的鼠標事件類型,會調用不同的方法。

監聽器和事件源是如何溝通的

Listener
如果你的類想要知道按鈕的 ActionEvents,就需要實現 ActionListener 接口。按鈕也需要知道你對它感興趣,你需要在按鈕上注冊,在按鈕上調用 addActionListener(this) 并且傳遞 ActionListener 引用給它(在當前情況下,你是 ActionListener,所以可以通過 this 傳遞)。按鈕需要在事件發生的時候以某個方式通知你,所以它調用監聽器接口的方法。作為一個監聽器,你必須要實現這個接口的唯一的一個方法 actionPerformed()

Event Source
按鈕是 ActionEvents 的事件源,所以它必須知道哪一個對象是感興趣的監聽者。按鈕有一個方法 addActionListener() ,可以把感興趣的監聽者作為參數傳遞給這個按鈕。當按鈕的 addActioinListener() 方法運行時,它會把參數存到一個列表中。當用戶點擊按鈕時,按鈕在列表中的每一個監聽器上調用 actionPerformed() 方法發出這個事件。

3種添加事物到GUI的方法

  • 添加小部件到 JFrame 上
frame.getContentPane().add(myButton);
  • 在小部件上繪畫 2D 圖形
graphics.fillOval(70, 70, 100, 100);
  • 在小部件上顯示圖片
graphics.drawImage(myPic, 10, 10, this);

創建自己的繪圖小部件

可以設置小部件,移動,動畫,改變顏色等等屬性。

默認情況下,一個frame有5個區域留給你添加小部件。

666431-20170811155029117-838029005.png

轉載于:https://www.cnblogs.com/LinTeX9527/p/7291620.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257717.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257717.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257717.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

兩物體的相對速度公式_《百答相對論》連載(二十一)質疑狹義相對論速度的疊加公式...

狹義相對論部分:(21)質疑狹義相對論速度的疊加公式參考《相對論百問》第28頁 21相對論的速度疊加公式怎么寫?可以用速度疊加達到和超過光速嗎?在經典力學中,物體在力的作用下改變原有的速度遵守牛頓第二定律,物體失去了…

對于大規模機器學習的理解和認識

這篇文章,9分轉載轉述;很少有自己的見解; 首先先露怯:自己真正是去年開始接觸機器學習當中的深度學習當中的卷積神經網絡當中的前向預測部分; 不過,剛才看完了這里的討論,(知乎&…

ARM寄存器

ARM處理器模式 用戶模式(User):ARM處理器正常的程序執行狀態 快速中斷模式(FIQ):用于高速數據傳輸或通道處理 外部中斷模式(IRQ):用于通用的中斷處理 管理模式(Supervisor):操作系統使用的保護模式 數據訪問終止模式(Abort):當數據或指令預取終止時進入該模式,可用于虛擬存儲及…

修改shape數據 小數位數_【數據管理】Excel實用精華

點擊上方藍字關注星標★不迷路來源:從Excel小白到數據分析師這是一篇關于Excel中的小技巧但是都是精華,文中附有操作視屏簡單易學上手快噢!01添加數據有效性_名稱管理器數據有效性是對單元格或單元格區域輸入的數據從內容到數量上的限制。對于…

刪除win10自帶的軟件

第一步:開始→所有程序→WindowsPowershell→然后右鍵以管理員方式運行 全部應用: Get-AppxPackage | Remove-AppxPackage 計算器: Get-AppxPackage calculator | Remove-AppxPackage 地圖: Get-AppxPackage map | Remove-A…

ubuntu解壓zip文件亂碼問題

我的zip文件里的內容是有中文名,也有密碼,在網上找到幾種解決辦法只有一種可以,所以在這里記錄一下: 首先是安裝7zip來解壓,7zip的解決辦法在這里,但是無法解決我的問題,仍然有亂碼問題 最后是在…

ICMP:Internet控制報文協議

ICMP:Internet控制報文協議。是IP層的組成部分。傳遞差錯報文或其他信息。 ICMP報文被封裝在IP數據報內部:詳細格式例如以下所看到的:個字段含義例如以下:8位類型。表示該ICMP報文的含義,如目的不可達、超時、請求回顯…

貝葉斯優化python包_貝葉斯全局優化(LightGBM調參)

這里結合Kaggle比賽的一個數據集,記錄一下使用貝葉斯全局優化和高斯過程來尋找最佳參數的方法步驟。1.安裝貝葉斯全局優化庫從pip安裝最新版本pip install bayesian-optimization2.加載數據集import pandas as pdimport numpy as npfrom sklearn.model_selection im…

PL/SQL 語言 一

Declarea Varchar2(20);b Number(10);c Number(10);m Number(5);sname Varchar2(20);nozero Exception;Begina : 小明;Dbms_Output.Put_Line(a);b : 3;c : 0;/* 循環 */ /* m :50;Loop Exit When m<0;dbms_output.put_line(m);m : m-1;End Loop; *//* While m>0Loop…

OpenCV人臉檢測

由于光照、遮擋和傾斜等原因&#xff0c;部分人臉和眼睛并不能正確檢測。。 // 簡單的人臉檢測#include <iostream> #include <vector> #include <opencv2\opencv.hpp> #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgu…

分離圓環圖顯示百分比_Tableau制作圓環圖

Tableau圓環圖制作 聲明&#xff1a;本文內容來源拉勾教育數據分析訓練營&#xff0c; 封面圖片來源pexels網站圓環圖制作過程如下&#xff1a;建立餅圖2. 設置記錄平均值3. 在第二個字段的下拉菜單中選擇雙軸4. 點擊右側坐標軸&#xff0c;右鍵選擇同步軸&#xff08;同步軸指…

FLEX 布局

網頁布局&#xff08;layout&#xff09;是CSS的一個重點應用。 布局的傳統解決方案&#xff0c;基于盒狀模型&#xff0c;依賴 display屬性 position屬性 float屬性。它對于那些特殊布局非常不方便&#xff0c;比如&#xff0c;垂直居中就不容易實現。 2009年&#xff0c;W3…

SpiderMonkey-讓你的C++程序支持JavaScript腳本

譯序 有些網友對為什么D2JSP能執行JavaScript腳本程序感到奇怪&#xff0c;因此我翻譯了這篇文章&#xff0c;原文在這里。這篇教程手把手教你怎樣利用SpiderMonkey創建一個能執行JavaScript腳本的C程序&#xff0c;并讓JavaScript腳本操縱你的C程序的內部數據、操作。從這篇教…

Android 虛擬機學習總結Dalvik虛擬機介紹

1、Dalvik虛擬機與Java虛擬機的最顯著差別是它們分別具有不同的類文件格式以及指令集。Dalvik虛擬機使用的是dex&#xff08;Dalvik Executable&#xff09;格式的類文件&#xff0c;而Java虛擬機使用的是class格式的類文件。一個dex文件能夠包括若干個類。而一個class文件僅僅…

des vue 加密解密_vue DES 加密

ECB模式import cryptoJs from crypto-js// DES加密export const encryptDes (message, key) > {var keyHex cryptoJs.enc.Utf8.parse(key)var option { mode: cryptoJs.mode.ECB, padding: cryptoJs.pad.Pkcs7 }var encrypted cryptoJs.DES.encrypt(message, keyHex, op…

使用jQuery清空表單

$(#theform)[0].reset(); reset()這個函數的作用是將表單的值重置&#xff0c;變為默認值&#xff0c; 例&#xff1a; <input type"text" value"姓名"> 這個標簽的默認值就是”姓名“&#xff0c;如果使用上面的方法&#xff0c;就會重置為“姓名”…

MobX快速入門教程(重要概念講解)

轉載請注明原文地址&#xff1a;http://www.cnblogs.com/ygj0930/p/7372119.html 一&#xff1a;Mobx工作流程圖 二&#xff1a;MobX涉及到的概念 1:狀態state 組件中的數據。 2:被觀察observable 被observable修飾的state數據將會暴露給整個app&#xff0c;各觀察者組件都可以…

CentOS工作內容(七)禁用IPV6

CentOS工作內容&#xff08;七&#xff09;禁用IPV6 用到的快捷鍵 tab 自動補齊(有不知道的嗎) ctrla 移動到當前行的開頭(a ahead) ctrle 移動到當前行的開頭(e end) ctrlu 刪除(剪切)此處至開始所有內容 復制進來&#xff1a;按一下鼠標右鍵粘貼到SercureCRT 復制出去&#x…

循環結束后變回去 設置一個值_VBA掌握循環結構,包你效率提高500倍

這是系列免費教程《Excel VBA&#xff1a;辦公自動化》&#xff0c;還是老規矩&#xff0c;看看我們走到哪里了。1.認識VBA&#xff1a;什么是VBA&#xff1f;2.這些掌握了&#xff0c;你才敢說自己懂VBA3.VBA變量5年踩坑吐血精華總結4.VBA中重要的強制申明&#xff0c;誰看誰明…

連接到kali linux服務器上的MySQL服務器錯誤

前言&#xff1a;想把數據庫什么的都放在虛擬機kali Linux里&#xff0c;但無奈出了好多錯誤。 首先&#xff1a;可以參照上一篇文章開啟kali服務器端的遠程連接功能&#xff0c;上一篇文章 然后&#xff1a;使用window端的sqlyog&#xff08;MySQL圖形化連接工具&#xff09;連…