更新時(shí)間:2022-04-29 10:46:32 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2321次
很多小伙伴對(duì)Java圖形界面的組成還不是了解,動(dòng)力節(jié)點(diǎn)小編就來(lái)為大家講解一下。我們?cè)谄綍r(shí)生活中用電腦的時(shí)候,我們可以發(fā)現(xiàn)我們所運(yùn)行的所有的程序基本都是在某一個(gè)窗口中運(yùn)行。這個(gè)窗口可以實(shí)現(xiàn)我們和程序的交互,可以讓一個(gè)程序更加的精彩和多元。實(shí)際上現(xiàn)在我們所用的很多操作系統(tǒng)都是以窗體為基礎(chǔ)實(shí)現(xiàn)自己程序或者軟件的功能。
實(shí)際上我們經(jīng)常使用的MicroSoft Windows系統(tǒng)中的“Windows”就是“窗口”的意思。
(1)AWT組件
AWT(Abstract Window Toolkit),中文譯為抽象窗口工具包,該包提供了一套與本地圖形界面進(jìn)行交互的接口,是Java提供的用來(lái)建立和設(shè)置Java的圖形用戶界面的基本工具。AWT中的圖形函數(shù)與操作系統(tǒng)所提供的圖形函數(shù)之間有著一一對(duì)應(yīng)的關(guān)系,稱之為peers,當(dāng)利用AWT編寫圖形用戶界面時(shí),實(shí)際上是在利用本地操作系統(tǒng)所提供的圖形庫(kù)。由于不同 操作系統(tǒng)的圖形庫(kù)所提供的樣式和功能是不一樣的,在一個(gè)平臺(tái)上存在的功能在另一個(gè)平臺(tái)上則可能不存在。為了實(shí)現(xiàn)Java語(yǔ)言所宣稱的“一次編寫,到處運(yùn)行(write once, run anywhere)”的概念,AWT不得不通過(guò)犧牲功能來(lái)實(shí)現(xiàn)平臺(tái)無(wú)關(guān)性,也即AWT所提供的圖形功能是各種操作系統(tǒng)所提供的圖形功能的交集。
AWT組件是Java在JDK1.0時(shí)期推出的圖形界面類,也是整個(gè)Java中最基本的圖形界面類,是一切圖形界面的基礎(chǔ)。我們把AWT組件稱為重量級(jí)組件。因?yàn)檫@些組件的實(shí)現(xiàn)是調(diào)用了操作系統(tǒng)底層的繪圖函數(shù)。也就是說(shuō)AWT組件類與操作系統(tǒng)有著密切的聯(lián)系。
(2)SWING組件
如上所述,Java的圖形界面組件類致力于“一次編寫,到處運(yùn)行”,也就是跨操作平臺(tái)運(yùn)行。而AWT組件卻和操作系統(tǒng)的底層繪圖函數(shù)緊密聯(lián)系,這就直接導(dǎo)致了AWT組件不得不犧牲一部分功能來(lái)實(shí)現(xiàn)跨平臺(tái)。
Java為了解決這個(gè)問(wèn)題,他們?cè)贘DK1.4的時(shí)候推出了SWING這套采用純Java代碼編寫的輕量級(jí)組件。也就是說(shuō),這條組件僅僅是以AWT為基礎(chǔ),與操作系統(tǒng)沒(méi)有直接的聯(lián)系。SWING組件很好的實(shí)現(xiàn)了Java的跨平臺(tái)性,也是我們以后使用的最主要的組件類。
(3)JavaFX組件
JavaFX是JDK1.7的時(shí)候推出的圖形界面組件類。這里不過(guò)多介紹。
(1)容器組件類
所謂容器,就是類似于收納盒、包、鍋碗瓢盆等可以容納東西的物體。類似地,容器組件就是指可以容納其他組件的組件,最典型的就是我們經(jīng)常看到的窗口(窗體)組件。
JFrame是SWING包下的頂級(jí)容器組件類。所謂頂級(jí)容器,就是說(shuō)它只能裝別的組件,而不能被其他組件所包含。JFrame的作用就是實(shí)現(xiàn)一個(gè)基本的窗口以及其開(kāi)關(guān)。調(diào)整大小等作用。
JPanel是SWING包下的一個(gè)容器組件,我們稱之為“面板”,可以加在窗體上以實(shí)現(xiàn)我們想要的各種布局。
(2)元素組件類
元素組件就是想按鈕、標(biāo)簽、復(fù)選框等的一類實(shí)現(xiàn)某種具體功能的組件。我們經(jīng)常使用的有以下幾種:
JLabel 標(biāo)簽元素組件類 顯示文字或者圖片
JTextField 文本輸入框元素組件類 接收輸入信息,將輸入信息顯示出來(lái)
JPasswordField 密碼輸入框元素組件類 接收輸入信息,將輸入的信息以某個(gè)符號(hào)代替顯 示
JCheckBox 復(fù)選框(多選框)元素組件類 首先又一個(gè)選擇框,在選擇框后還能顯示文字或 者圖片信息
JButton 按鈕元素組件類 顯示文字或圖片,提供一個(gè)點(diǎn)擊效果
(3)輔助類
輔助類就是那些有助于我們優(yōu)化界面或者幫助某個(gè)組件完成功能的類。典型的常用的類有如下幾個(gè):
javax.swing.ImageIcon 圖標(biāo)類。將磁盤上的圖片文件加載到程序中。
java.awt.FlowLayout 流式布局類。流式布局類似word文檔(所有的布局類都只能應(yīng)用于容器組件上) 在java.awt和javax.swing包下所有以Layout結(jié)尾的類都是布局類
java.awt.Dimension 封裝類。用來(lái)封裝組件的寬度和高度
BorderLayout 邊框布局。把容器分為上北下南左西右東中間五個(gè)部分,這五個(gè)部分的組成如下:
我們可以對(duì)邊框布局的五個(gè)部分進(jìn)行大小的設(shè)置。從上圖中我們可以看到對(duì)于南北兩個(gè)部分我們只能設(shè)置它的高度,它的寬度和窗體的寬度是一致的;對(duì)于東西兩個(gè)部分我們可以設(shè)置它的寬度,它的高度有嫩被兩個(gè)部分以及窗體的高度決定;對(duì)于中部,我們可以直接設(shè)置它的長(zhǎng)寬。
(1)定義一個(gè)“login”類,這個(gè)類帶有初始化界面的方法和主函數(shù)
(2)在主函數(shù)中,實(shí)例化Login類的對(duì)象,然后用對(duì)象名來(lái)調(diào)用初始化界面的方法。
(3)在初始化界面的方法中,實(shí)例化JFrame窗體容器組件類的對(duì)象。
(4)設(shè)置窗體容器組件對(duì)象的屬性值:標(biāo)題、大小、顯示位置、關(guān)閉操作、布局、可見(jiàn)、...
以上四步代碼如下:
package test;
import java.awt.Color;
import javax.swing.JFrame;
public class Login {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Login l = new Login();//實(shí)例化一個(gè)Login對(duì)象。
l.initUI();//調(diào)用初始化窗體的方法。
}
public void initUI(){
javax.swing.JFrame frame = new javax.swing.JFrame();//實(shí)例化一個(gè)窗體對(duì)象
frame.setTitle("登陸界面");//設(shè)置窗體的標(biāo)題
frame.setSize(800,800);//設(shè)置窗體的大小
frame.setLocationRelativeTo(null);//設(shè)置窗體的位置為居中
frame.setResizable(false);//設(shè)置不可調(diào)節(jié)大小
frame.setDefaultCloseOperation(3);//設(shè)置窗體的關(guān)閉操作。這個(gè)方法有0 1 2 3四個(gè)返回值。其中0是指不關(guān)閉,也就是說(shuō)無(wú)論點(diǎn)擊多少次關(guān)閉按鈕都不會(huì)有反應(yīng)。1是指點(diǎn)擊關(guān)閉按鈕會(huì)關(guān)閉這個(gè)窗體但是程序依然在后臺(tái)運(yùn)行。2是指如果有多個(gè)窗體就關(guān)閉當(dāng)前窗體,如果只有一個(gè)則關(guān)閉程序。3是指直接關(guān)閉程序。
frame.setBackground(Color.LIGHT_GRAY);//設(shè)置窗體的背景顏色
frame.setVisible(true);//設(shè)置窗體可見(jiàn)。如果不設(shè)置這一步那么窗體看不見(jiàn)。另外所有的組建都要加在這個(gè)方法之前,否則不可見(jiàn)。
}
}
這時(shí)候運(yùn)行該程序的效果如下:
(5)實(shí)例化元素組件對(duì)象并添加到窗體上:
package test;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JFrame;
public class Login {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Login l = new Login();//實(shí)例化一個(gè)Login對(duì)象。
l.initUI();//調(diào)用初始化窗體的方法。
}
public void initUI(){
javax.swing.JFrame frame = new javax.swing.JFrame();//實(shí)例化一個(gè)窗體對(duì)象
frame.setTitle("登陸界面");//設(shè)置窗體的標(biāo)題
frame.setSize(800,800);//設(shè)置窗體的大小
frame.setLocationRelativeTo(null);//設(shè)置窗體的位置為居中
frame.setResizable(false);//設(shè)置不可調(diào)節(jié)大小
frame.setDefaultCloseOperation(3);//設(shè)置窗體的關(guān)閉操作。這個(gè)方法有0 1 2 3四個(gè)返回值。其中0是指不關(guān)閉,也就是說(shuō)無(wú)論點(diǎn)擊多少次關(guān)閉按鈕都不會(huì)有反應(yīng)。1是指點(diǎn)擊關(guān)閉按鈕會(huì)關(guān)閉這個(gè)窗體但是程序依然在后臺(tái)運(yùn)行。2是指如果有多個(gè)窗體就關(guān)閉當(dāng)前窗體,如果只有一個(gè)則關(guān)閉程序。3是指直接關(guān)閉程序。
frame.setBackground(Color.LIGHT_GRAY);//設(shè)置窗體的背景顏色
javax.swing.ImageIcon image = new javax.swing.ImageIcon("C:\\Users\\Apple\\Pictures\\Saved Pictures\\冠軍.jpg");//實(shí)例化一個(gè)圖片對(duì)象,并引用圖片路徑
javax.swing.JLabel Limage = new javax.swing.JLabel(image);//實(shí)例化一個(gè)標(biāo)簽對(duì)象,并把上面的圖片對(duì)象添加上去。
frame.add(Limage);//在窗體上添加標(biāo)簽
javax.swing.JLabel Lname = new javax.swing.JLabel("賬號(hào):");//實(shí)例化一個(gè)標(biāo)簽對(duì)象并調(diào)整字體、大小
Lname.setFont(new Font("楷體",Font.BOLD,20));
frame.add(Lname);//添加到面板,下同
javax.swing.JTextField Tname = new javax.swing.JTextField();//實(shí)例化一個(gè)文本輸入框?qū)ο蟛⒄{(diào)整大小
java.awt.Dimension dim = new java.awt.Dimension(300,30);
Tname.setPreferredSize(dim);
frame.add(Tname);
javax.swing.JLabel Lcode = new javax.swing.JLabel("密碼:");//實(shí)例化一個(gè)標(biāo)簽對(duì)象并調(diào)整字體、大小
Lcode.setFont(new Font("楷體",Font.BOLD,20));
frame.add(Lcode);
javax.swing.JPasswordField Pcode = new javax.swing.JPasswordField();//實(shí)例化一個(gè)密碼輸入框?qū)ο蟛⒄{(diào)整大小
java.awt.Dimension Pdim = new java.awt.Dimension(300,30);
Pcode.setPreferredSize(Pdim);
frame.add(Pcode);
javax.swing.JCheckBox C1 =new javax.swing.JCheckBox("記住密碼");//實(shí)例化一個(gè)復(fù)選框?qū)ο蟛⒄{(diào)整字體、大小
C1.setFont(new Font("楷體",Font.BOLD,20));
frame.add(C1);
javax.swing.JCheckBox C2 = new javax.swing.JCheckBox("自動(dòng)登錄");//實(shí)例化一個(gè)復(fù)選框?qū)ο蟛⒄{(diào)整字體、大小
C2.setFont(new Font("楷體",Font.BOLD,20));
frame.add(C2);
javax.swing.JButton Blogin = new javax.swing.JButton("登錄");//實(shí)例化一個(gè)按鈕對(duì)象并調(diào)整字體、大小
Blogin.setPreferredSize(new java.awt.Dimension(300,40));
Blogin.setFont(new Font("楷體",Font.BOLD,20));
frame.add(Blogin);
frame.setVisible(true);//設(shè)置窗體可見(jiàn)。如果不設(shè)置這一步那么窗體看不見(jiàn)。另外所有的組建都要加在這個(gè)方法之前,否則不可見(jiàn)。
}
}
看起來(lái)好像加齊了,我們運(yùn)行試一試:
好大一個(gè)登錄按鈕!!!!!
這是為什么?
JFrame窗體的默認(rèn)布局是邊框布局,也就是說(shuō)我們前面要加的東西確實(shí)已經(jīng)加上去了,但是被一層一層覆蓋掉了。所以這個(gè)時(shí)候我們就需要設(shè)置一下窗體的布局。我們可以把窗體設(shè)置成流式布局(FlowLayout)
java.awt.FlowLayout 流式布局類。流式布局類似word文檔(所有的布局類都只能應(yīng)用于容器組件上)我們給上面加一段代碼:
java.awt.FlowLayout fl = new java.awt.FlowLayout();
//實(shí)例化一個(gè)布局對(duì)象
frame.setLayout(fl);調(diào)用這個(gè)對(duì)象
這段代碼要加在上面設(shè)置背景顏色之后。
加上這段代碼我們?cè)賮?lái)一次:
是不是好了很多?
上面我們成功地做出來(lái)了一個(gè)登錄界面。但是 ··· 是不是還是不夠漂亮?我們想一下,某社交軟件的登錄界面是怎樣的?是不是頭像占據(jù)了兩行的位置,它的右邊是賬號(hào)密碼?這個(gè)好像在流式布局中樹沒(méi)辦法實(shí)現(xiàn)的啊。
于是,我們就要用到“東西南北中”的邊框布局和“JPanel”面板了。
我們快同意根據(jù)自己的需要把JPanel面板對(duì)象加在邊框布局的任何一部分里。而邊框布局的每一個(gè)部分之中是默認(rèn)的流式布局,面板中默認(rèn)也是流式布局。這樣一想,我們是不是就可以把那些元素組件單獨(dú)的放在幾個(gè)面板里面調(diào)整它們的大小屬性,一球更加精致的界面了呢?
注意,下面不在將元素組件加在窗體上,而是加在面板上。
import java.awt.Font;
public class Login {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Login l = new Login();
l.initUI();
}
public void initUI() {
javax.swing.JFrame frame = new javax.swing.JFrame();//初始化窗體結(jié)構(gòu)
frame.setTitle("登錄");
frame.setSize(800,800);
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);
javax.swing.ImageIcon image = new javax.swing.ImageIcon("C:\\Users\\Apple\\Pictures\\Saved Pictures\\冠軍.jpg");
javax.swing.JLabel Limage = new javax.swing.JLabel(image);
frame.add(Limage,java.awt.BorderLayout.NORTH);//上部圖片部分
javax.swing.JPanel centerPanel = new javax.swing.JPanel();//中部面板設(shè)置
javax.swing.JLabel Lname = new javax.swing.JLabel("賬號(hào):");
Lname.setFont(new Font("楷體",Font.BOLD,20));
centerPanel.add(Lname);//加在面板上?。。。?
javax.swing.JTextField Tname = new javax.swing.JTextField();
java.awt.Dimension dim = new java.awt.Dimension(300,30);
Tname.setPreferredSize(dim);
centerPanel.add(Tname);//加在面板上?。。?!
javax.swing.JLabel Lcode = new javax.swing.JLabel("密碼:");
Lcode.setFont(new Font("楷體",Font.BOLD,20));
centerPanel.add(Lcode);//加在面板上?。。?!
javax.swing.JPasswordField Pcode = new javax.swing.JPasswordField();
java.awt.Dimension Pdim = new java.awt.Dimension(300,30);
Pcode.setPreferredSize(Pdim);
centerPanel.add(Pcode);//加在面板上?。。?!
javax.swing.JCheckBox C1 =new javax.swing.JCheckBox("記住密碼");
C1.setFont(new Font("楷體",Font.BOLD,20));
centerPanel.add(C1);//加在面板上?。。?!
javax.swing.JCheckBox C2 = new javax.swing.JCheckBox("自動(dòng)登錄");
C2.setFont(new Font("楷體",Font.BOLD,20));
centerPanel.add(C2);//加在面板上?。。?!
javax.swing.JButton Blogin = new javax.swing.JButton("登錄");
Blogin.setPreferredSize(new java.awt.Dimension(300,40));
Blogin.setFont(new Font("楷體",Font.BOLD,20));
centerPanel.add(Blogin);//加在面板上!?。?!
frame.add(centerPanel,java.awt.BorderLayout.CENTER);//中部面板設(shè)置完成
javax.swing.JPanel westPanel = new javax.swing.JPanel();//設(shè)置左邊的面板
javax.swing.ImageIcon Icon = new javax.swing.ImageIcon("C:\\Users\\Apple\\Pictures\\Saved Pictures\\隊(duì)標(biāo).jpg");
westPanel.add(new javax.swing.JLabel(Icon) );//加在面板上?。。?!
westPanel.setPreferredSize(new java.awt.Dimension(200,0));
westPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));//流式布局設(shè)置為靠右對(duì)齊
frame.add(westPanel,java.awt.BorderLayout.WEST);//設(shè)置完成
javax.swing.JPanel eastPanel = new javax.swing.JPanel();
eastPanel.setPreferredSize(new java.awt.Dimension(200,0));
frame.add(eastPanel,java.awt.BorderLayout.EAST);//右邊的面板
frame.setVisible(true);
}
}
可以看到,我在上面的窗體上加入了四個(gè)面板,分別放在“東、西、北、中”四個(gè)部分上(邊框布局是窗體的默認(rèn)布局方式,不用單獨(dú)設(shè)置)。下部由于沒(méi)有要加的內(nèi)容,就沒(méi)有設(shè)置面板。
現(xiàn)在我們看看效果怎樣:
現(xiàn)在是不是比上面那個(gè)舒服多了?
現(xiàn)在我們就成功地實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的登錄界面。如果大家想了解更多相關(guān)知識(shí),不妨來(lái)關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容從入門到精通,細(xì)致全面,通俗易懂,適合沒(méi)有基礎(chǔ)的小伙伴學(xué)習(xí),希望對(duì)大家能夠有所幫助哦。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743