Java深入學(xué)習(xí)圖形用戶(hù)界面GUI之布局管理器
布局管理器:
組件在容器中的位置和尺寸是由布局管理器決定的,每當(dāng)需要重新調(diào)整屏幕大小時(shí),都要用到布局管理器。Swing常用的布局管理器有4種,分別是FlowLayout(流式布局管理器)、BorderLayout(邊界布局管理器)、GridLayout(網(wǎng)格布局管理器)、GridBagLayout(網(wǎng)格包布局管理器)。Swing容器在創(chuàng)建時(shí)都會(huì)使用一種默認(rèn)的布局管理器,在程序中可以通過(guò)調(diào)用容器對(duì)象的setLayout()方法設(shè)置布局管理器,通過(guò)布局管理器可自動(dòng)進(jìn)行組件的布局管理。
FlowLayout屬于流式布局管理器,是最簡(jiǎn)單的布局管理器。在這種布局下,容器會(huì)將組件按照添加順序從左向右放置。當(dāng)達(dá)到容器的邊界時(shí),自動(dòng)將組件放到下一行的開(kāi)始位置。這些組件可以按左對(duì)齊、居中對(duì)齊(默認(rèn)方式)或右對(duì)齊的方式排列。
FlowLayout布局管理器的特點(diǎn)是可以將所有組件像流水一樣依次進(jìn)行排列,不需要用戶(hù)明確設(shè)定,但是靈活性相對(duì)較差。如果將窗體拉伸變寬,按鈕的大小和按鈕之間的間距將保持不變,但按鈕相對(duì)于容器邊界的距離會(huì)發(fā)生變化,這一點(diǎn)大家可以將下文的案例代碼運(yùn)行自行體會(huì)。
FlowLayout案例:
import javax.swing.*; import java.awt.*; public class GUI_2布局管理器 { public static void main(String[] args) { JFrame frame=new JFrame("布局管理器"); frame.setSize(600,300); //設(shè)置窗體中的布局管理器為FlowLayout(流式布局管理器),所有的組件居中對(duì)齊,水平和垂直間距為3 frame.setLayout(new FlowLayout(FlowLayout.CENTER,3,3)); JButton button=null; for (int i = 1; i <= 9; i++) { //創(chuàng)建按鈕 button=new JButton("按鈕"+i); frame.add(button); } //設(shè)置窗體大小 frame.setSize(280,250); //顯示組件 frame.setVisible(true); } }
GridLayout布局管理器是以網(wǎng)格的形式管理容器中組件布局的。GridLayout使用縱橫線(xiàn)將容器分成n行m列大小相等的容器,每個(gè)網(wǎng)格中放置一個(gè)組件。添加到容器中的組件首先放置在第1行第1列(左上角)的網(wǎng)格中,然后在第1行的網(wǎng)格中從左向右依次放置其他組件。一行放滿(mǎn)之后,繼續(xù)在下一行從左到右放置組件。GridLayout管理方式與FlowLayout類(lèi)似,但與FlowLayout不同的是,使用GridLayout管理的組件將自動(dòng)占據(jù)網(wǎng)格的整個(gè)區(qū)域。
GridLayout布局管理器的特點(diǎn)是組件的相對(duì)位置不隨區(qū)域的縮放而改變,但組件的大小會(huì)隨之改變,組件始終占據(jù)網(wǎng)格的整個(gè)區(qū)域。其缺點(diǎn)是總是忽略組件的最佳大小,所有組件的寬高都相同。
GridLayout案例:
import javax.swing.*; import java.awt.*; public class GUI_2布局管理器 { public static void main(String[] args) { JFrame frame=new JFrame("布局管理器"); frame.setSize(600,300); // 設(shè)置窗體中的布局管理器為GridLayout(網(wǎng)格式),設(shè)置窗體為3*3的網(wǎng)格 frame.setLayout(new GridLayout(3,3)); JButton button=null; for (int i = 1; i <= 9; i++) { //創(chuàng)建按鈕 button=new JButton("按鈕"+i); frame.add(button); } //設(shè)置窗體大小 frame.setSize(280,250); //顯示組件 frame.setVisible(true); } }
BorderLayout(邊界布局管理器)是一種較為復(fù)雜的布局方式,它將窗體劃分為5個(gè)區(qū)域,分別是東(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)。組件可以被放置在這5個(gè)區(qū)域中的任意一個(gè)區(qū)域中。
BorderLayout案例:
import javax.swing.*; import java.awt.*; public class GUI_2布局管理器 { public static void main(String[] args) { JFrame frame=new JFrame("布局管理器"); frame.setSize(600,300); //設(shè)置窗體中的布局管理器為BorderLayout(邊界布局),組件間橫向、縱向間距均為5 frame.setLayout(new BorderLayout(5,5)); frame.add(new JButton("按鈕1"),BorderLayout.EAST);//東 frame.add(new JButton("按鈕2"),BorderLayout.SOUTH);//南 frame.add(new JButton("按鈕3"),BorderLayout.NORTH);//北 frame.add(new JButton("按鈕4"),BorderLayout.WEST);//西 frame.add(new JButton("按鈕5"),BorderLayout.CENTER);//中 frame.setVisible(true);//顯示組件 } }
GridBagLayout是最靈活、最復(fù)雜的布局管理器,它與GridLayout布局管理器類(lèi)似,不同之處在于GridBagLayout允許網(wǎng)格中的組件大小各不相同,而且允許一個(gè)組件跨越一個(gè)或者多個(gè)網(wǎng)格。需要注意的是,如果希望組件的大小隨容器的增大而增大,必須同時(shí)設(shè)置GridBagConstraints對(duì)象的fill屬性和weightx、weighty屬性。
GridBagLayout案例:
import javax.swing.*; import java.awt.*; public class GUI_2布局管理器 { public static void main(String[] args) { JFrame frame=new JFrame("布局管理器"); frame.setSize(600,300); //GridBagLayout布局管理器(最靈活,最復(fù)雜),需要自己設(shè)置各個(gè)按鈕或文本的位置 frame.setLayout(null); Font font=new Font("仿宋",Font.BOLD,20); JLabel jl1=new JLabel("用戶(hù)名:"); jl1.setBounds(10,10,160,40);//設(shè)置按鈕的坐標(biāo),x,y,長(zhǎng),高 jl1.setFont(font);//設(shè)置統(tǒng)一字體,保證代碼整潔、美觀 JTextField jf1=new JTextField("請(qǐng)輸入用戶(hù)名:",20); jf1.setBounds(130,10,230,40); jf1.setFont(font); JLabel jl2=new JLabel("密碼:"); jl2.setBounds(10,60,160,40); jl2.setFont(font); JTextField jf2=new JTextField("請(qǐng)輸入密碼:",20); jf2.setBounds(130,60,230,40); jf2.setFont(font); JButton jb1=new JButton("登錄"); jb1.setBounds(40,120,100,40); jb1.setFont(font); JButton jb2=new JButton("退出"); jb2.setBounds(160,120,100,40); jb2.setFont(font); frame.add(jl1);//將這些按鈕添加到窗口上 frame.add(jf1); frame.add(jl2); frame.add(jf2); frame.add(jb1); frame.add(jb2); frame.setVisible(true); } }
運(yùn)用上面所講的GridBagLayout布局管理器寫(xiě)一個(gè)計(jì)算機(jī)模板(沒(méi)有實(shí)用功能,但外貌相似),還有更簡(jiǎn)便的方法,但這里我們使用GridBagLayout一種布局管理器實(shí)現(xiàn)。
import javax.swing.*; import java.awt.*; class 計(jì)算機(jī){ public static void main(String[] args) { JFrame frame=new JFrame("計(jì)算器"); frame.setSize(320,300); frame.setLayout(null); Font font=new Font("仿宋",Font.BOLD,20); JTextField jf1=new JTextField(" ",20); jf1.setBounds(10,10,180,40); jf1.setFont(font); JButton jl1=new JButton("刪除"); jl1.setBounds(190,10,110,40); jl1.setFont(font); JButton jb1=new JButton("1"); jb1.setBounds(10,50,50,40); jb1.setFont(font); JButton jb2=new JButton("2"); jb2.setBounds(70,50,50,40); jb2.setFont(font); JButton jb3=new JButton("3"); jb3.setBounds(130,50,50,40); jb3.setFont(font); JButton jb4=new JButton("+"); jb4.setBounds(190,50,50,40); jb4.setFont(font); JButton jb16=new JButton("*"); jb16.setBounds(250,50,50,40); jb16.setFont(font); JButton jb5=new JButton("4"); jb5.setBounds(10,100,50,40); jb5.setFont(font); JButton jb6=new JButton("5"); jb6.setBounds(70,100,50,40); jb6.setFont(font); JButton jb7=new JButton("6"); jb7.setBounds(130,100,50,40); jb7.setFont(font); JButton jb8=new JButton("-"); jb8.setBounds(190,100,50,40); jb8.setFont(font); JButton jb9=new JButton("7"); jb9.setBounds(10,150,50,40); jb9.setFont(font); JButton jb10=new JButton("8"); jb10.setBounds(70,150,50,40); jb10.setFont(font); JButton jb11=new JButton("9"); jb11.setBounds(130,150,50,40); jb11.setFont(font); JButton jb12=new JButton("0"); jb12.setBounds(190,150,50,40); jb12.setFont(font); JButton jb15=new JButton("/"); jb15.setBounds(250,100,50,40); jb15.setFont(font); JButton jb14=new JButton("."); jb14.setBounds(250,150,50,40); jb14.setFont(font); JButton jb13=new JButton("="); jb13.setBounds(10,200,300,40); jb13.setFont(font); frame.add(jl1); frame.add(jf1); frame.add(jb1); frame.add(jb2); frame.add(jb3); frame.add(jb4); frame.add(jb5); frame.add(jb6); frame.add(jb7); frame.add(jb8); frame.add(jb9); frame.add(jb10); frame.add(jb11); frame.add(jb12); frame.add(jb13); frame.add(jb14); frame.add(jb15); frame.add(jb16); frame.setVisible(true); } }
運(yùn)行結(jié)果如下:
到此這篇關(guān)于Java深入學(xué)習(xí)圖形用戶(hù)界面GUI之布局管理器的文章就介紹到這了,更多相關(guān)Java布局管理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot調(diào)用第三方WebService接口的操作技巧(.wsdl與.asmx類(lèi)型)
這篇文章主要介紹了SpringBoot調(diào)第三方WebService接口的操作代碼(.wsdl與.asmx類(lèi)型 ),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Java實(shí)現(xiàn)json數(shù)據(jù)處理的常用腳本分享
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)json數(shù)據(jù)處理的常用腳本,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2023-03-03一個(gè)通用的Java分頁(yè)基類(lèi)代碼詳解
這篇文章主要介紹了一個(gè)通用的Java分頁(yè)基類(lèi)代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12Mybatis插件之自動(dòng)生成不使用默認(rèn)的駝峰式操作
這篇文章主要介紹了Mybatis插件之自動(dòng)生成不使用默認(rèn)的駝峰式操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11JAVA三種攔截方式詳解(原生過(guò)濾器Filter、springMVC攔截器、aop切面)
在Java開(kāi)發(fā)中方法攔截是一種常見(jiàn)的技術(shù),可以用于在方法執(zhí)行前后添加額外的邏輯或修改方法的行為,這篇文章主要給大家介紹了關(guān)于JAVA三種攔截方式的相關(guān)資料,文中介紹的方式分別是原生過(guò)濾器Filter、springMVC攔截器、aop切面,需要的朋友可以參考下2024-05-05詳解SpringBoot 創(chuàng)建定時(shí)任務(wù)(配合數(shù)據(jù)庫(kù)動(dòng)態(tài)執(zhí)行)
本篇文章主要介紹了SpringBoot 創(chuàng)建定時(shí)任務(wù)(配合數(shù)據(jù)庫(kù)動(dòng)態(tài)執(zhí)行),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10spring?eurake中使用IP注冊(cè)及問(wèn)題小結(jié)
在開(kāi)發(fā)spring?cloud的時(shí)候遇到一個(gè)很奇葩的問(wèn)題,就是服務(wù)向spring?eureka中注冊(cè)實(shí)例的時(shí)候使用的是機(jī)器名,然后出現(xiàn)localhost、xxx.xx等這樣的內(nèi)容,這篇文章主要介紹了spring?eurake中使用IP注冊(cè),需要的朋友可以參考下2023-07-07mybatis 一對(duì)多嵌套查詢(xún)的實(shí)現(xiàn)
本文主要介紹了mybatis 一對(duì)多嵌套查詢(xún)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07SpringBoot使用Maven打包異常-引入外部jar的問(wèn)題及解決方案
這篇文章主要介紹了SpringBoot使用Maven打包異常-引入外部jar,需要的朋友可以參考下2020-06-06