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