Java Swing最詳細基礎(chǔ)知識總結(jié)
一、簡介
Swing 是一個為Java設(shè)計的GUI工具包。
Swing是JAVA基礎(chǔ)類的一部分。
Swing包括了圖形用戶界面(GUI)器件如:文本框,按鈕,分隔窗格和表。
Swing提供許多比AWT更好的屏幕顯示元素。它們用純Java寫成,所以同Java本身一樣可以跨平臺運行,這一點不像AWT。它們是JFC的一部分。它們支持可更換的面板和主題(各種操作系統(tǒng)默認的特有主題),然而不是真的使用原生平臺提供的設(shè)備,而是僅僅在表面上模仿它們。這意味著你可以在任意平臺上使用JAVA支持的任意面板。輕量級組件的缺點則是執(zhí)行速度較慢,優(yōu)點就是可以在所有平臺上采用統(tǒng)一的行為。
二、Swing 組件的層次結(jié)構(gòu)

從上圖可以看出各組件之間的繼承關(guān)系,我們可以看到Container類下面有四個子類,這四個子類中,除了JComponent類以外,其余三個都是Java AWT包中的類,而JComponent是Java Swing所出現(xiàn)的類。Sun公司在設(shè)計Java Swing時用JComponent把容器和組件之間由Java AWT過渡到Java Swing,也就是說大部分Java Swing中的容器和組件都繼承JComponent類。
Container類除了JComponent類之外,其余三個都是Java AWT中的容器,需要注意的是容器又分為頂級容器和中間容器。頂級容器是指圖形界面最外層的容器,如窗口(Window)。中間容器是指存放在頂級容器或者中間容器中的一種容器,如面板(Panel)。在實際編程中,要開發(fā)一個界面應該是這樣的,頂級容器在最外面(JFrame),其次是中間容器,放在窗體上(JPanel),最后是基本組件,放在中間容器上。這里需要注意的是,容器中除了可以存放基本組件外,還可以存放容器,如圖所示:

