zoukankan      html  css  js  c++  java
  • 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的布局方式设置为TrapezoidLayout
    		frame.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和一些具体实例的学习就可以熟练掌握各种布局管理器的使用方法。通过配合多种布局管理器的使用,针对每个程序界面都会有一种或一种以上的实现方案,在设计时充分考虑各种解决方案的优缺点(持久有效拥抱变化、易于维护),以便从中选择一种更合适的方案,开发出更美观、大方、实用的程序界面。

  • 相关阅读:
    IIS7 503错误 Service Unavailable
    android错误系列之导出数据库出错Failed to pull selection
    android学习笔记(入门篇)
    使用cmd命令删除文件夹下所有文件
    vue 动态插入组件
    js获取当前时间
    获取带参值
    以毫秒为单位的时间长度转化为时分秒时间格式的时间长度
    js如何复制一个对象?
    想在已创建的Vue工程里引入vux组件
  • 原文地址:https://www.cnblogs.com/pangblog/p/3328898.html
Copyright © 2011-2022 走看看