【Java基础】之AWT,一篇文章搞懂awt(包含绘图)
🌈博客主頁:強(qiáng)子的博客
📅 發(fā)文時間:2022.3.15
🎈 一定存在只有你才能做成的事
🌹 博主水平有限,如有錯誤,歡迎指正
歡迎給位👍收藏💎評論?
Java awt
- 👑👑 AWT
- 📜📜Java AWT簡介 (Introduction to Java AWT)
- 🏮🏮層次結(jié)構(gòu) (Hierarchy)
- 💐💐2.4 LayoutManage布局管理器
- 小案例
- 🌺🌺2.5 AWT中常用組件()
- 🧨🧨亂碼問題
- 🎠🎠2.6 事件處理
- 🎧🎧監(jiān)聽器案例
- 菜單小案例
- 🎃🎃繪圖案例
👑👑 AWT
📜📜Java AWT簡介 (Introduction to Java AWT)
Java AWT (Abstract Window Toolkit) package is a library used for designing graphical user interfaces.
Java AWT(抽象窗口工具包)軟件包是用于設(shè)計(jì)圖形用戶界面的庫。
It contains classes for placing various user intractable components and graphics. However, the components of this class are platform dependent. They are heavy and rely on the OS for their functioning.
它包含用于放置各種用戶難以處理的組件和圖形的類。 但是,此類的組件取決于平臺。 它們很重,并且依靠OS來運(yùn)行。
The AWT package has classes using which we can create TextBoxes, CheckBoxes, RadioButton, List, etc.
AWT包具有一些類,通過這些類可以創(chuàng)建TextBoxes , CheckBoxes , RadioButton , List等。
🏮🏮層次結(jié)構(gòu) (Hierarchy)
java.awt包提供了基本的GUI設(shè)計(jì)工具,主要包括組件(Component)、容器(Container)和布局管理器(LayoutManager); Java的圖形用戶界面的最基本組成部分是組件(Component),組件不能獨(dú)立地顯示出來,必須將組件放在一定的容器中才可以顯示出來; 組件(Component)
類的部分重要的成員方法有:
getComponentAt(int x,int y) //獲得坐標(biāo)(x,y)上的組件對象 getFont() //獲得組件的字體
paint(Grahics g) //繪制組件
repaint() //重新繪制組件
setVisible(Boolean b) //設(shè)置組件是否可見
Container是一個類,實(shí)際上是Component的子類,因此容器本身也是一個組件,具有組件的所有性質(zhì),但是它的主要功能是用來放置其他組件和容器;
2.3.2 常見API
Component作為基類,提供了如下常用的方法來設(shè)置組件的大小、位置、可見性等。
方法簽名 方法功能
setLocation(int x, int y)
設(shè)置組件的位置。
setSize(int width, int reight)
設(shè)置組件的大小。
setBounds(int x, int y, int width, int height)
同時設(shè)置組件的位置、大小。
setVisible(Boolean b)
設(shè)置該組件的可見性。
Container作為容器根類,提供了如下方法來訪問容器中的組件
方法簽名 方法功能
Component add(Componen tcomp)
向容器中添加其他組件(該組件既可以是普通組件,也可以是容器),并返回被添加的組件。
Component getComponentAt(int x, int y)返回指定點(diǎn)的組件。
int getComponentCount():返回該容器內(nèi)組件的數(shù)量。
Component[] getComponents()返回該容器內(nèi)的所有組件。
2.3.3 容器演示
程序明明向 ScrollPane 容器中添加了 一個文本框和一個按鈕,但只能看到 一個按鈕,卻看不到文本框 ,這是為什么 呢?這是因?yàn)镾crollPane 使用 BorderLayout 布局管理器的緣故,而 BorderLayout 導(dǎo)致了該容器中只有一個組件被顯示出來。
💐💐2.4 LayoutManage布局管理器
之前,我們介紹了Component中有一個方法 setBounds()可以設(shè)置當(dāng)前容器的位置和大小,但是我們需要明確一件事,如果我們手動的為組件設(shè)置位置和大小的話,就會造成程序的不通用性,例如:
Label label new = Label(“你好,世界”);
創(chuàng)建了一個lable組件,很多情況下,我們需要讓lable組件的寬和“你好,世界”這個字符串自身的寬高一致,這種大小稱為最佳大小。由于操作系統(tǒng)存在差異,例如在windows上,我們要達(dá)到這樣的效果,需要把該Lable組件的寬和高分別設(shè)置為100px,20px,但是在Linux操作系統(tǒng)上,可能需要把Lable組件的寬和高分別設(shè)置為120px,24px,才能達(dá)到同樣的效果。
如果要讓我么的程序在不同的操作系統(tǒng)下,都有相同的使用體驗(yàn),那么手動設(shè)置組件的位置和大小,無疑是一種災(zāi)難,因?yàn)橛刑嗟慕M件,需要分別設(shè)置不同操作系統(tǒng)下的大小和位置。為了解決這個問題,Java提供了LayoutManager布局管理器,可以根據(jù)運(yùn)行平臺來自動調(diào)整組件大小,程序員不用再手動設(shè)置組件的大小和位置了,只需要為容器選擇合適的布局管理器即可。
2.4.1 FlowLayout
在 FlowLayout布局管理器 中,組件像水流一樣向某方向流動 (排列) ,遇到障礙(邊界)就折回,重頭開始排列在默認(rèn)情況下,FlowLayout 布局管理器從左向右排列所有組件,遇到邊界就會折回下一行重新開始。
構(gòu)造方法 方法功能
FlowLayout()
使用默認(rèn)的對齊方式及默認(rèn)的垂直間距、水平間距創(chuàng)建FlowLayout布
局管理器。
FlowLayout(int align)
使用指定的對齊方式及默認(rèn)的垂直間距、水平間距創(chuàng)建 FlowLayout 布局管理器。
FlowLayout(int align,int hgap,int vgap)
使用指定的對齊方式及指定的垂直問距、水平間距創(chuàng)建FlowLayout布局管理器。
FlowLayout 中組件的排列方向(從左向右、從右向左、從中間向兩邊等),該參數(shù)應(yīng)該使用FlowLayout類的靜態(tài)常
小案例
package java2.awt;import java.awt.*;public class WindowDome {public static void main(String[] args) {Frame frame = new Frame("Panel");frame.setLayout(new FlowLayout(FlowLayout.CENTER,30,20));for (int i = 0; i < 100; i++) {frame.add(new Button("按鈕" + i));}//用for循環(huán)創(chuàng)建100個按鈕,可能會亂碼,后面有解決方法 // Panel panel = new Panel(); // panel.add(new TextField("測試文本")); // panel.add(new Button("測試按鈕")); // frame.add(panel); // frame.setBounds(200,200,500,300);frame.pack();//窗口最佳大小frame.setVisible (true);//設(shè)為可見} }2.4.2 BorderLayout
BorderLayout將容器分為EAST、SOUTH、WEST、 NORTH、CENTER五個區(qū)域,普通組件可以被放置在這5 個區(qū)域的任意一個中。 BorderLayout布局 管理器的布局示意圖如圖所示。
NORTH
WEST CENTER EAST
? SOUTH
當(dāng)改變使用BorderLayout的容器大小時, NORTH、SOUTH和CENTER區(qū)域水平調(diào)整,而 EAST、 WEST和CENTER 區(qū)域垂直調(diào)整。使用BorderLayout有如下兩個注意點(diǎn):
構(gòu)造方法 方法功能
BorderLayout()
使用默認(rèn)的水平間距、垂直間距創(chuàng)建BorderLayout布局管理器。
BorderLayout(int hgap,int vgap):
使用指定的水平間距、垂直間距創(chuàng)建 BorderLayout 布局管理器。
2.4.3GridLayout
GridLayout 布局管理器將容器分割成縱橫線分隔的網(wǎng)格 ,每個網(wǎng)格所占的區(qū)域大小相同。當(dāng)向使用GridLayout 布局管理器的容器中添加組件時, 默認(rèn)從左向右、 從上向下依次添加到每個網(wǎng)格中 。 與FlowLayout不同的是,放置在 GridLayout 布局管理器中的各組件的大小由組件所處的區(qū)域決定(每 個組件將自動占滿整個區(qū)域)。
構(gòu)造方法 方法功能
GridLayout(int rows,in t cols)
采用指定的行數(shù)、列數(shù),以及默認(rèn)的橫向間距、縱向間距將容器 分
割成多個網(wǎng)格
GridLayout(int rows,int cols,int hgap,int vgap)
采用指定 的行數(shù)、列數(shù) ,以及指定的橫向間距、 縱向間距將容器
分割成多個網(wǎng)格。
案傷
使用Frame+Panel,配合FlowLayout和GridLayout完成一個計(jì)算器效果。
效果
2.4.4GridBagLayout
了解即可,學(xué)完swing會有更強(qiáng)大的布局管理器
GridBagLayout 布局管理器的功能最強(qiáng)大,但也最復(fù)雜,與GridLayout布局管理器不同的是,在GridBagLayout 布局管理器中,一個組件可以跨越一個或多個網(wǎng)格 , 并可以設(shè)置各網(wǎng)格的大小互不相同,從而增加了布局的靈活性 。 當(dāng)窗口的大小發(fā)生變化時 , GridBagLayout 布局管理器也可以準(zhǔn)確地控制窗口各部分的拉
伸。
由于在GridBagLayout布局中,每個組件可以占用多個網(wǎng)格,此時,我們往容器中添加組件的時候,就需要具體的控制每個組件占用多少個網(wǎng)格,java提供的GridBagConstaints類,與特定的組件綁定,可以完成具體大小和跨越性的設(shè)置。
GridBagConstraints API:
成員變量 含義
gridx 設(shè)置受該對象控制的GUI組件左上角所在網(wǎng)格的橫向索引
gridy 設(shè)置受該對象控制的GUI組件左上角所在網(wǎng)格的縱向索引
2.4.5 CardLayout
CardLayout 布局管理器以時間而非空間來管理它里面的組件,它將加入容器的所有組件看成一疊卡片(每個卡片其實(shí)就是一個組件),每次只有最上面的那個 Component 才可見。就好像一副撲克牌,它們疊在一起,每次只有最上面的一張撲克牌才可見.
方法名稱 方法功能
CardLayout() 創(chuàng)建默認(rèn)的 CardLayout 布局管理器。
CardLayout(int hgap,int vgap)通過指定卡片與容器左右邊界的間距( hgap)、上下邊界 Cvgap)的間距來創(chuàng)建 CardLayout 布局管理器
first(Container target) 顯示target 容器中的第一張卡片.
last(Container target) 顯示target 容器中的最后一張卡片.
previous(Container target) 顯示target容器中的前一張卡片.
next(Container target) 顯示target 容器中的后一張卡片.
show(Container taget,String name)顯示 target 容器中指定名字的卡片.
使用Frame和Panel以及CardLayout完成下圖中的效果,點(diǎn)擊底部 按鈕,切換卡片
2.4.6 BoxLayout
為了簡化開發(fā),SwingI引入了一個新的布局管理器:BoxLayout。BoxLayout可以在垂直和 水平兩個方向上擺放GUI組件,BoxLayout 提供了如下一個簡單的構(gòu)造器:
方法名稱 方法功能
BoxLayout(Container target, int axis)指定創(chuàng)建基于 target 容器的 BoxLayout 布局管理器,該布局管理器里的組件按axis 方向排列。其中 axis 有 BoxLayout.X_AXIS( 橫向)和 BoxLayout.Y _AXIS (縱向)兩個方向。
在java.swing包中,提供了一個新的容器Box,該容器的默認(rèn)布局管理器就是BoxLayout,大多數(shù)情況下,使用Box容器去容納多個GUI組件,然后再把Box容器作為一個組件,添加到其他的容器中,從而形成整體窗口布局。
方法名稱 方法功能
static Box createHorizontalBox()
創(chuàng)建一個水平排列組件的 Box 容器。
static Box createVerticalBox()
創(chuàng)建一個垂直排列組件的 Box 容器。
通過之前的兩個BoxLayout演示,我們會發(fā)現(xiàn),被它管理的容器中的組件之間是沒有間隔的,不是特別的美觀,但之前學(xué)習(xí)的幾種布局,組件之間都會有一些間距,那使用BoxLayout如何給組件設(shè)置間距呢?
其實(shí)很簡單,我們只需要在原有的組件需要間隔的地方,添加間隔即可,而每個間隔可以是一個組件,只不過該組件沒有內(nèi)容,僅僅起到一種分隔的作用。
Box類中,提供了5個方便的靜態(tài)方法來生成這些間隔組件:
方法名稱 方法功能
static Component createHorizontalGlue()
創(chuàng)建一條水平 Glue (可在兩個方向上同時拉伸的間距)
static Component createVerticalGlue()
創(chuàng)建一條垂直 Glue (可在兩個方向上同時拉伸的間距 )
static Component createHorizontalStrut(int width)
創(chuàng)建一條指定寬度(寬度固定了,不能拉伸)的水平Strut (可在垂直方向上拉伸的間距)
static Component createVerticalStrut(int height)
創(chuàng)建一條指定高度(高度固定了,不能拉伸)的垂直Strut (可在水平方向上拉伸的間距)
🌺🌺2.5 AWT中常用組件()
2.5.1 基本組件
組件名 功能
Button 按鈕
Canvas 用于繪圖的畫布
Checkbox復(fù)選框組件(也可當(dāng)做單選框組件使用)
CheckboxGroup用于將多個Checkbox 組件組合成一組,一組Checkbox 組件將只有一個可以被選中,即全部變成單選框組件
Choice 下拉選擇框
Frame 窗口 ,在 GUI 程序里通過該類創(chuàng)建窗口
Label 標(biāo)簽類,用于放置提示性文本
List 列表框組件,可以添加多項(xiàng)條目
Panel 不能單獨(dú)存在基本容器類,必須放到其他容器中
Scrollbar 滑動條組件。如果需要用戶輸入位于某個范圍的值 , 就可以使用滑動條組件 ,比如調(diào)色板中設(shè)置 RGB 的三個值所用的滑動條。當(dāng)創(chuàng)建一個滑動條時,必須指定它的方向、初始值、 滑塊的大小、最小值和最大值。
ScrollPane 帶水平及垂直滾動條的容器組件
TextArea 多行文本域
TextField 單行文本框
2.5.2 對話框Dialog
2.5.2.1 Dialog
Dialog 是 Window 類的子類,是 一個容器類,屬于特殊組件 .對話框是可以獨(dú)立存在的頂級窗口,因此用法與普通窗口的用法幾乎完全一樣,但是使用對話框需要注意下面兩點(diǎn):
· 對話框通常依賴于其他窗口,就是通常需要有一個父窗口;
? 對話框有非模式(non-modal)和模式(modal)兩種,當(dāng)某個模式對話框被打開后,該模式對話框總是位于它的父窗口之上,在模式對話框被關(guān)閉之前,父窗口無法獲得焦點(diǎn)。
方法名稱
Dialog(Frame owner, String title, boolean modal)
方法功能:
創(chuàng)建一個對話框?qū)ο?#xff1a;
owner:當(dāng)前對話框的父窗口
title:當(dāng)前對話框的標(biāo)題
modal:當(dāng)前對話框是否是模式對話框,true/false
2.5.2.2FileDialog
Dialog 類還有一個子類:FileDialog ,它代表一個文件對話框,用于打開或者保存 文件,需要注意的是FileDialog無法指定模態(tài)或者非模態(tài),這是因?yàn)?FileDialog 依賴于運(yùn)行平臺的實(shí)現(xiàn),如果運(yùn)行平臺的文件對話框是模態(tài)的,那么 FileDialog 也是模態(tài)的;否則就是非模態(tài)的。
方法名稱 方法功能
FileDialog(Frame parent,String title, int mode)
創(chuàng)建一個文件對話框:
parent:指定父窗口
title:對話框標(biāo)題
mode:文件對話框類型,如果指定為FileDialog.LOAD,用于打開文件,如果指定為FileDialog.SAVE,用于保存文件
String getDirectory()獲取被打開或保存文件的絕對路徑
String getFile() 獲取被打開或保存文件的文件名
🧨🧨亂碼問題
import java.awt.*; import java.awt.event.*;public class MenuDome {private Frame frame = new Frame("菜單");MenuBar menuBar = new MenuBar();Menu fileMenu = new Menu("文件");Menu editMenu = new Menu("編輯");Menu formatMenu = new Menu("注釋");MenuItem auto = new MenuItem("自動換行");MenuItem copy = new MenuItem("復(fù)制");MenuItem paste = new MenuItem("粘貼");MenuItem comment = new MenuItem("注釋 ctrl + shift",new MenuShortcut(KeyEvent.VK_Q,true));TextArea ta = new TextArea(4,60);public void init(){comment.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {ta.append("點(diǎn)擊" + e.getActionCommand() + "\n");}});formatMenu.add(comment);editMenu.add(auto);editMenu.add(copy);editMenu.add(paste);editMenu.add(formatMenu);menuBar.add(fileMenu);menuBar.add(editMenu);frame.setMenuBar(menuBar);frame.add(ta);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});frame.pack();frame.setVisible(true);}public static void main(String[] args) {new MenuDome().init();} }可以看到,此時菜單欄出現(xiàn)了亂碼,別慌,只是編碼問題
按圖一步一步來編輯配置
1.在右上角選項(xiàng)欄找到編輯配置
2.
3.在VM這一欄輸入-Dfile.encoding=gbk
記得點(diǎn)應(yīng)用和確定
🎠🎠2.6 事件處理
前面介紹了如何放置各種組件,從而得到了豐富多彩的圖形界面,但這些界面還不能響應(yīng)用戶的任何操作。比如單擊前面所有窗口右上角的"X"按鈕,但窗口依然不會關(guān)閉。因?yàn)樵?AWT 編程中 ,所有用戶的操作,都必須都需要經(jīng)過一套事件處理機(jī)制來完成,而 Frame 和組件本身并沒有事件處理能力。
2.6.1 GUI事件處理機(jī)制
定義:當(dāng)在某個組件上發(fā)生某些操作的時候,會自動的觸發(fā)一段代碼的執(zhí)行。
在GUI事件處理機(jī)制中涉及到4個重要的概念需要理解:
事件源(Event Source):操作發(fā)生的場所,通常指某個組件,例如按鈕、窗口等;
事件(Event):在事件源上發(fā)生的操作可以叫做事件,GUI會把事件都封裝到一個Event對象中,如果需要知道該事件的詳細(xì)信息,就可以通過Event對象來獲取。
事件監(jiān)聽器(Event Listener):當(dāng)在某個事件源上發(fā)生了某個事件,事件監(jiān)聽器就可以對這個事件進(jìn)行處理。
注冊監(jiān)聽:把某個事件監(jiān)聽器(A)通過某個事件(B)綁定到某個事件源?上,當(dāng)在事件源C上發(fā)生了事件B之后,那么事件監(jiān)聽器A的代碼就會自動執(zhí)行。
2.6.2 GUI中常見事件和事件監(jiān)聽器
事件監(jiān)聽器必須實(shí)現(xiàn)事件監(jiān)聽器接口,AWT提供了大量的事件監(jiān)聽器接口用于實(shí)現(xiàn)不同類型的事件監(jiān)聽器,用于監(jiān)聽不同類型的事件。AWT中提供了豐富的事件類,用于封裝不同組件上所發(fā)生的特定操作,AWT的事件類都是AWTEvent類的子類,AWTEvent是EventObject的子類。
2.6.2.1事件
AWT把事件分為了兩大類:
1.低級事件:這類事件是基于某個特定動作的事件。比如進(jìn)入、點(diǎn)擊、拖放等動作的鼠標(biāo)事件,再比如得到焦點(diǎn)和失去焦點(diǎn)等焦點(diǎn)事件。
事件 觸發(fā)時機(jī)
ComponentEvent組件事件,當(dāng)組件尺寸發(fā)生變化、位置發(fā)生移動、顯示/隱藏狀態(tài)發(fā)生改變時觸發(fā)該事件。
ContainerEvent
容器事件,當(dāng)容器里發(fā)生添加組件、刪除組件時觸發(fā)該事件。
WindowEvent窗口事件,當(dāng)窗 口狀態(tài)發(fā)生改變(如打開、關(guān)閉、最大化、最小化)時觸發(fā)該事件。
FocusEvent
焦點(diǎn)事件,當(dāng)組件得到焦點(diǎn)或失去焦點(diǎn) 時觸發(fā)該事件 。
KeyEvent
鍵盤事件,當(dāng)按鍵被按下、松開、單擊時觸發(fā)該事件。
MouseEvent
鼠標(biāo)事件,當(dāng)進(jìn)行單擊、按下、松開、移動鼠標(biāo)等動作 時觸發(fā)該事件。
*PaintEvent組件繪制事件,該事件是一個特殊的事件類型,當(dāng)GUI組件調(diào)用 update/paint 方法來呈現(xiàn)自身時觸發(fā)該事件,該事件并非專用于事件處理模型 。
2.高級事件:這類事件并不會基于某個特定動作,而是根據(jù)功能含義定義的事件。
事件 觸發(fā)時機(jī)
ActionEvent動作事件,當(dāng)按鈕、菜單項(xiàng)被單擊,在 TextField 中按 Enter鍵時觸發(fā)
AjustmentEvent調(diào)節(jié)事件,在滑動條上移動滑塊以調(diào)節(jié)數(shù)值時觸發(fā)該事件。
ItemEvent選項(xiàng)事件,當(dāng)用戶選中某項(xiàng),或取消選中某項(xiàng)時觸發(fā)該事件。
TextEvent文本事件,當(dāng)文本框、文本域里的文本發(fā)生改變時觸發(fā)該事件。
2.6.2事件監(jiān)聽器
不同的事件需要使用不同的監(jiān)聽器監(jiān)聽,不同的監(jiān)聽器需要實(shí)現(xiàn)不同的監(jiān)聽器接口,當(dāng)指定事件發(fā)生后,事件監(jiān)聽器就會調(diào)用所包含的事件處理器(實(shí)例方法)來處理事件。
事件類別 描述信息 監(jiān)聽器接口名
ActionEvent 激活組 ActionListener
ItemEvent 選擇了某些項(xiàng)目ItemListener
MouseEvent 鼠標(biāo)移動 MouseMotionListener
MouseEvent 鼠標(biāo)點(diǎn)擊等 MouseListener
KeyEvent 鍵盤輸入 KeyListener
FocusEvent 組件收到或失去焦點(diǎn)FocusListener
AdjustmentEvent 移動了滾動條等組件AdjustmentListener
ComponentEvent對象移動縮放顯示隱藏等ComponentListener
WindowEvent 窗口收到窗口級事件 WindowListener
ContainerEvent 容器中增加刪除了組件ContainerListener
TextEvent 文本字段或文本區(qū)發(fā)生改變TextListener
🎧🎧監(jiān)聽器案例
將操作在運(yùn)行款顯示出來
2.7 菜單組件
前面講解了如果構(gòu)建GUI界面,其實(shí)就是把一些GUI的組件,按照一定的布局放入到容器中展示就可以了。在實(shí)際開發(fā)中,除了主界面,還有一類比較重要的內(nèi)容就是菜單相關(guān)組件,可以通過菜單相關(guān)組件很方便的使用特定的功能,在AWT中,菜單相關(guān)組件的使用和之前學(xué)習(xí)的組件是一模一樣的,只需要把菜單條、菜單、菜單項(xiàng)組合
到一起,按照一定的布局,放入到容器中即可。
下表中給出常見的菜單相關(guān)組件:
菜單組件名稱 功能
MenuBar 菜單條 ,菜單的容器。
Menu 菜單組件,菜單項(xiàng)的容器。它也是Menultem的子類,所以可作為菜單項(xiàng)使用
PopupMenu 上下文菜單組件(右鍵菜單組件)
Menultem 菜單項(xiàng)組件。
CheckboxMenultem 復(fù)選框菜單項(xiàng)組件
菜單相關(guān)組件使用:
1.準(zhǔn)備菜單項(xiàng)組件,這些組件可以是Menultem及其子類對象
2.準(zhǔn)備菜單組件Menu或者PopupMenu(右擊彈出子菜單),把第一步中準(zhǔn)備好的菜單項(xiàng)組件添加進(jìn)來;
3.準(zhǔn)備菜單條組件MenuBar,把第二步中準(zhǔn)備好的菜單組件Menu添加進(jìn)來;
4.把第三步中準(zhǔn)備好的菜單條組件添加到窗口對象中顯示。
小技巧:
1.如果要在某個菜單的菜單項(xiàng)之間添加分割線,那么只需要調(diào)用Menu的add(new Menultem(“-”) 即可。
2.如果要給某個菜單項(xiàng)關(guān)聯(lián)快捷鍵功能,那么只需要在創(chuàng)建菜單項(xiàng)對象時設(shè)置即可,例如給菜單項(xiàng)關(guān)聯(lián)ctrl+shift+Q 快捷鍵,只需要:new Menultem(“菜單項(xiàng)名字”,new MenuShortcut(KeyEvent.VK_Q,true);
菜單小案例
實(shí)現(xiàn)如下
import java.awt.*; import java.awt.event.*;public class MenuDome {private Frame frame = new Frame("菜單");MenuBar menuBar = new MenuBar();Menu fileMenu = new Menu("文件");Menu editMenu = new Menu("編輯");Menu formatMenu = new Menu("注釋");MenuItem auto = new MenuItem("自動換行");MenuItem copy = new MenuItem("復(fù)制");MenuItem paste = new MenuItem("粘貼");MenuItem comment = new MenuItem("注釋 ctrl + shift",new MenuShortcut(KeyEvent.VK_Q,true));TextArea ta = new TextArea(4,60);public void init(){comment.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {ta.append("點(diǎn)擊" + e.getActionCommand() + "\n");}});formatMenu.add(comment);editMenu.add(auto);editMenu.add(copy);editMenu.add(paste);editMenu.add(formatMenu);menuBar.add(fileMenu);menuBar.add(editMenu);frame.setMenuBar(menuBar);frame.add(ta);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});frame.pack();frame.setVisible(true);}public static void main(String[] args) {new MenuDome().init();} }2.8 繪圖
很多程序如各種游戲都需要在窗口中繪制各種圖形,除此之外,即使在開發(fā)JavaEE項(xiàng)目時, 有 時候也必須"動態(tài)"地向客戶 端生成各種圖形、圖表,比如 圖形驗(yàn)證碼、統(tǒng)計(jì)圖等,這都需要利用AWT的繪圖功能。
2.8.1 組件繪圖原理
之前我們已經(jīng)學(xué)習(xí)過很多組件,例如Button、Frame、Checkbox等等,不同的組件,展示出來的圖形都不一樣,其實(shí)這些組件展示出來的圖形,其本質(zhì)就是用AWT的繪圖來完成的。
在AWT中,真正提供繪圖功能的是Graphics對象,那么Component組件和Graphics對象存在什么關(guān)系,才能讓Component繪制自身圖形呢?在Component類中,提供了下列三個方法來完成組件圖形的繪制與刷新:
paint(Graphics g):繪制組件的外觀;
update(Graphics g):內(nèi)部調(diào)用paint方法,刷新組件外觀;
repaint():調(diào)用update方法,刷新組件外觀;
2.8.2 Graphics對象的使用
實(shí)際生活中如果需要畫圖,首先我們得準(zhǔn)備一張紙,然后在拿一支畫筆,配和一些顏色,就可以在紙上畫出來各種各樣的圖形,例如圓圈、矩形等等。程序中繪圖也一樣,也需要畫布,畫筆,顏料等等。AWT中提供了Canvas類充當(dāng)畫布,提供了Graphics類來充當(dāng)畫筆,通過調(diào)用Graphics對象的setColor()方法可以給畫筆設(shè)置顏色。
畫圖的步驟:
1.自定義類,繼承Canvas類,重寫paint(Graphics g)方法完成畫圖;
2.在paint方法內(nèi)部,真正開始畫圖之前調(diào)用Graphics對象的setColor()、setFont()等方法設(shè)置畫筆的顏色、字體等屬性;o
3.調(diào)用Graphics畫筆的drawXxx()方法開始畫圖。
其實(shí)畫圖的核心就在于使用Graphics畫筆在Canvas畫布上畫出什么顏色、什么樣式的圖形,所以核心在畫筆上下表中列出了Graphics類中常用的一些方法:
有法名稱 方法功能
setColor(Color c)設(shè)置顏色
setFont(Font font)設(shè)置字體
drawLine()繪制直線
drawRect()繪制矩形
drawRoundRect()繪制圓角矩形
drawOval()繪制橢圓形
drawPolygon()繪制多邊形
drawArc()繪制圓弧
drawPolyline()繪制折線
fillRect()填充矩形區(qū)域
fillRoundRect()填充圓角矩形區(qū)域
fillOval()填充橢圓區(qū)域
fillPolygon()填充多邊形區(qū)域
fillArc()填充圓弧對應(yīng)的扇形區(qū)域
drawlmage()繪制位圖
🎃🎃繪圖案例
需求:編寫一個窗口實(shí)現(xiàn)繪制矩形和圓形
總結(jié)
以上是生活随笔為你收集整理的【Java基础】之AWT,一篇文章搞懂awt(包含绘图)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 圣诞节海报
- 下一篇: Java IO流 详解(字节流、字符流、