《事件驱动模型》讲述了如何将用户与功能实现代码联系到一起.怎么样便于用户理解和符合用户的使用习惯? 本篇还是就此问题作分析,站在用户角度上分析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和一些具体实例的学习就可以熟练掌握各种布局管理器的使用方法。通过配合多种布局管理器的使用,针对每个程序界面都会有一种或一种以上的实现方案,在设计时充分考虑各种解决方案的优缺点(持久有效拥抱变化、易于维护),以便从中选择一种更合适的方案,开发出更美观、大方、实用的程序界面。

Java可视化编程,基于布局管理器的UI设计的更多相关文章

  1. (转)Java 的swing.GroupLayout布局管理器的使用方法和实例

    摘自http://www.cnblogs.com/lionden/archive/2012/12/11/grouplayout.html (转)Java 的swing.GroupLayout布局管理器 ...

  2. Java 的swing.GroupLayout布局管理器的使用方法和实例(转)

    The following builds a panel consisting of two labels in one column, followed by two textfields in t ...

  3. JAVA简单的网格布局管理器--JAVA基础

    网格布局管理器: GridLayoutDemo.java: import java.awt.GridLayout;import javax.swing.JButton;import javax.swi ...

  4. 【java】浅析java组件中的布局管理器

    这篇博文笔者介绍一下java组件中,常用的布局管理器.java组件中的布局方式有好几十种,所有的这些布局管理器都实现了java.awt.LayoutManager接口.接下来笔者介绍一下常用的5种布局 ...

  5. java图形用户界面边界布局管理器

    总结:不同方向的组件,所用的板是不同的: package com.moc; //用布局写一个界面 ///运用边界布局 //2个按钮在北,2个按钮在南 //中央一个大按钮 //将同一方向的组件封装后布局 ...

  6. java 图形化界面 布局管理器

    package Layout; import java.awt.*; import javax.swing.*; public class MyBorderLayout extends JFrame{ ...

  7. Java GUI 布局管理器

    容器可设置布局管理器,管理容器中组件的布局: container.setLayout(new XxxLayout()); Java有6种布局管理器,AWT提供了5种: FlowLayout Borde ...

  8. Swing——布局管理器

    前言 在编写图形界面时,总是需要考虑的就是组件放在哪里,组件怎么大才合适.在Swing中就有现成的布局管理器帮我们做这些事情,我们不必写代码去一一安排.下面将介绍什么是布局管理器.Swing中常用布局 ...

  9. Swing布局管理器介绍

    创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/128174 当选 ...

随机推荐

  1. apache httpd, nginx, tomcat, jboss

    web上的server都叫web server,但是大家分工也有不同的. nginx常用做静态内容服务和代理服务器(不是你FQ那个代理),直面外来请求转发给后面的应用服务(tomcat,django什 ...

  2. C语言的本质(15)——C语言的函数接口入门

    C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...

  3. Asp.Net MVC3 简单入门第一季(三)详解Controller之Filter

    前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接 ...

  4. error C2065: 'assert' : undeclared identifier

    F:\VC6.0 : error C2065: 'assert' : undeclared identifier 导入#include <assert.h>

  5. 关于k-means聚类算法的matlab实现

    在数据挖掘中聚类和分类的原理被广泛的应用. 聚类即无监督的学习. 分类即有监督的学习. 通俗一点的讲就是:聚类之前是未知样本的分类.而是根据样本本身的相似性进行划分为相似的类簇.而分类 是已知样本分类 ...

  6. 关于SQLSERVER去掉如何重复值的记录

    这个一个在日常工作中所遇到的问题 在此记录一下 dt_user_pay_record表 ID userid time money 1 2 2014-3-2 2 2 2 2015-3-2 33 3 2 ...

  7. SQL Server中的临时表和表变量

    SQL Server中的临时表和表变量 作者:DrillChina出处:blog2008-07-08 10:05 在SQL Server的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的 ...

  8. How debuggers work

    做了一个PPT用来和组内的同学交流一下.内容很简单,写得也很简单. 谁知道博客园文章里怎么直接嵌入PPT呢? link: http://www.slideshare.net/ssuserdc412f/ ...

  9. ZCTF-Pwn

    版权声明:本文为博主原创文章,未经博主允许不得转载.  最近有了点时间,把ZCTF的pwn总结了下,就差最后一个pwn500,另找时间总结. 文件打包:http://files.cnblogs.com ...

  10. Oracle SecureFiles 说明(转)

    Oracle SecureFiles 说明 Oracle Database 11g 将LOB 数据类型作为Oracle SecureFiles 进行了完全重新设计,显著改进了应用程序开发的性能.可管理 ...