我們經(jīng)常使用的頂級容器是窗體(JFrame)和對話框(JDialog),使用的中間容器是面板(JPanel)。開發(fā)中經(jīng)常使用的基本組件大部分用JComponent類下的子類。
Component類的主要方法有:
(1) void enable():使組件可用。
(2) void disable(): 使組件不可用
(3) void show(): 顯示組件
(4) void paint(): 繪制圖形
(5) void repaint(): 刷新
Container類的主要方法有:
(1) void add(Component c):將指定組件加入到容器中。
(2) void setLayout(): 設(shè)置布局管理器。
所有的包含組件都可繼承或重載以上方法。
三、Swing組件
常用的Swing組件如下表所示:
| 組件名稱 | 定義 |
| JButton | 代表Swing按鈕,按鈕可用帶一些圖片或文字 |
| JCheckBox | 代表Swing中的復選框組件 |
| JComBox | 代表下拉列表框,可以在下拉顯示區(qū)域顯示多個選項 |
| JFrame | 代表Swing的框架類 |
| JDialog | 代表Swing版本的對話框 |
| JLabel | 代表Swing中的標簽組件 |
| JRadioButton | 代表Swing的單選按鈕 |
| JList | 代表能夠在用戶界面中顯示一系列條目的組件 |
| JTextField | 代表文本框 |
| JPasswordField | 代表密碼框 |
| JTextArea | 代表Swing中的文本區(qū)域 |
| JOptionPane | 代表Swing中的一些對話框 |
3.1 JFrame窗體組件
JFrame是獨立于瀏覽器的可獨立運行的主窗口,通常用于開發(fā)桌面應用程序/JFrame具有邊界和標題欄設(shè)置,其大小可以調(diào)整。JFrame中需要加入組件,也可以加入菜單,或在上面繪圖。
JFrame在程序中的語法格式如下:
JFrame jf=new JFrame(title); Container container=jf.getContentPane();
jf:JFrame類的對象
container:Container類的對象,可以使用JFrame對象調(diào)用getContentPane()方法獲取。
我們應該有這樣一個概念,Swing組件的窗體通常與組件和容器相關(guān),所以在JFrame對象創(chuàng)建完成后,需要調(diào)用getContentPane()方法將窗體轉(zhuǎn)換為容器,然后在容器中添加組件或設(shè)置布局管理器。通常,這個容器用來包含和顯示組件。如果需要將組件添加至容器,可以使用來自Cointainer類的add()方法進行設(shè)置。例如:
container.add(new JButton("按鈕");
下面我們就用Java代碼做一個簡單的窗體,如下所示:
package xmsj;
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class test1 {
public static void main(String[] args){
//創(chuàng)建一個窗體對象
JFrame jf=new JFrame("這是一個JFrame窗體");
//獲取一個容器,用來放置各種組件或布局管理器
Container container=jf.getContentPane();
JLabel jl=new JLabel("這是一個JFrame窗體"); //創(chuàng)建一個JLabel標簽
//使標簽上的文字居中
jl.setHorizontalAlignment(SwingConstants.CENTER);
//將標簽添加到容器中
container.add(jl);
container.setBackground(Color.white); //設(shè)置容器的背景顏色
//設(shè)置窗體可見
jf.setVisible(true);
//設(shè)置窗體大小
jf.setSize(200,150);
//設(shè)置窗體關(guān)閉方式
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
顯示如下圖所示:

上面的程序展示了如何創(chuàng)建一個簡單的窗體,JFrame還有其想對應的方法,如下所示:
JFrame組件中提供了如下兩個常用的構(gòu)造方法:
(1)JFrame():創(chuàng)建一個沒有窗口標題的窗口框架。
(2)JFrame(String):創(chuàng)建一個指定窗口標題的窗口框架。
JFrame的主要方法如下表所示:
| 方法 | 功能 |
| addNotify() | 創(chuàng)建一個對等的Frame |
| dispose() | 清楚窗口對象 |
| getIconImage() | 獲得窗口的圖標 |
| getMenuBar() | 獲得窗口的菜單欄 |
| getTitle() | 獲取窗口的標題 |
| paramString() | 返回窗口的參數(shù)字符串 |
| isResizable() | 如果窗口大小可變,則返回真值 |
| remove(MenuComponent) | 從窗口中去掉指定的菜單欄 |
| setIconImage(Image) | 設(shè)置窗口的圖標 |
3.2 JDialog窗體組件
JDialog窗體是Swing組件中的對話框,它繼承了AWT組件中的java.awt.Dialog類。
對話框(JDialog)與框架(JFrame)有一些相似,但它一般是一個臨時的窗口,主要用于顯示提示信息或接受用戶輸入。
所以,在對話框中一般不需要菜單條,也不需要改變窗口大小。此外,在對話框出現(xiàn)時,可以設(shè)定禁止其他窗口的輸入,直到這個對話框被關(guān)閉。
在應用程序中創(chuàng)建JDialog窗體需要實例化JDialog類,通常使用以下幾個JDialog類的構(gòu)造方法。
(1)public JDialog():創(chuàng)建一個沒有標題和父窗體的對話框
(2) public JDialog(Frame f): 創(chuàng)建一個指定父窗體的對話框,但該窗體沒有標題
(3)public JDialog(Frame f,boolean model):創(chuàng)建一個指定類型的對話框,并指定父窗體,但該窗體沒有指定標題。
(4)public JDialog(Frame f,String titl):創(chuàng)建一個指定標題的父窗體的對話框
(5)public JDialog(Frame f,String title,boolean model):創(chuàng)建一個指定標題、窗體和模式的對話框
下面我們用代碼來實現(xiàn):
package njci.software.MyNotePad2018;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ConfigDialog extends JDialog {
/**
*
*/
private static final long serialVersionUID = -713398359834685238L;
public ConfigDialog(JFrame frame){
super(frame,"這是一個對話框",true);
//Container container=getContentPane(); //創(chuàng)建一個容器
//container.add(new JLabel("這是一個對話框")); //在容器中添加標簽
//添加內(nèi)部控件
JPanel pnlConfig=new JPanel();
pnlConfig.setLayout(null);
JLabel lblWidth=new JLabel("寬度");
JLabel lblHeight=new JLabel("高度");
final JTextField txtWidth=new JTextField();
final JTextField txtHeight=new JTextField();
JButton btnSave=new JButton("保存");
JButton btnCancel=new JButton("取消");
//進行布局
lblWidth.setBounds(50,30,60,40);
txtWidth.setBounds(150,30,160,40);
lblHeight.setBounds(50,100,60,40);
txtHeight.setBounds(150,100,160,40);
btnSave.setBounds(50,160,100,40);
btnCancel.setBounds(200,160,100,40);
pnlConfig.add(lblWidth);
pnlConfig.add(txtWidth);
pnlConfig.add(lblHeight);
pnlConfig.add(txtHeight);
pnlConfig.add(btnSave);
pnlConfig.add(btnCancel);
this.add(pnlConfig);
this.setSize(400,320);
this.setResizable(false);//窗體大小不可改變
this.setLocationRelativeTo(frame);;//居中顯示
}
}
package javaswing;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class MyFrame extends JFrame {
private static final long serialVersionUID = 4232937812480671357L;
public MyFrame(){
final JFrame frmMain=new JFrame("我的第一個記事本");
frmMain.setSize(400,300);
frmMain.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
frmMain.setLocationRelativeTo(null); //居中顯示
frmMain.setVisible(true);
ConfigDialog dlgConfig=new ConfigDialog(frmMain);
dlgConfig.setVisible(true);
}
/**
*
*/
public static void main(String[] args){
new MyFrame();
}
}
運行效果如下所示:

3.3 JLabel組件
在Swing中顯示文本或提示信息的方法是使用標題,它支持文本字符串和圖標。在應用程序的用戶界面中,一個簡短的文本標簽可以使用戶知道這些組件的目的,所以標簽在Swing中是比較常用的組件。
標簽由JLabel類定義,它的父類為JComponent類。
JLabel組件顯示的是靜態(tài)文本或者圖片,在通常情況下是不能編輯的,只起到提示的作用。觀察QQ登錄界面輸入框左側(cè)的頭像,他就可以用JLabel組件實現(xiàn)。
JLabel組件中主要的構(gòu)造方法如下:
(1)JLabel():創(chuàng)建空的標簽。
(2)JLabel(String):創(chuàng)建一個帶初始字符串的標簽。
(3)JLabel(Icon):創(chuàng)建一個帶有指定圖像的標簽。
JLabel的主要方法見下表所示:
| 方法 | 功能 |
| setText(String) | 設(shè)置顯示內(nèi)容 |
| getText() | 獲取顯示內(nèi)容 |
| getAlignment() | 獲取對齊方式 |
| setAlignment() | 設(shè)置對齊fang |
3.4 文本域
文本域一般用來讓用戶輸入姓名、信用卡號這樣的信息,它是一個能夠接收用戶的鍵盤輸入的小塊區(qū)域。
在創(chuàng)建文本域時,參數(shù)類型有四種:空的、空的并且具有指定長度、帶有初始文本內(nèi)容和帶有初始文本內(nèi)容并具有指定長度的。
文本域的主要方法如下所示:
| 方法 | 功能 |
| getColumns() | 返回文本域的列數(shù) |
| getEchoChar() | 返回用于回顯的字符 |
| setEchoCharacter(Char) | 設(shè)置文本域的回顯字符 |
| setEditable(Boolean) | 設(shè)置文本域是否為只讀狀態(tài) |
| setText(String) | 設(shè)置文本域中的文本值 |
| getText() | 返回文本域中的輸入文本值 |
3.5 按鈕
幾乎所有的交互式程序中都會有按鈕,它是一種交互能力強且交互方便的控件,這個組件提供了“按下并動作”的基本用戶界面。
構(gòu)造方法如下:
(1):JButton():建立一個沒有標示字符串的新按鈕類對象。
(2):JButton(String label):建立一個標示字符串為label的新按鈕類對象。
下面通過代碼實現(xiàn):
package javaswing;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class MyFrame extends JFrame {
private static final long serialVersionUID = 4232937812480671357L;
public MyFrame(){
final JFrame frmMain=new JFrame("我的第一個記事本");
frmMain.setSize(400,300);
frmMain.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
frmMain.setLocationRelativeTo(null); //居中顯示
frmMain.setVisible(true);
//為按鈕添加一個單機事件
JButton jbn=new JButton("系統(tǒng)配置");
frmMain.add(jbn);
}
/**
*
*/
public static void main(String[] args){
new MyFrame();
}
}
運行效果如下所示:

四.布局管理器
在Swing中,每個組件在容器中都有一個具體位置和大小,而在容器中擺放各種組件時很難判斷其具體位置和大小。布局管理器提供了Swing組件安排、展示在容器中的方法及基本的布局功能。使用布局管理器較程序員直接在容器中控制Swing組件的位置和大小方便得多,可以有效地處理整個窗體的布局。Swing提供的常用布局管理器包括流布局管理器、邊界布局管理器和網(wǎng)格布局管理器。本節(jié)將探討Swing中常用的布局管理器。
4.1 絕對布局
在Swing中,除了使用布局管理器之外還可以使用絕對布局。絕對布局,就是硬性指定組件在容器中的位置和大小,可以使用絕對坐標的方式來指定組件的位置。
(1)使用Container.setLayout(null)方法取消布局管理器
(2) 使用Component.setBounds()方法設(shè)置每個組件的大小與位置。
下面我們用代碼實現(xiàn)絕對布局:
package javaswing;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ConfigDialog extends JDialog {
/**
*
*/
private static final long serialVersionUID = -713398359834685238L;
public ConfigDialog(JFrame frame){
super(frame,"這是一個對話框",true);
//Container container=getContentPane(); //創(chuàng)建一個容器
//container.add(new JLabel("這是一個對話框")); //在容器中添加標簽
//添加內(nèi)部控件
JPanel pnlConfig=new JPanel();
pnlConfig.setLayout(null);
JLabel lblWidth=new JLabel("寬度");
JLabel lblHeight=new JLabel("高度");
final JTextField txtWidth=new JTextField();
final JTextField txtHeight=new JTextField();
JButton btnSave=new JButton("保存");
JButton btnCancel=new JButton("取消");
//進行絕對布局
lblWidth.setBounds(50,30,60,40);
txtWidth.setBounds(150,30,160,40);
lblHeight.setBounds(50,100,60,40);
txtHeight.setBounds(150,100,160,40);
btnSave.setBounds(50,160,100,40);
btnCancel.setBounds(200,160,100,40);
pnlConfig.add(lblWidth);
pnlConfig.add(txtWidth);
pnlConfig.add(lblHeight);
pnlConfig.add(txtHeight);
pnlConfig.add(btnSave);
pnlConfig.add(btnCancel);
this.add(pnlConfig);
this.setSize(400,320);
this.setResizable(false);//窗體大小不可改變
this.setLocationRelativeTo(frame);;//居中顯示
}
public static void main(String[] args) {
//new ConfigDialog(frame);
}
}
4.2 流布局管理器
流布局管理器是最基本的布局管理器,在整個容器中的布局正如其名,像“流”一樣從左到右擺放組件,知道占據(jù)了這一行的所有空間,然后再向下移動一行。默認情況下,組件在每一行都是居中排列的,但是通過設(shè)置也可以更改組件在每一行上的排列位置。
FlowLayout布局管理器是一種最簡單的布局管理方法,是JPanel的默認布局。它以流式的方式,自左向右,自上而下地放置容器中的組件,即組件按每行先后自左向右放置,一行放不下時換行。FlowLayout的默認對齊方式為居中對齊,也可以手工設(shè)置為左對齊或右對齊。
FlowLayout中常用的構(gòu)造方法:
(1)FlowLayout():創(chuàng)建默認的FlowLayout布局管理器。
(2)FlowLayout(int):以指定的對齊方式創(chuàng)建FlowLayout布局管理器。其中參數(shù):
FlowLayout.LEFT(左對齊)、FlowLayout.RIGHT(右對齊)、FlowLayout.CENTER(居中對齊)。
(3)FlowLayout(int,int,int);以指定的對齊方式及間距創(chuàng)建FlowLayout布局管理器。其中,第一個參數(shù)為對齊方式,第二個參數(shù)為組件間以及組件與容器邊之間的水平距離,第三個參數(shù)為組件之間以及組件與容器邊之間的垂直間距。
FlowLayout的主要方法如下表所示:
| 方法 | 功能 |
| getAlignment() | 返回對齊方式 |
| getHgap() | 返回組件水平間距或返回組件列間距 |
| getVgap() | 返回組件垂直間距或返回組件行間距 |
| setAlignment | 設(shè)置對齊方式 |
| setHgap() | 設(shè)置組件列間距 |
| setVgap() | 設(shè)置行間距 |
下面通過代碼實現(xiàn)FlowLayout的用法:
package javaswing;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class FlowLayoutDemo extends JFrame{
public FlowLayoutDemo(){
setTitle("本窗體使用流布局管理器"); //設(shè)置窗體標題
Container c=getContentPane();
//設(shè)置窗體使用流布局管理器,使組件右對齊,并且設(shè)置組件之間的水平間隔與垂直間隔
setLayout(new FlowLayout(2,10,10));
for(int i=0;i<10;i++){
c.add(new JButton("按鈕"+i));
}
setSize(300,200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args){
new FlowLayoutDemo();
}
}
運行效果如下圖所示:

4.3 網(wǎng)格布局管理器
GridLayout布局管理器將容器區(qū)域劃分成m行m列,即一個個大小相等的格子,而容器中的組件就放入這些格子中,占用大小完全相同的一格。
GridLayout的創(chuàng)建方法如下:
(1)GridLayout():創(chuàng)建默認的GridLayout布局,所有組件在一行中顯示。
(2)GridLayout(int,int)按指定行數(shù)和列數(shù)創(chuàng)建GridLayout布局。
(3)Gridlayout(int,int,int)按指定行數(shù)、列數(shù)、行間距和列間距創(chuàng)建GridLayout布局。
GridLayout的主要方法如下表所示:
| 方法 | 功能 |
| getHgap() | 返回組件水平間距 |
| getVgap() | 返回組件垂直間距 |
| setHgap() | 設(shè)置組件水平間距 |
| setVgap() | 設(shè)置組件垂直間距 |
| getRows() | 獲取網(wǎng)格的行數(shù) |
| getColumns() | 獲取網(wǎng)格的列數(shù) |
| setRows() | 設(shè)置網(wǎng)格的行數(shù) |
| setColumns() | 設(shè)置網(wǎng)格的列數(shù) |
向網(wǎng)格中加入組件有兩種方法:一種采用默認順序,即從左向右、自上而下的順序;另一種是加入時指明網(wǎng)格位置。
具體代碼實現(xiàn)如下:
package javaswing;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class GridLayoutPosition extends JFrame{
public GridLayoutPosition(){
Container c=getContentPane();
//設(shè)置容器使用網(wǎng)絡(luò)布局管理器,設(shè)置7行3列的網(wǎng)格,行間距為5,列間距為5
setLayout(new GridLayout(7,3,5,5));
for(int i=0;i<20;i++){
c.add(new JButton("按鈕"+i)); //循環(huán)添加按鈕
}
setSize(300,300);
setTitle("這是一個使用網(wǎng)格布局管理器的窗體");
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args){
new GridLayoutPosition();
}
}
運行效果如下所示:

4.4 邊界布局管理器
在默認不指定窗體布局的情況下,Swing組件的布局模式是邊界布局管理器,邊界布局器可以將容器劃分為東、南、西、北、中五個區(qū)域,可以將組件加入到這5個區(qū)域中。容器調(diào)用Container類的add()方法添加組件時可以設(shè)置此組件在邊界布局管理器中的區(qū)域,區(qū)域的控制可以由BorderLayout類中的成員變量來決定,這些成員變量的具體含義如下表所示:
| 成員變量 | 含義 |
| BorderLayout.NORTH | 在容器中添加組件時,組件置于頂端 |
| BorderLayout.SOUTH | 在容器中添加組件時,組件置于底端 |
| BorderLayout.EAST | 在容器中添加組件時,組件置于右端 |
| BorderLayout.WEST | 在容器中添加組件時,組件置于左端 |
| BorderLayout.CENTER | 在容器中添加組件時,組件置于中間開始填充,直到與其他組件邊界連接 |
下面用代碼實現(xiàn):
package javaswing;
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class BorderLayoutPosition extends JFrame{
//定義組件擺放位置的數(shù)組
String[] border={BorderLayout.CENTER,BorderLayout.NORTH,BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.EAST};
String[] buttonName={"center button","north button","south button","west button","east button"};
public BorderLayoutPosition(){
setTitle("這個窗體使用邊界布局管理器");
Container c=getContentPane(); //定義一個容器
setLayout(new BorderLayout()); //設(shè)置容器為邊界布局管理器
for(int i=0;i<border.length;i++){
//在容器中添加按鈕,并設(shè)置按鈕布局
c.add(border[i],new JButton(buttonName[i]));
}
setSize(350,250); //設(shè)置窗體大小
setVisible(true); //設(shè)置窗體可見
//設(shè)置窗體關(guān)閉方式
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args){
new BorderLayoutPosition();
}
}
實現(xiàn)效果如下圖所示:

到此這篇關(guān)于Java Swing最詳細基礎(chǔ)知識總結(jié)的文章就介紹到這了,更多相關(guān)Java Swing知識總結(jié)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)世界上最快的排序算法Timsort的示例代碼
Timsort?是一個混合、穩(wěn)定的排序算法,簡單來說就是歸并排序和二分插入排序算法的混合體,號稱世界上最好的排序算法。本文將詳解Timsort算法是定義與實現(xiàn),需要的可以參考一下2022-07-07
Maven中optional和scope元素的使用弄明白了嗎
這篇文章主要介紹了Maven中optional和scope元素的使用弄明白了嗎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
SpringBoot3整合郵件服務(wù)實現(xiàn)郵件發(fā)送功能
本文介紹了spring boot整合email服務(wù),實現(xiàn)發(fā)送驗證碼,郵件(普通文本郵件、靜態(tài)資源郵件、附件郵件),文中通過代碼示例介紹的非常詳細,堅持看完相信對你有幫助,需要的朋友可以參考下2024-05-05

