Java?Swing的層次結(jié)構(gòu)深入理解
Java Swing的層次結(jié)構(gòu)
什么是Java Swing
Swing 是一個(gè)用于開(kāi)發(fā)Java圖形界面應(yīng)用程序的開(kāi)發(fā)工具包,它是以抽象窗口工具包(AWT:Abstract Window Toolkit)為基礎(chǔ),使跨平臺(tái)應(yīng)用程序可以使用任何可插拔的外觀風(fēng)格。
通常把AWT控件稱為重量級(jí)控件,而把Swing控件稱為輕量級(jí)控件。
Swing組件的層次結(jié)構(gòu)
Swing組件可以分成兩種類型,一種是JComponent類,另一種是Window類。兩者的區(qū)別是JComponent組件類主要包括一些不能獨(dú)立顯示的組件(即必須依賴于中間容器才能顯示),而Window組件類主要包括了一些可以獨(dú)立顯示的組件。鑒于此,可以講Swing的組件分為三種類型:頂層組件、中間組件、基本組件,如下圖:
頂層容器(即Window組件):JFrame、JApplet、JDialog、JWindow;
- 中間容器:JPanel、JScrollPane、JSplitOPane、JToolBar;這些容器可以充當(dāng)載體,但也是不可以獨(dú)立顯示的組件,必須依附在頂層容器內(nèi);
- 特殊容器:在GUI上起特殊作用的中間層,如JInternalFrame、JLayeredPane等;
- 基本組件:實(shí)現(xiàn)人機(jī)交互的組件,如JButton、JComboBox、JList、JMenu、JTextField。
關(guān)于三層組件
1、當(dāng)進(jìn)行圖形編程時(shí),需要一個(gè)能夠提供圖形繪制的容器(即頂層容器),可以將它想象稱為一個(gè)窗口,它是進(jìn)行圖形編程的基礎(chǔ),一切圖形的東西都必然包括在頂層容器中。
2、可以作為頂層容器的三種組件:
JFrame
:類似于Windows系統(tǒng)中窗口形式的應(yīng)用程序;JDialog
:和JFrame類似,用于設(shè)計(jì)對(duì)話框;JApplet
:用于設(shè)計(jì)可以嵌入在網(wǎng)頁(yè)中的小程序。
3、基于Swing的圖形界面至少要有一個(gè)頂層容器,每一個(gè)頂層容器都有一個(gè)內(nèi)容面板,同時(shí)可以為頂層容器添加菜單組件。
剩下的便是向內(nèi)容面板或菜單組件中添加一些基本組件,這些組件的使用相對(duì)簡(jiǎn)單,其中JTree和JTable較難。
Java Swing基礎(chǔ)(層次結(jié)構(gòu),組件,布局管理)
Swing基礎(chǔ)層次結(jié)構(gòu)
圖形環(huán)境和圖形對(duì)象
- 坐標(biāo)
GUI組件的左上角坐標(biāo)默認(rèn)為(0,0)
從左上角到右下角,水平坐標(biāo)x和垂直坐標(biāo)y增加
坐標(biāo)的單位是像素
- Graphics對(duì)象
專門管理圖形環(huán)境,Graphics類是一個(gè)抽象類
抽象類Graphics提供了一個(gè)于平臺(tái)無(wú)關(guān)的繪圖接口
各平臺(tái)上實(shí)現(xiàn)的Java系統(tǒng)將創(chuàng)建Graphics類的一個(gè)子類來(lái)實(shí)現(xiàn)繪圖功能,這個(gè)子類對(duì)程序員是透明的。
在執(zhí)行paint方法時(shí),系統(tǒng)會(huì)傳遞一個(gè)指向特定平臺(tái)的Graphics子類的圖形對(duì)象g
一個(gè)簡(jiǎn)單的例子
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import javax.swing.JFrame; public class GraphicsTester extends JFrame{ private static final long serialVersionUID = 1L; public GraphicsTester() { super("演示字體、顏色、繪圖"); setVisible(true); setSize(480,250); } public void paint(Graphics g) { super.paint(g); g.setFont(new Font("SansSerif",Font.BOLD,12)); g.setColor(Color.blue); g.drawString("字體ScanSerif,粗體,14號(hào),紅色",250,50); } public static void main(String[] args) { // TODO Auto-generated method stub GraphicsTester g = new GraphicsTester(); g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
上面的程序需要注意三處代碼
public class GraphicsTester extends JFrame
我們需要繼承一個(gè)主窗口,才能實(shí)現(xiàn)swing編程
public void paint(Graphics g)
這里的Graphics g不用我們自己定義,是由Java自動(dòng)生成的
g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
設(shè)置關(guān)閉窗口的默認(rèn)操作
注意: paint方法會(huì)被自動(dòng)調(diào)用
其他的畫(huà)圖函數(shù)看API文檔就可以了
前面我們使用的是Graphics來(lái)繪圖,其實(shí)我們可以用更強(qiáng)大的Graphics2D來(lái)繪圖,當(dāng)然,我們需要將傳遞進(jìn)來(lái)的g向上轉(zhuǎn)型為Graphics2D,因?yàn)閭鬟f過(guò)來(lái)的g就是Graphics2D的一個(gè)子類
Graphics2D g2d = (Graphics2D)g;
Swing 基礎(chǔ)
swing:一個(gè)預(yù)定好各種組件的包,JFrame就是swing里面的一個(gè)組件
JFC與Swing
JFC(Java Foundation Classes)
- 是關(guān)于GUI組件和服務(wù)的完整集合
- 作為JAVA SE的一個(gè)有機(jī)部分,主要包含5個(gè)部分
AWT
Java2D
Accessibility
Drag & Drop
Swing
- Swing
- JFC的一部分
- 提供按鈕、窗口、表格等所有的組件
- 純Java組件(完全用Java寫(xiě)的組件)
AWT組件
- 在Java.awt包里,包括Button、Checkbox、Scrollbar等,都是Component類的子類
- 大部分含有native code,所以隨操作系統(tǒng)平臺(tái)的不同會(huì)顯示出不同的樣子,而不能進(jìn)行更改,是重量級(jí)的組件
Swing組件
- 其名稱都是在原來(lái)的AWT組件名稱前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponent類的子類
- 架構(gòu)在AWT上,是AWT的擴(kuò)展而不是取代
- 完全由Java語(yǔ)言編寫(xiě),其外觀和功能不依賴于任何由宿主平臺(tái)的窗口系統(tǒng)所提供的代碼,是輕量級(jí)組件
- 可提供更豐富的視覺(jué)感受
在Applet和Application中應(yīng)用Swing
- 在Applet中應(yīng)用Swing,就要將Swing組件加載到Applet容器上(通常是JApplet),這通常在init方法中完成
- 在Application(本地應(yīng)用程序,也就是主函數(shù)中)中應(yīng)用Swing,也是要將Swing組件加載到這個(gè)Application的頂層容器(通常是JFrame)中。
也就是說(shuō),如果要使用Swing組件,就要加到容器上
容器是從哪里來(lái)的?容器又是什么?
Swing層次
組件的繼承層次如上,大多數(shù)Swing組件都繼承于JComponent
- Component類
包含paint、repaint方法,可以在屏幕上繪制組件
大多數(shù)GUI組件直接或間接的擴(kuò)展Component
- Container類
容納相關(guān)組件
包括add方法,用來(lái)添加組件
包括setLayout方法,用來(lái)設(shè)置布局,幫助Container對(duì)象對(duì)其中的組件進(jìn)行定位和設(shè)置組件大小
- JComponent類–多數(shù)Swing組件的超類
可定制的觀感、即可根據(jù)需求定制組件
快捷鍵(通過(guò)鍵盤(pán)直接訪問(wèn)GUI組件)
一般的事件處理功能
Swing的組件和容器層次
- 頂層容器
必須跟操作系統(tǒng)打交道,所以都是重量級(jí)組件、
每個(gè)使用Swing組件的Java程序都必須至少由一個(gè)頂層容器,別的組件都必須放在這個(gè)頂層容器上才能顯示出來(lái))
JFrame實(shí)現(xiàn)單個(gè)主窗口
JDialog 實(shí)現(xiàn)一個(gè)二級(jí)窗口
JApplet在瀏覽器窗口實(shí)現(xiàn)一個(gè)applet顯示區(qū)域
- 中間層容器
容納其他組件的
- 原子組件
直接與用戶交互的組件
例:三層容器結(jié)構(gòu)
package swing; import javax.swing.*; import java.awt.*; import javax.swing.JFrame; public class ComponentTester { @SuppressWarnings("deprecation") public static void main(String[] args) { // TODO Auto-generated method stub JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("Swing Frame"); Container contentPane=frame.getContentPane(); JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createLineBorder(Color.black, 5)); panel.setLayout(new GridLayout(2,1)); JLabel label = new JLabel("Label",SwingConstants.CENTER); JButton button = new JButton("Button"); panel.add(label); panel.add(button); contentPane.add(panel); frame.pack(); frame.show(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
分析一下關(guān)鍵部分的代碼
首先,需要一個(gè)頂層容器,然后從容器得到一個(gè)內(nèi)容面板Container
JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("Swing Frame"); Container contentPane=frame.getContentPane();
接下來(lái),定義一個(gè)中間容器并完成一些初始化操作
JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createLineBorder(Color.black, 5)); panel.setLayout(new GridLayout(2,1));
定義一些原子組件
JLabel label = new JLabel("Label",SwingConstants.CENTER); JButton button = new JButton("Button");
最后一步,將原子組件加在中間層容器,然后將中間層容器加到頂層容器上
panel.add(label); panel.add(button); contentPane.add(panel);
以上就是Swing組件的基本層次結(jié)構(gòu)了
布局管理
使用方法: 調(diào)用容器的setLayout方法就可以了
例如:
Container contentPane = frame.getContentPane(); ContentPane.setLayout(new FlowLayout());
其中的FlowLayout是布局管理器對(duì)象
有許多常用的布局管理器類,直接查找API文檔就可以了
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能
這篇文章主要介紹了SpringBoot整合kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07Java的動(dòng)態(tài)分派和靜態(tài)分派的實(shí)現(xiàn)
這篇文章主要介紹了Java的動(dòng)態(tài)分派和靜態(tài)分派的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03JavaWeb開(kāi)發(fā)實(shí)現(xiàn)備忘錄
這篇文章主要為大家詳細(xì)介紹了JavaWeb開(kāi)發(fā)實(shí)現(xiàn)備忘錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06基于spring 方法級(jí)緩存的多種實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇基于spring 方法級(jí)緩存的多種實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09