Java可视化编程,基于布局管理器的UI设计
?
在《事件驅(qū)動(dòng)模型》講述了如何將用戶與功能實(shí)現(xiàn)代碼聯(lián)系到一起.怎么樣便于用戶理解和符合用戶的使用習(xí)慣? 本篇還是就此問題作分析,站在用戶角度上分析UI各組件倒底該如何設(shè)計(jì)呈現(xiàn)。
優(yōu)秀的UI會(huì)給用戶帶來更加便捷高效的感受,對(duì)用戶體驗(yàn)的提升是勿容置疑的。
電影《普羅米修斯》中畫面
?
- 創(chuàng)建操作系統(tǒng)風(fēng)格的界面
?
Java默認(rèn)提供的L&F(外觀)在我看來簡(jiǎn)直奇丑無比, 不知道各位是否這樣認(rèn)為。我建議在設(shè)計(jì)Java程序的UI時(shí)直接忽略Java默認(rèn)的外觀而選擇系統(tǒng)外觀或者調(diào)用其他現(xiàn)成的外觀。試想一下你可以忍受這樣一個(gè)落后的文件選擇對(duì)話框么。
?
通過以下代碼我們可以將界面風(fēng)格設(shè)置為與當(dāng)前系統(tǒng)風(fēng)格
?????? UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
在調(diào)用的時(shí)候需要對(duì)其可能拋出的異常進(jìn)行捕獲.
ClassNotFoundException?- 如果無法找到LookAndFeel?類
InstantiationException?- 如果無法創(chuàng)建一個(gè)該類的新實(shí)例
IllegalAccessException?- 如果該類或初始化程序不可訪問
UnsupportedLookAndFeelException?- 如果lnf.isSupportedLookAndFeel()?為 false
ClassCastException?- 如果className?沒有標(biāo)識(shí)擴(kuò)展LookAndFeel?的類
?
- 優(yōu)秀的UI建立在良好的布局上
?
在學(xué)習(xí)網(wǎng)頁基礎(chǔ)知識(shí)的時(shí)候css作為樣式表為網(wǎng)頁設(shè)計(jì)提供了相當(dāng)大的便利,Java中Layout布局管理器功能上雖然沒有css那么全面,但也提供了類似的功能,為UI各種組件的排布提供了相當(dāng)大的便捷。通過調(diào)用setLayout方法為其指定布局管理器。
setLayout(LayoutManager layout);
布局管理器的種類有很多,Swing提供的常用布局管理器包括流布局管理器(FlowLayout)、邊界布局管理器(BorderLayout)、網(wǎng)格布局管理器(GridLayout),先看一下這三個(gè)分別提供了什么樣的布局方式。
?
- ?FlowLayout
?
流布局管理器提供的布局方式正如其名,像“流”一樣從左至右拜訪組建,直道占據(jù)了這一行的所有空間,然后再向下移動(dòng)一行。默認(rèn)情況下,組件在每一行都是居中排列的,可以通過設(shè)置更改組件在每一行上的排列位置。
?
- ?BorderLayout
?
通過frame.getContantPane()獲取的容器在不指定布局管理器的情況下,
其默認(rèn)采用了BorderLayout管理器。在使用該布局時(shí),有一點(diǎn)需要注意一下,在向容器中添加組建的時(shí)候若不指定其排列位置,則該組建則會(huì)用填充的方式占用整個(gè)容器,若后面還有組建以相同方式添加進(jìn)來,則直接覆蓋。
?
- ? GridLayout
?
網(wǎng)絡(luò)布局管理器將容器劃分為指定數(shù)量的網(wǎng)格,向其中添加的組件從網(wǎng)格的左上角開始依次以從左至右,從上至下的順序加入到網(wǎng)格中,所以其每個(gè)組件的大小都是一樣的。通過設(shè)置其horizGap和vertGap兩個(gè)參數(shù)調(diào)整組建于相鄰組建的水平間距和垂直間距,這兩個(gè)參數(shù)默認(rèn)為0。
?
- ? 絕對(duì)布局
?
在特定情況下需要直接調(diào)用setLocation或者setBounds方法指定組件在容器中的大小和位置時(shí),可以使用絕對(duì)布局。注意一點(diǎn),若想使用絕對(duì)布局,首先需要取消布局管理器Container.setLayout(null);
?
似乎僅靠上面四種方法管理組建布局有點(diǎn)勉為其難,再來看一看幾個(gè)相對(duì)更加高級(jí)的布局管理器。
?
- ? 卡片式布局管理器(CardLayout)
- ? 網(wǎng)格包布局管理器(GridBagLayout)
- ? 箱式布局管理器(BoxLayout)
- ? 彈簧布局管理器(SpringLayout)
?
?
盡管Java中提供了十幾種布局管理器,但有時(shí)還是會(huì)存在不能完全滿足用戶需求的情況,在學(xué)習(xí)異常類的時(shí)候我們會(huì)定義自己的異常類,那么Java是否支持自定義布局管理器呢?答案當(dāng)然是支持的。這里就拿階梯布局管理器展示怎么樣自定義一個(gè)專屬的布局方式。
?
?TrapezoidLayout.java ?布局管理器實(shí)現(xiàn)代碼
?
import java.awt.*;public class TrapezoidLayout implements LayoutManager {public TrapezoidLayout() {}public void layoutContainer(Container parent) {Insets insets = parent.getInsets(); //獲取容器默認(rèn)邊框?qū)ο骾nt maxWidth = parent.getWidth() - (insets.left + insets.right); //獲得最大可用寬度int maxHeight = parent.getHeight() - (insets.top + insets.bottom); //獲得最大可用高度int count = parent.getComponentCount(); //依次設(shè)置所有可見控件的位置和大小int width = maxWidth / count;int height = maxHeight / count;for(int i = 0; i < count; i++) {Component comp = parent.getComponent(i);if(comp.isVisible()) {// Dimension size = comp.getPreferredSize(); //將控件大小設(shè)置為最佳大小int x = maxWidth / count * i; //將寬度分成count份根據(jù)i值調(diào)整X坐標(biāo)int y = maxHeight / count * i; //將高度分成count份根據(jù)i值調(diào)整Y坐標(biāo)comp.setBounds(x, y, width, height);}}}/*這里只實(shí)現(xiàn)layoutContainer方法就可以實(shí)現(xiàn)階梯布局管理器功能,所以其他方法實(shí)現(xiàn)為空*/public void addLayoutComponent(String name, Component comp) {}public Dimension minimumLayoutSize(Container parent) {return new Dimension();}public Dimension preferredLayoutSize(Container parent) {return new Dimension();}public void removeLayoutComponent(Component comp) {} }
LayoutDemo.java 建立了一個(gè)類查看實(shí)現(xiàn)效果
?
?
import java.awt.*; import javax.swing.*;public class LayoutDemo{JFrame frame;JPanel panel;public LayoutDemo() {init();}private void init() {frame = new JFrame("CustomLayout");frame.setBounds(400, 300, 400, 300);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setResizable(false);panel = new JPanel();panel.setLayout(new TrapezoidLayout()); //將panel的布局方式設(shè)置為TrapezoidLayoutframe.add(panel);for(int i = 1; i <= 10; i++) { //逐個(gè)添加二十個(gè)按鈕組件panel.add(new Button("bon" + i));}frame.setVisible(true);}public static void main(String[] args) {LayoutDemo demo = new LayoutDemo();} }
?
?
本篇主要講述了常用的幾種布局管理器的功能,相信朋友們通過API和一些具體實(shí)例的學(xué)習(xí)就可以熟練掌握各種布局管理器的使用方法。通過配合多種布局管理器的使用,針對(duì)每個(gè)程序界面都會(huì)有一種或一種以上的實(shí)現(xiàn)方案,在設(shè)計(jì)時(shí)充分考慮各種解決方案的優(yōu)缺點(diǎn)(持久有效擁抱變化、易于維護(hù)),以便從中選擇一種更合適的方案,開發(fā)出更美觀、大方、實(shí)用的程序界面。
?
總結(jié)
以上是生活随笔為你收集整理的Java可视化编程,基于布局管理器的UI设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php ascii hex编码
- 下一篇: asp.net 连接字符串的多种写法