• 博客(0)
  • 资源 (9)

空空如也

JavaThreads2rdEdition中文版

import com.e2one.example; public class OpenShell{ public static void main(String [] args) { Display display = new Display(); Shell shell = new Shell(display); shell.open(); // 开始事件处理循环,直到用户关闭窗口 while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }

2009-08-29

Java多线程设计模式源代码

public class Line { private final Point startPoint; private final Point endPoint; public Line(int startx, int starty, int endx, int endy) { this.startPoint = new Point(startx, starty); this.endPoint = new Point(endx, endy); } public Line(Point startPoint, Point endPoint) { this.startPoint = new Point(startPoint.x, startPoint.y); this.endPoint = new Point(endPoint.x, endPoint.y); } public int getStartX() { return startPoint.x; } public int getStartY() { return startPoint.y; } public int getEndX() { return endPoint.x; } public int getEndY() { return endPoint.y; } public String toString() { return "[ Line: " + startPoint + "-" + endPoint + " ]"; } }

2009-08-29

开发项目用SWING与RCP与SWT.JFACE的分析

开发项目用SWING与RCP与SWT.JFACE的分析 第一个SWT程序 下面让我们开始一个SWT程序。(注意:以下的例子和说明主要针对Windows平台,其它的操作系统应该大同小异)。首先要在Eclipse安装文件中找到SWT包,Eclipse组织并不提供单独的SWT包下载,必须下载完整的Eclipse开发环境才能得到SWT包。SWT是作为Eclipse开发环境的一个插件形式存在,可以在${你的eclipse安装路径}\plugins路径下的众多子目录下去搜索SWT.JAR文件,在找到的JAR文件中包含了SWT全部的Java类文件。因为SWT应用了JNI技术,因此同时也要找到相对应的JNI本地化库文件,由于版本和操作平台的不同,本地化库文件的名称会有些差别,比如SWT-WIN32-2116.DLL是Window平台下Eclipse Build 2116的动态库,而在Unix平台相应版本的库文件的扩展名应该是.so,等等。注意的是,Eclipse是一个开放源代码的项目,因此你也可以在这些目录中找到SWT的源代码,相信这会对开发很有帮助。下面是一段打开空窗口的代码(只有main方法)。 import com.e2one.example; public class OpenShell{ public static void main(String [] args) { Display display = new Display(); Shell shell = new Shell(display); shell.open(); // 开始事件处理循环,直到用户关闭窗口 while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } } 确信在CLASSPATH中包括了SWT.JAR文件,先用Javac编译例子程序。编译无错后可运行java -Djava.library.path=${你的SWT本地库文件所在路径} com.e2one.example.OpenShell,比如SWT-WIN32-2116.DLL件所在的路径是C:\swtlib,运行的命令应该是java -Djava.library.path=c:\swtlib com.e2one.example.OpenShell。成功运行后,系统会打开了一个空的窗口。 剖析SWT API 下面再让我们进一步分析SWT API的组成。所有的SWT类都用org.eclipse.swt做为包的前缀,下面为了简化说明,我们用*号代表前缀org.eclipse.swt,比如*.widgets包,代表的是org.eclipse.swt.widgets包。 我们最常用的图形构件基本都被包括在*.widgets包中,比如Button,Combo,Text,Label,Sash,Table等等。其中两个最重要的构件当数Shell和Composite。Shell相当于应用程序的主窗口框架,上面的例子代码中就是应用Shell构件打开一个空窗口。Composite相当于SWING中的Panel对象,充当着构件容器的角色,当我们想在一个窗口中加入一些构件时,最好到使用Composite作为其它构件的容器,然后再去*.layout包找出一种合适的布局方式。SWT对构件的布局也采用了SWING或AWT中Layout和Layout Data结合的方式,在*.layout包中可以找到四种Layout和与它们相对应的布局结构对象(Layout Data)。在*.custom包中,包含了对一些基本图形构件的扩展,比如其中的CLabel,就是对标准Label构件的扩展,上面可以同时加入文字和图片,也可以加边框。StyledText是Text构件的扩展,它提供了丰富的文本功能,比如对某段文字的背景色、前景色或字体的设置。在*.custom包中也可找到一个新的StackLayout布局方式。 SWT对用户操作的响应,比如鼠标或键盘事件,也是采用了AWT和SWING中的Observer模式,在*.event包中可以找到事件监听的Listener接口和相应的事件对象,例如常用的鼠标事件监听接口MouseListener,MouseMoveListener和MouseTrackListener,及对应的事件对象MouseEvent。 *.graphics包中可以找到针对图片、光标、字体或绘图的API。比如可通过Image类调用系统中不同类型的图片文件。通过GC类实现对图片、构件或显示器的绘图功能。

2009-08-29

房地产管理系统(hibernate+spring+AJAX)

客户管理 全面登记所有客户的资料,以及各种客户关系处理的管理记录,提供多种客户分析统计图表 为企业制定相关的策略提供参考依据,为销售业务拓展积聚广泛的客户资源。资产信息浏览和查询 客户信息查询 又可以按历史客户、成交客户、潜在客户、意向客户来时行查询方便管理员快速查的到相关客户 客户管理 主要是查看时间段内有没有新增客户。便于了解本公司的客户人数及发展业务规模。 2、 用户环境 J2sdk6.0 3、其他要求 无 第三部分、需求分析 1、实现功能  系统用例图

2009-08-29

java认证所有课程

第9章 AWT事件模型 本模块讨论了事件驱动的图形用户界面(GUI)的用户输入机制。 第一节 相关问题 讨论 - 以下为与本模块内容有关的问题: - 哪些部分对于一个图形用户界面来说是必需的? - 一个图形化程序如何处理鼠标点击或者其他类型的用户交互? 第二节 目 标 完成本模块之后,你应当能够: - 编写代码来处理在图形用户界面中发生的事件 - 描述Adapter类的概念,包括如何和何时使用它们 - 根据事件对象的细节来确定产生事件的用户动作 - 为各种类型的事件创建合适的接口和事件处理器。 第三节 什么是事件? 如果用户在用户界面层执行了一个动作(鼠标点击和按键),这将导致一个事件的发生。事件是描述发生了什么的对象。存在各种不同类型的事件类用来描述各种类型的用户交互。 9.3.1 事件源 事件源是一个事件的产生者。例如,在Button组件上点击鼠标会产生以这个Button 为源的一个ActionEvent. 这个ActionEvent实例是一个对象,它包含关于刚才所发生的那个事件的信息的对象。这些信息包括: - getActionCommand-返回与动作相关联的命令名称。 - GetModifiers-返回在执行动作时持有的修饰符。 9.3.2 事件处理器 事件处理器就是一个接收事件、解释事件并处理用户交互的方法。 第四节 JDK1.0的事件模型与JDK1.2的事件模型比较 在JDK1.1中,事件接收和处理的方法发生了重要的改变。本节将比较以前的事件模型(JDK1.0)和当前的事件模型(JDK1.1和JDK1.2)。 JDK1.0采用的是层次事件模型,而JDK1.1以及更高的版本采用的是委托事件模型。 9.4.1 层次模型(JDK1.0) 层次模型是基于容器的。 事件先发送到组件,然后沿容器层次向上传播。没有被组件处理的事件会自动地继续传播到组件的容器。 JDK1.0的事件模型与JDK1.2的事件模型比较 例如,在下图中,Button对象(包含在一个Frame上的Panel中)上的鼠标点击首先向Button发送一个动作事件。如果它没有被Button处理,这个事件会被送往Panel,如果它在那儿仍然没有被处理,这个事件会被送往Frame。 层次模型(JDK1.0)(续) 这种模型有一个显著的优点: - 它简单,而且非常适合面向对象的编程环境;说到底,所有的组件都继承了java.awt.Component类,而handleEvent()就在java.awt.Component类中。 然而,这种模型也存在缺点: - 事件只能由产生这个事件的组件或包含这个组件的容器处理。这个限制违反了面向对象编程的一个基本原则:功能应该包含在最合适的类中。而最适合处理事件的类往往并不是源组件的容器层次中的成员。 - 大量的CPU周期浪费在处理不相关的事件上。任何对于程序来说不相关或者并不重要的事件会沿容器层次一路传播,直到最后被抛弃。不存在一种简单的方法来过滤事件。 - 为了处理事件,你必须定义接收这个事件的组件的子类,或者在基容器创建一个庞大的handleEvent()方法。 委托事件模型是在JDK1.1中引入的。在这个模型中,事件被送往产生这个事件的组件,然而,注册一个或多个称为监听者的类取决于每一个组件,这些类包含事件处理器,用来接收和处理这个事件。采用这种方法,事件处理器可以安排在与源组件分离的对象中。监听者就是实现了Listener接口的类。 事件是只向注册的监听者报告的对象。每个事件都有一个对应的监听者接口,规定哪些方法必须在适合接收那种类型的事件的类中定义。实现了定义那些方法的接口的类可以注册为一个监听者。 9.4.2 委托模型 从没有注册的监听者的组件中发出的事件不会被传播。 例如,这是一个只含有单个Button的简单Frame。 1.import java.awt.*; 2. 3.public class TestButton { 4.public static void main(String args[]) { 5.Frame f = new Frame("Test"); 6.Button b = new Button("Press Me!"); 7.b.addActionListener(new ButtonHandler()); 8.f.add(b,"Center"); 9.f.pack(); 10.f.setVisible(true); 11.} 12.} ButtonHandler类是一个处理器类,事件将被委托给这个类。 1.import java.awt.event.*; 2. 3.public class ButtonHandler implements ActionListener { 4.public void actionPerformed(ActionEvent e) { 5.System.out.println("Action occurred"); 6.System.out.println("Button's label is : ' 7.+ e.getActionCommand()); 8.} 9.} 这两个范例的特征如下: - Button类有一个addActionListner(ActionListener)方法。 - AddActionListner接口定义了一个方法actionPerformed,用来接收一个ActionEvent。 - 创建一个Button对象时,这个对象可以通过使用addActionListener方法注册为ActionEvents的监听者。调用这个方法时带有一个实现了ActionListener接口的类的参数。 委托模型(JDK1.1或更高版本)(续) - 在Button对象上用鼠标进行点击时,将发送一个ActionEvent事件。这个ActionEvent事件会被使用addActionListener()方法进行注册的所有ActionListener的actionPerformed()方法接收。 - ActionEvent类的getActionCommand()方法返回与动作相关联的命令名称。以按钮的点击动作为例,将返回Button的标签。 这种方法有若干优点: - 事件不会被意外地处理。在层次模型中,一个事件可能传播到容器,并在非预期的层次被处理。 - 有可能创建并使用适配器(adapter)类对事件动作进行分类。 - 委托模型有利于把工作分布到各个类中。 - 新的事件模型提供对JavaBeans的支持。 这种方法也有一个缺点: - 尽管当前的JDK支持委托模型和JDK1.0事件模型,但不能混合使用JDK1.0和JDK1.1。 第五节 图形用户界面的行为 9.5.1 事件类型 我们已经介绍了在单一类型事件上下文中从组件接收事件的通用机制。事件类的层次结构图如下所示。许多事件类在java.awt.event包中,也有一些事件类在API的其他地方。 对于每类事件,都有一个接口,这个接口必须由想接收这个事件的类的对象实现。这个接口还要求定义一个或多个方法。当发生特定的事件时,就会调用这些方法。表9-1列出了这些(事件)类型,并给出了每个类型对应的接口名称,以及所要求定义的方法。这些方法的名称是易于记忆的,名称表示了会引起这个方法被调用的源或条件。 表9-1方法类型和接口 Category Interface Name Methods Action ActionListener actionPerformed(ActionEvent) Item ItemListener itemStateChanged(ItemEvent) Mouse motion MouseMotionListener mouseDragged(MouseEvent) mouseMoved(MouseEvent) Mouse button MouseListener mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mouseClicked(MouseEvent) Key KeyListener keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent) Focus FocusListener focusGained(FocusEvent) focusLost(FocusEvent) Adjustment AdjustmentListener adjustmentValueChanged (AdjustmentEvent) Component ComponentListener componentMoved(ComponentEvent) componentHidden(ComponentEvent) componentResized(ComponentEvent) componentShown(ComponentEvent) 表9-1方法类型和接口(续) 9.5.2 复杂的范例 本节将考察一个更复杂的Java软件范例。它将跟踪鼠标被按下时,鼠标的移动情况(鼠标拖动)。这个范例还将监测当鼠标没有按下时,鼠标的移动情况(鼠标移动)。 当鼠标按下或没有按下时,移动鼠标产生的事件会被实现了MouseMotionListener接口的类的对象检取。这个接口要求定义两个方法,mouseDragged()和mouseMoved()。即使你只对鼠标拖动感兴趣,也必须提供这两个方法。然而,mouseMoved()的体可以是空的。 要检取其他鼠标事件,包括鼠标点击,必须定义MouseListener接口。这个接口包括若干个事件,即:mouseEntered, mouseExited, mousePressed, mouseReleased和 mouseClicked。 发生鼠标或键盘事件时,有关鼠标的位置和所按下的键的信息可以从事件中得到。代码如下: 1.import java.awt.*; 2.import java.awt.event.*; 3. 4.public class TwoListen implements 5.MouseMotionListener, MouseListener { 6.private Frame f; 7.private TextField tf; 8. 9.public static void main(String args[]) { 10.TwoListen two = new TwoListen(); 11.two.go(); 12.} 13. 复杂的范例(续) 1.public void go() { 2.f = new Frame("Two listeners example"); 3.f.add (new Label ("Click and drag the mouse"), 4."BorderLayout.NORTH"); 5.tf = new TextField (30); 6.f.add (tf, "BorderLayout.SOUTH"); 7. 8.f.addMouseMotionListener(this); 9.f.addMouseListener (this); 10.f.setSize(300, 200); 11.f.setVisible(true); 12.} 13. 14.// These are MouseMotionListener events 15.public void mouseDragged (MouseEvent e) { 16.String s = 17."Mouse dragging: X = " + e.getX() + 18." Y = " + e.getY(); 19.tf.setText (s); 20.} 21. 22.public void mouseMoved (MouseEvent e) { 23.} 24. 25.// These are MouseListener events 26.public void mouseClicked (MouseEvent e) { 27.} 28. 29.public void mouseEntered (MouseEvent e) { 30.String s = "The mouse entered"; 31.tf.setText (s); 32.} 复杂的范例(续) 1.public void mouseExited (MouseEvent e) { 2.String s = "The mouse has left the building"; 3.tf.setText (s); 4.} 5. 6.public void mousePressed (MouseEvent e) { 7.} 8. 9.public void mouseReleased (MouseEvent e) { 10.} 11.} 这个范例中的一些地方值得注意。它们将在以下的几节中讨论。 定义多重接口 这个类由第4行中的如下代码声明: implements MouseMotionListener, MouseListener 声明多个接口时,可以用逗号隔开。 监听多个源 如果你在第11行和第12行中,调用如下方法: 两种类型的事件都会引起TwoListen类中的方法被调用。一个对象可以“监听”任意数量的事件源;它的类只需要实现所要求的接口。 f.addMouseListener(this); f.addMouseMotionListener(this); 复杂的范例(续) 获取关于事件的细节 调用处理器方法(如mouseDragged())时所带的事件参数可能会包含关于源事件的重要信息。为了确定可以获取关于某类事件的哪些细节时,你应当查看java.awt.event包中合适的类文档。 9.5.3 多监听者 AWT事件监听框架事实上允许同一个组件带有多个监听者。一般地,如果你想写一个程序,它基于一个事件而执行多个动作,把那些行为编写到处理器的方法里即可。然而,有时一个程序的设计要求同一程序的多个不相关的部分对于同一事件作出反应。这种情况是有可能的,例如,将一个上下文敏感的帮助系统加到一个已存在的程序中。 监听者机制允许你调用addXXXlistener方法任意多次,而且,你可以根据你的设计需要指定任意多个不同的监听者。事件发生时,所有被注册的监听者的处理器都会被调用。 注-没有定义调用事件处理器方法的顺序。通常,如果调用的顺序起作用,那么处理器就不是不相关的。在这种情况下,只注册第一个监听者,并由它直接调用其它的监听者。 9.5.4 事件Adapters(适配器) 你定义的Listener可以继承Adapter类,而且只需重写你所需要的方法。例如: 实现每个Listener接口的所有方法的工作量是非常大的,尤其是MouseListener接口和ComponentListener接口。 以MouseListener接口为例,它定义了如下方法: - mouseClicked(MouseEvent) - mouseEntered(MouseEvent) - mouseExited(MouseEvent) - mousePressed(MouseEvent) - mouseReleased(MouseEvent) 为了方便起见,Java语言提供了Adapters类,用来实现含有多个方法的类。这些Adapters类中的方法是空的。 你可以继承Adapters类,而且只需重写你所需要的方法。例如: 1.import java.awt.*; 2.import java.awt.event.*; 3. 4.public class MouseClickHandler extends MouseAdapter { 5. 6.// We just need the mouseClick handler, so we use 7.// the Adapter to avoid having to write all the 8.// event handler methods 9.public void mouseClicked (MouseEvent e) { 10.// Do something with the mouse click... 11.} 12.} 9.5.5 匿名类 可以在一个表达式的域中,包含整个类的定义。这种方法定义了一个所谓的匿名类并且立即创建了实例。匿名类通常和AWT事件处理一起使用。例如: 1.import java.awt.*; 2.import java.awt.event.*; 3.public class AnonTest { 4.private Frame f; 5.private TextField tf; 6. 7.public static void main(String args[]) 8.{ 9.AnonTest obj = new AnonTest(); 10.obj.go(); 11.} 12. 匿名类(续) 1.public void go() { 2.f = new Frame("Anonymous classes example"); 3.f.add(new Label("Click and drag the " + 4." mouse",BorderLayout.NORTH); 5.tf = new TextField (30); 6.f.add(tf,BorderLayout.SOUTH); 7. 8.f.addMouseMotionListener ( new 9.MouseMotionAdapter() { 10.public void mouseDragged (MouseEvent e) { 11.String s = 12."Mouse dragging: X = " + e.getX() + 13." Y = " + e.getY(); 14.tf.setText (s); 15.} 16.} ); // <- note the closing parenthesis 17. 18.f.addMouseListener (new MouseClickHandler()); 19.f.setSize(300, 200); 20.f.setVisible(true); 21.} 22.} 练习:事件 练习目标-你将编写、编译和运行包含事件处理器的Calculator 图形用户界面 和Account 图形用户界面的修改版本。 一、准备 为了很好地完成这个练习,你必须对事件模型是如何工作的有一个清晰的了解。 二、任务 水平1:创建一个Calculator 图形用户界面,第二部分 1. 使用你在模块8中创建的图形用户界面代码,编写一段事件代码,用来连接计算器的用户界面和处理计算器上的函数的事件处理器。 水平3:创建一个Account 图形用户界面,第二部分 1. 创建一个AccountEvent类,类的对象在帐目发生改变时被激活。然后激活送往Bankmanager类的事件。根据你在模块8中创建的Teller.java GUI代码为起点进行练习。 三、练习小结 讨论 - 花几分钟时间讨论一下,在本实验练习过程中你都经历、提出和发现了什么。 经验 解释 总结 应用 四、检查一下你的进度 在进入下一个模块的学习之前,请确认你能够: - 编写代码来处理在图形用户界面中发生的事件 - 描述Adapter类的概念,包括如何和何时使用它们 - 根据事件对象的细节来确定产生事件的用户动作 - 为各种类型的事件创建合适的接口和事件处理器。 五、思考 你现在已经知道如何为图形化输出和交互式用户输入来创建Java图形用户界面。然而,我们只介绍了能创建图形用户界面的一些组件。其他的组件在图形用户界面中有什么用处呢?

2009-08-27

精通Java Swing程序设计

Swing读书笔记 1-3:版面管理器(Layout Menager) |BorderLayout |FlowLayout |GridLayout AWT----|CardLayout |GridBagLayout Swing--|BoxLayout 1-3-1:BorderLayout的使用: BorderLayout的类层次结构图: java.lang.Object --java.awt.BorderLayout 构造函数:BorderLayout()建立一个没有间距的border layout BorderLayout(int hgap,int vgap)建立一个组件间有间距的border layout BorderLayout将版面划分为东、西、南、北、中 例子:BorderLayoutDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BorderLayoutDemo{ public BorderLayoutDemo(){ JFrame f=new JFrame(); Container contentPane=f.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(new JButton("EAST"),BorderLayout.EAST); contentPane.add(new JButton("WEST"),BorderLayout.WEST); contentPane.add(new JButton("SOUTH"),BorderLayout.SOUTH); contentPane.add(new JButton("NORTH"),BorderLayout.NORTH); contentPane.add(new JLabel("CENTER",JLabel.CENTER),BorderLayout.CENTER); f.setTitle("BorderLayout"); f.pack(); f.setVisible(true); /***read**/ /*处理关闭窗口的操作,若你没写这一段,就算你已经关闭窗口了,但程序并不会终止。 */ f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); /***read**/ } public static void main(String[] args){ BorderLayoutDemo b=new BorderLayoutDemo(); } } 设置组件的间距,你可以使用有间距参数的BorderLayout构造函数,也可以利用BorderLayout的setHgap(int hgap)与 setVgap(int vgap)两个方法来达成。 1-3-2:FlowLayout的使用: FlowLayout的类层次结构图: java.lang.Object --java.awt.FlowLayout 构造函数:FlowLayout()建立一个新的Flow Layout,此FlowLayout默认值是居中对齐,组件彼此有5单位的水平与垂直间距。 FlowLayout(int align)建立一个新的Flow Layout,此FlowLayout可设置排列方式,组件彼此有5单位的水平与垂直 间距。 FlowLayout(int align,int hgap,int vgap)建立一个新的Flow Layout,此FlowLayout可设置排列方式与组件间距。 FlowLayoutDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class FlowLayoutDemo{ public FlowLayoutDemo(){ JFrame f=new JFrame(); Container contentPane=f.getContentPane(); /*你可以使用有间距的FlowLayout构造函数,使FlowLayout的排列具有间距,并 *并可利用排列方向参数来指定靠什么方向排列,FlowLayout共有五种排列方式, *依次是CENTER(默认值),LEFT,RIGHT,LEADING,TRAILING,若我们将下面程序第13 *行改成contentPane.setLayout(new FlowLayout(FlowLayout.LEFT)); */ contentPane.setLayout(new FlowLayout()); contentPane.add(new JButton("first")); contentPane.add(new JButton("second")); contentPane.add(new JButton("third")); contentPane.add(new JButton("fourth")); contentPane.add(new JButton("fifth")); contentPane.add(new JButton("Last")); f.setTitle("FlowLayout"); //f.pack();//必须将f.pach()去掉,否则setSize功能将没有作用 f.setSize(400,220); f.setVisible(true); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } public static void main(String[] args){ FlowLayoutDemo b=new FlowLayoutDemo(); } } 1-3-3:GridLayout的使用: GridLayout的类层次结构图: java.lang.Object --java.awt.GridLayout GridLayout比FlowLayout多了行和列的设置,也就是说你要先设置GridLayout共有几行几列,就如同二维平面一般,然后你加 进去的组件会先填第一行的格子,然后再从第二行开始填,依此类扒,就像是一个个的格子一般。而且GridLayout会将所填进去组 件的大小设为一样。 构造函数:GridLayout()建立一个新的GridLayout,默认值是1行1列。 GridLayout(int rows,int cols)建立一个几行几列的GridLayout. GridLayout(int rows,int cols, int hgap,int vgap)建立一个几行几列的GridLayout,并设置组件的间距。 例子:GridLayoutDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CardLayoutDemo implements ActionListener{ JPanel p1,p2,p3,p4; int i=1; JFrame f; public CardLayoutDemo(){ f=new JFrame();//当做top-level组件 Container contentPane=f.getContentPane(); contentPane.setLayout(new GridLayout(2,1)); p1=new JPanel(); Button b=new Button("Change Card"); b.addActionListener(this);//当按下"Change Card"时,进行事件监听,将会有系统操作产生。 p1.add(b); //处理操作在52-64行. contentPane.add(p1); p2=new JPanel(); p2.setLayout(new FlowLayout()); p2.add(new JButton("first")); p2.add(new JButton("second")); p2.add(new JButton("third")); p3=new JPanel(); p3.setLayout(new GridLayout(3,1)); p3.add(new JButton("fourth")); p3.add(new JButton("fifth")); p3.add(new JButton("This is the last button")); p4=new JPanel(); p4.setLayout(new CardLayout()); p4.add("one",p2); p4.add("two",p3); /*要显示CardLayout的卡片,除了用show(Container parent,String name)这个方法外 *,也可试试first(Container),next(Container),previous(Container),last(Container)这 *四个方法,一样可以达到显示效果。 */ ((CardLayout)p4.getLayout()).show(p4,"one"); contentPane.add(p4); f.setTitle("CardLayout"); f.pack(); f.setVisible(true); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } public void actionPerformed(ActionEvent event){ switch(i){ case 1: ((CardLayout)p4.getLayout()).show(p4,"two"); break; case 2: ((CardLayout)p4.getLayout()).show(p4,"one"); break; } i++; if (i==3) i=1; f.validate(); } public static void main(String[] args){ new CardLayoutDemo(); } } 1-3-5:GridBagLayout的使用:是java中最有弹性但也是最复杂的一种版面管理器。它只有一种构造函数,但必须配合 GridBagConstraints才能达到设置的效果。 GridBagLayout的类层次结构图: java.lang.Object --java.awt.GridBagLayout 构造函数: GirdBagLayout()建立一个新的GridBagLayout管理器。 GridBagConstraints()建立一个新的GridBagConstraints对象。 GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty, int anchor,int fill, Insets insets,int ipadx,int ipady)建立一个新的GridBagConstraints对象 ,并指定其参数的值。 参数说明: gridx,gridy:设置组件的位置,gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。 若将gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。建议定义出 gridx,gridy的位置,以便以后维护程序。表示放在几行几列,gridx=0,gridy=0时放在0行0列。 gridwidth,gridheight:用来设置组件所占的单位长度与高度,默认值皆为1。你可以使用GridBagConstraints.REMAINDER常 量,代表此组件为此行或此列的最后一个组件,而且会占据所有剩余的空间。 weightx,weighty:用来设置窗口变大时,各组件跟着变大的比例,当数字越大,表示组件能得到更多的空间,默认值皆为0。 anchor: 当组件空间大于组件本身时,要将组件置于何处,有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、 WEST、NORTHWEST可供选择。 insets:设置组件之间彼此的间距,它有四个参数,分别是上,左,下,右,默认为(0,0,0,0). ipadx,ipady:设置组件内的间距,默认值为0。 我们以前提过,GridBagLayout里的各种设置都必须通过GridBagConstraints,因此当我们将GridBagConstraints的参数都设置 好了之后,必须new一个GridBagConstraints的对象出来,以便GridBagLayout使用。 例子: GridBagLayoutDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GridBagLayoutDemo{ public GridBagLayoutDemo(){ JButton b; GridBagConstraints c; int gridx,gridy,gridwidth,gridheight,anchor,fill,ipadx,ipady; double weightx,weighty; Insets inset; JFrame f=new JFrame(); GridBagLayout gridbag=new GridBagLayout(); Container contentPane=f.getContentPane(); contentPane.setLayout(gridbag); b=new JButton("first"); gridx=0; gridy=0; gridwidth=1; gridheight=1; weightx=10; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=0; ipady=0; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); b=new JButton("second"); gridx=1; gridy=0; gridwidth=2; gridheight=1; weightx=1; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=50; ipady=0; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); b=new JButton("third"); gridx=0; gridy=1; gridwidth=1; gridheight=1; weightx=1; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=0; ipady=50; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); b=new JButton("fourth"); gridx=1; gridy=1; gridwidth=1; gridheight=1; weightx=1; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=0; ipady=0; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); b=new JButton("This is the last button"); gridx=2; gridy=1; gridwidth=1; gridheight=2; weightx=1; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=0; ipady=50; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); f.setTitle("GridBagLayout"); f.pack(); f.setVisible(true); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } public static void main(String[] args){ new GridBagLayoutDemo(); } } 1-3-5:BoxLayout的使用: BoxLayout的类层次结构图: java.lang.Object --java.awt.BoxLayout BoxLayout提供了两个常数X_AXIS,Y_AXIS来表示水平或垂直排列。若放进去的组件不等高,则系统将会使所有的组件与最高组件 等高,还有,若你将组件都摆在同一行时,系统不因组件宽度在于Container的宽度,而使组件自动摆在下一行,你必须自行处理换 行的操作。 构造函数: BoxLayout(Container targe,int axis)建立一个水平或垂直的BoxLayout. 讲到BoxLayout,我们就不得不提到Box这个Container,Box这个Container默认的Layout为BoxLayout,而它只能使用这个Layout, 否则编译时会有Error产生,如同前面所讲的,BoxLayout是以水平或垂直方式排列,因此,当我们要产生一个Box Container时, 就必须指定它的排列方式,下面为Box的构造函数: Box(int axis) 建立一个Box Container,并指定组件的排列方式是水平或垂直。 上面的axis参数,我们可以使用BoxLayout.X_AXIS或BoxLayout.Y_AXIS来指定。或是利用Box类所提供的两个方法: createHorizontalBox()与createVerticalBox(),来建立BoxContainer. Box类提供4种透明的组件来做更方便的版面管理。分别是glue、strut、rigid、filler: 下面以两个相连的按钮当例子,起始状态如下: B1.java 1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 public class B1{ 5 public B1(){ 6 JFrame f=new JFrame(); 7 Container contentPane=f.getContentPane(); 8 Box baseBox=Box.createHorizontalBox(); 9 contentPane.add(baseBox); 10 baseBox.add(new JButton("A")); 11 baseBox.add(new JButton("B")); 12 f.setTitle("BoxLayout"); 13 f.setSize(new Dimension(200,50)); 14 f.setVisible(true); 15 f.addWindowListener( 16 new WindowAdapter(){ 17 public void windowClosing(WindowEvent e){ 18 System.exit(0); 19 } 20 } 21 ); 22 } public static void main(String[] args){ B1 b=new B1(); } } Glue:当glue插入在两组件间时,它会将两组件挤到最左与最右(或最上与最下),透明的glue将会占满整个中间的空间。 例: 在10与11行间加入下面一行程序: baseBox.add(Box.createHorizontalGlue()); Strut:当你不想将A与B按钮挤到最旁边时,你可以使用Strut组件,来设置所需要的大小,但仅能限定一维的大小,例如限定 水平或垂直高度。 例:在10与11行间加入下面一行程序: baseBox.add(Box.createHorizontalStrut(50));//A,B之间间隔50个像素。 Rigid:这个透明组件跟Strut很像,但它可以设置二维的限制,也就是可以设置水平与垂直的限制宽度。 例:在10与11行间加入下面一行程序: baseBox.add(Box.createRigidArea(new Dimension(50,50))); 为了将Rigid的高度功能显示出来,因此以pack()方法代替setSize()方法,11行替换为:f.pack(); 若我们将高度再拉长,例如baseBox.add(Box.createRigidArea(new Dimension(50,50)));的Dimension改成(50,100),则两 组件的上下空白将会增大,因为透明的Rigid组件高度增高了。 Filler:Filler是Box的inner class,它的功能跟Rigid很像,都可以指定长宽的大小限制,且Filler可以指定最大、较佳、最小的长 宽大小,以下是Filler的构造函数: Box.Filler(Dimension min,Dimension pref Dimension max)建立一个指定大小的Filler对象。 参数min表示最小的显示区域大小,如同上面的例子所示,若所设置最小区域的高度大于按钮A与B的高度,则按钮A与B的上方 与下方将有空白出现。 pref表示较佳的显示区域大小。max表示最大的显示区域大小。 例:在10与11行间加入下面一行程序: baseBox.add(new Box.Filler(new Dimension(50,50), new Dimension(100,50), new Dimension(200,50))); Box类所提供的方法: Static Component createGlue()构造一个Glue组件可向水平与垂直方向延伸 Static Box createHorizontalBox()构造一个水平排列的Box组件 Static Component createHorizontalGlue()构造一个水平的Glue组件 Static Component createHorizontalStrut(int width)构造一个水平的Strut组件 Static Component createRigidArea(Dimension d)构造一个Rigid组件 Static Box createVerticalBox()构造一个垂直排列的Box组件 Static Component createVerticalGlue()构造一个垂直的Glue组件 Static Component createVerticalStrut(int height)构造一个垂直的Strut组件 AccessibleContext getAccessibleContext()取得与JComponent相关边的AccessibleContext Void setLayout(LayoutManager l)丢出AWTError,因为Box只能使用BoxLayout 例子:BoxLayoutDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BoxLayoutDemo{ public BoxLayoutDemo(){ JFrame f=new JFrame(); Container contentPane=f.getContentPane(); Box baseBox=Box.createHorizontalBox();//先产生水平排列方式的Box组件,当作基底容器(BaseBox) contentPane.add(baseBox); /*产生垂直排列方式的Box组件来安置第一与第三个按钮 */ Box vBox=Box.createVerticalBox(); JButton b=new JButton("first"); vBox.add(b); b=new JButton("third"); b.setMaximumSize(new Dimension(100,150)); vBox.add(b); baseBox.add(vBox); /*产生垂直排列方式的Box组件来安置第二与另一个水平排列方式的Box组件 */ Box vBox1=Box.createVerticalBox(); baseBox.add(vBox1); b=new JButton("second"); b.setAlignmentX(Component.CENTER_ALIGNMENT); b.setMaximumSize(new Dimension(300,50)); vBox1.add(b); Box hBox=Box.createHorizontalBox(); vBox1.add(hBox); /*将第四与最后一个按钮加入水平排列方式的Box组件中 */ Box vBox2=Box.createVerticalBox(); vBox2.add(Box.createVerticalStrut(50)); vBox2.add(new JButton("fourth")); vBox2.add(Box.createVerticalStrut(50)); hBox.add(vBox2); Box vBox3=Box.createVerticalBox(); vBox3.add(Box.createVerticalGlue()); vBox3.add(new JButton("THis is the last button")); hBox.add(vBox3); f.setTitle("BoxLayout"); f.pack(); f.setVisible(true); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } public static void main(String[] args){ BoxLayoutDemo b=new BoxLayoutDemo(); } }

2009-08-27

SWING高级设计,RCP技术讲解,SWT/JFACE RCP入门资料

Swing组件简介 1. 模型-视图-控制器设计模式 Swing组件都有三个要素:  内容,例如,按钮的状态(是否按下)或者文本框中的文本。  外观显示(颜色,尺寸)。  行为(对事件的反应)。 也就是MVC模式:实现此模式的三个独立的类:  模型-------存储内容  视图-------显示内容  控制器----处理用户输入 这个模式明确规定了三个对象如何进行交互。模型存储内容,它没有任何用户界面。对于一个按钮来说,内容非常简单—它只是一组标志,用来说明按钮是否按下,是否启用等等。对于一个文本框来说,内容稍稍复杂,它是容纳当前文本的一个字符串对象。这个内容和视图的内容并不一致------如果内容的长度大于文本框的显示长度,那么用户看到的就只有文本框显示的那一部分。模型必须实现改变和发现内容的方法。例如:一个文本模型中的方法有:在当前文本中添加或者删除字符以及把当前文本作为一个字符串返回等。再次强调,模型是完全不可见的,显示存储在模型中的数据是视图的工作。 2. 选择组件  复选框(JCheckBox) 例如:JCheckBoxTest.java import java.awt.*; import java.awt.event.*; import javax.swing.*; class JCheckBoxTest { public static void main(String[] args) { JCheckBoxFrame f=new JCheckBoxFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } } class JCheckBoxFrame extends JFrame { private JLabel label; private JCheckBox bold; private JCheckBox italic; public static final int FONTSIZE=30; public JCheckBoxFrame() { setTitle("JCheckBoxFrame"); setSize(400,300); Container contentPane=getContentPane(); label=new JLabel("The dog jumps over the pig"); label.setFont(new Font("Serif",Font.PLAIN,FONTSIZE)); contentPane.add(label,BorderLayout.CENTER); ActionListener listener=new ActionListener() { public void actionPerformed(ActionEvent e) { int mode=0; if(bold.isSelected()) mode +=Font.BOLD; if(italic.isSelected()) mode +=Font.ITALIC; label.setFont(new Font("Serif",mode,FONTSIZE)); } }; JPanel buttonPanel=new JPanel(); bold=new JCheckBox("Bold"); bold.addActionListener(listener); buttonPanel.add(bold); italic =new JCheckBox("Italic"); italic.addActionListener(listener); buttonPanel.add(italic); contentPane.add(buttonPanel,BorderLayout.SOUTH); } };  单选按钮 对于复选框来说,用户可以选折0个或多个。在许多情况下,我们需要用户只选择几个框中的一个。当用户选择另外一个时,前一个选择就自动取消。这样的一组框通常称作一个单选按钮组(radio button group),这是因为这些按钮的工作方式像收音机上的电台选择按钮,当按下一个按钮时,前一个按下的按钮则自动释放。 例如:JRadioButtonTest.java import java.awt.*; import java.awt.event.*; import javax.swing.*; class JRadioButtonTest { public static void main(String[] args) { JRadioButtonFrame f=new JRadioButtonFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } } class JRadioButtonFrame extends JFrame { private JPanel buttonPanel; private ButtonGroup group; private JLabel label; public static final int DEFAULT_SIZE=30; public JRadioButtonFrame() { setTitle("JRadioButtonFrame"); setSize(400,300); Container contentPane=getContentPane(); label=new JLabel("The lazy dog doesn't jump over the clever pig"); label.setFont(new Font("Serif",Font.PLAIN,DEFAULT_SIZE)); contentPane.add(label,BorderLayout.CENTER); buttonPanel=new JPanel(); group=new ButtonGroup(); addRadioButton("Small",12); addRadioButton("Medium",18); addRadioButton("Large",25); addRadioButton("Extra large",36); contentPane.add(buttonPanel,BorderLayout.SOUTH); } public void addRadioButton(String name,final int size) { boolean selected=size==DEFAULT_SIZE; JRadioButton button=new JRadioButton(name,selected); group.add(button); buttonPanel.add(button); ActionListener listener=new ActionListener() { public void actionPerformed(ActionEvent e) { label.setFont(new Font("Serif",Font.PLAIN,size)); } }; button.addActionListener(listener); } }  边界 如果在一个窗口中有多组单选按钮,那么你需要从视觉上说明哪些按钮属于同一组。Swing提供了一组有用的边界来解决该问题。你可以为任何扩展了JComponent的组件提供一种边界。最常见的用法是在一个面板周围设置一种边界,然后用其他用户界面元素(如单选按钮)来填充该面板。 有几种不同边界可供选择,但是使用它们的步骤完全一样:  低斜面  凸斜面  蚀刻  直线  不光滑  空(只是在组件周围创建一些空白地方) 例如:BorderTest.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class BorderTest { public static void main(String[] args) { BorderFrame f=new BorderFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } }; class BorderFrame extends JFrame { private JPanel demoPanel; private JPanel buttonPanel; private ButtonGroup group; public BorderFrame() { setTitle("BorderTest"); setSize(400,300); demoPanel=new JPanel(); buttonPanel=new JPanel(); group=new ButtonGroup(); addRadioButton("Lowered bevel",BorderFactory.createLoweredBevelBorder()); addRadioButton("Raised bevel",BorderFactory.createRaisedBevelBorder()); addRadioButton("Etched",BorderFactory.createEtchedBorder()); addRadioButton("Line",BorderFactory.createLineBorder(Color.blue)); addRadioButton("Matte",BorderFactory.createMatteBorder(10,10,10,10,Color.blue)); addRadioButton("Empty",BorderFactory.createEmptyBorder()); Border etched=BorderFactory.createEtchedBorder(); Border titled=BorderFactory.createTitledBorder(etched,"Border types"); buttonPanel.setBorder(titled); Container contentPane=getContentPane(); contentPane.setLayout(new GridLayout(2,1)); contentPane.add(buttonPanel); contentPane.add(demoPanel); } public void addRadioButton(String buttonName,final Border b) { JRadioButton button=new JRadioButton(buttonName); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { demoPanel.setBorder(b); validate(); } }); group.add(button); buttonPanel.add(button); } };  组合框 如果你有很多的选择项,那么使用单选按钮就不合适了,这是因为它们会占用很大的屏幕空间。取而代之的是,你可以使用一个组合框。当用户点击该组件时,一列选择项就会下拉弹出,然后用户可以选择其中的一个。如果该下拉列表框被设置成可编辑的,那么你可以编辑当前选择项,这时候该组件才称作组合框----它把编辑框的灵活性与一组预定义的选择项组合起来。JComboBox类提供了组合框组件。 例如:JComboBoxTest.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JComboBoxTest { public static void main(String[] args) { JComboBoxFrame f=new JComboBoxFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } }; class JComboBoxFrame extends JFrame { private JComboBox faceCombo; private JLabel label; public static final int DEFAULT_SIZE=30; public JComboBoxFrame() { setTitle("JComboBoxFrame"); setSize(400,300); Container contentPane=getContentPane(); label=new JLabel("The dog jumps over the monkey"); label.setFont(new Font("Serif",Font.PLAIN,DEFAULT_SIZE)); contentPane.add(label,BorderLayout.CENTER); faceCombo=new JComboBox(); faceCombo.setEditable(true); faceCombo.addItem("Serif"); faceCombo.addItem("SansSerif"); faceCombo.addItem("Monospaced"); faceCombo.addItem("Dialog"); faceCombo.addItem("DialogInput"); faceCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { label.setFont(new Font((String)faceCombo.getSelectedItem(),Font.PLAIN,DEFAULT_SIZE)); } }); JPanel comboPanel =new JPanel(); comboPanel.add(faceCombo); contentPane.add(comboPanel,BorderLayout.SOUTH); } };  滑块 组合框允许用户从一组离散值中进行选择。而滑块允许进行连续值的选择,例如,选择从1到100的任意值。构造一个滑块的方法如下: JSlider slider=new JSlider(min,max,initialValue); 如果你忽略最小值,最大值和初始值,那么这三项分别默认为0,100,50。或者,如果你需要一个垂直的滑块,那么可以使用如下构造器: JSlider slider=new JSlider(SwingConstants.VERTICAL,min,max,initialValue); 下面是使用滑块的综合例子。 例如:JSliderTest.java import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; public class JSliderTest { public static void main(String[] args) { JSliderTestFrame f=new JSliderTestFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } }; class JSliderTestFrame extends JFrame { private JPanel sliderPanel; private JTextField textField; private ChangeListener listener; public JSliderTestFrame() { setTitle("JSliderTest"); setSize(400,500); sliderPanel=new JPanel(); sliderPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); listener=new ChangeListener() { public void stateChanged(ChangeEvent e) { JSlider source=(JSlider)e.getSource(); textField.setText(""+source.getValue()); } }; // add a plain slider JSlider slider=new JSlider(); addSlider(slider,"Plain"); //add a slider with major and minor ticks slider=new JSlider(); slider.setPaintTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); addSlider(slider,"Ticks"); //add a slider that snaps to ticks slider=new JSlider(); slider.setPaintTicks(true); slider.setSnapToTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); addSlider(slider,"Snap to ticks"); //add a filled slider slider =new JSlider(); slider.setPaintTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); slider.putClientProperty("JSlider.isFilled",Boolean.TRUE); addSlider(slider,"Filled"); // add a filled and inverted slider slider=new JSlider(); slider.setPaintTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); slider.putClientProperty("JSlider.isFilled",Boolean.TRUE); slider.setInverted(true); addSlider(slider,"Inverted"); //add a slider with numeric labels slider=new JSlider(); slider.setPaintTicks(true); slider.setPaintLabels(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); addSlider(slider,"Labels"); //add a slider with alphabetic labels slider=new JSlider(); slider.setPaintLabels(true); slider.setPaintTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(5); Hashtable labelTable=new Hashtable(); labelTable.put(new Integer(0),new JLabel("A")); labelTable.put(new Integer(20),new JLabel("B")); labelTable.put(new Integer(40),new JLabel("C")); labelTable.put(new Integer(60),new JLabel("D")); labelTable.put(new Integer(80),new JLabel("E")); labelTable.put(new Integer(100),new JLabel("F")); slider.setLabelTable(labelTable); addSlider(slider,"Custom labels"); //add a slider with icon labels slider=new JSlider(); slider.setPaintTicks(true); slider.setPaintLabels(true); slider.setSnapToTicks(true); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(20); labelTable = new Hashtable(); //add card images labelTable.put(new Integer(0),new JLabel(new ImageIcon("01.gif"))); labelTable.put(new Integer(20),new JLabel(new ImageIcon("02.gif"))); labelTable.put(new Integer(40),new JLabel(new ImageIcon("03.gif"))); labelTable.put(new Integer(60),new JLabel(new ImageIcon("04.gif"))); labelTable.put(new Integer(80),new JLabel(new ImageIcon("05.gif"))); labelTable.put(new Integer(100),new JLabel(new ImageIcon("06.gif"))); slider.setLabelTable(labelTable); addSlider(slider,"Icon labels"); //add the text field that displays the slider value textField=new JTextField(); Container contentPane=getContentPane(); contentPane.add(sliderPanel,BorderLayout.CENTER); contentPane.add(textField,BorderLayout.SOUTH); } public void addSlider(JSlider s,String description) { s.addChangeListener(listener); JPanel panel=new JPanel(); panel.add(s); panel.add(new JLabel(description)); sliderPanel.add(panel); } };  微调控制器(JSpinner) JSpinner(微调控制器)也是文本框,它在一边带有两个小按钮,可以让你增加或者减少存储在文本框内的值。 例如:JSpinnerTest.java import java.awt.*; import java.awt.event.*; import java.text.*; import java.util.*; import javax.swing.*; public class JSpinnerTest { public static void main(String[] args) { JSpinnerFrame f=new JSpinnerFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } }; class JSpinnerFrame extends JFrame { private JPanel mainPanel; private JButton okButton; public JSpinnerFrame() { setTitle("SpinnerTest"); setSize(400,300); Container contentPane=getContentPane(); JPanel buttonPanel=new JPanel(); okButton=new JButton("Ok"); buttonPanel.add(okButton); contentPane.add(buttonPanel,BorderLayout.SOUTH); mainPanel=new JPanel(); mainPanel.setLayout(new GridLayout(0,3)); contentPane.add(mainPanel,BorderLayout.CENTER); JSpinner defaultSpinner=new JSpinner(); addRow("Default",defaultSpinner); JSpinner boundedSpinner=new JSpinner(new SpinnerNumberModel(5,0,10,0.5)); addRow("Bounded",boundedSpinner); String[] fonts=GraphicsEnvironment.getLocalGraphicsEnvironment() .getAvailableFontFamilyNames(); JSpinner listSpinner=new JSpinner(new SpinnerListModel(fonts)); addRow("List",listSpinner); JSpinner reverseListSpinner=new JSpinner(new SpinnerListModel(fonts) { public Object getNextValue() { return super.getPreviousValue(); } public Object getPreviousValue() { return super.getNextValue(); } }); addRow("Reverse List",reverseListSpinner); JSpinner dateSpinner=new JSpinner(new SpinnerDateModel()); addRow("Date",dateSpinner); JSpinner betterDateSpinner =new JSpinner(new SpinnerDateModel()); String pattern=((SimpleDateFormat)DateFormat.getDateInstance()).toPattern(); betterDateSpinner.setEditor(new JSpinner.DateEditor(betterDateSpinner,pattern)); addRow("Better Date",betterDateSpinner); JSpinner timeSpinner =new JSpinner(new SpinnerDateModel( new GregorianCalendar(2000,Calendar.JANUARY,1,12,0,0).getTime(),null,null,Calendar.HOUR)); addRow("Time",timeSpinner); JSpinner permSpinner=new JSpinner(new PermutationSpinnerModel("meat")); addRow("Word permutations",permSpinner); } public void addRow(String labelText,final JSpinner spinner) { mainPanel.add(new JLabel(labelText)); mainPanel.add(spinner); final JLabel valueLabel=new JLabel(); mainPanel.add(valueLabel); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Object value=spinner.getValue(); valueLabel.setText(value.toString()); } }); } }; class PermutationSpinnerModel extends AbstractSpinnerModel { private String word; public PermutationSpinnerModel(String w) { word=w; } public Object getValue() { return word; } public void setValue(Object value) { if(!(value instanceof String)) throw new IllegalArgumentException(); word=(String)value; fireStateChanged(); } public Object getNextValue() { StringBuffer buffer=new StringBuffer(word); for(int i=buffer.length()-1;i>0;i--) { if(buffer.charAt(i-1)<buffer.charAt(i)) { int j=buffer.length()-1; while(buffer.charAt(i-1)>buffer.charAt(j)) j--; swap(buffer,i-1,j); reverse(buffer,i,buffer.length()-1); return buffer.toString(); } } reverse(buffer,0,buffer.length()-1); return buffer.toString(); } public Object getPreviousValue() { StringBuffer buffer=new StringBuffer(word); for(int i=buffer.length()-1;i>0;i--) { if(buffer.charAt(i-1)>buffer.charAt(i)) { int j=buffer.length()-1; while(buffer.charAt(i-1)<buffer.charAt(j)) j--; swap(buffer,i-1,j); reverse(buffer,i,buffer.length()-1); return buffer.toString(); } } reverse(buffer,0,buffer.length()-1); return buffer.toString(); } private static void swap(StringBuffer buffer,int i,int j) { char temp=buffer.charAt(i); buffer.setCharAt(i,buffer.charAt(j)); buffer.setCharAt(j,temp); } private static void reverse(StringBuffer buffer,int i,int j) { while(i<j) {swap(buffer,i,j);i++;j--;} } };  文件对话框 当你编写一个应用程序时,你常常需要打开和保存文件。一个好的文件对话框是很难编写的,它应该能够显示文件和目录并且让用户浏览文件系统。你肯定不会想去发明这种对话框。 幸运的是,Swing提供一个JFileChooser类可以用来显示一个文件对话框; 例如:JFileChooserTest.java import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.beans.*; import java.util.*; import java.io.*; import javax.swing.*; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileView; public class JFileChooserTest { public static void main(String[] args) { ImageViewerFrame f=new ImageViewerFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } } class ImageViewerFrame extends JFrame { private JLabel label; private JFileChooser chooser; public ImageViewerFrame() { setTitle("JFileChooserTest"); setSize(500,400); JMenuBar menuBar=new JMenuBar(); setJMenuBar(menuBar); JMenu menu=new JMenu("File"); menuBar.add(menu); JMenuItem openItem=new JMenuItem("Open"); menu.add(openItem); openItem.addActionListener(new FileOpenListener()); JMenuItem exitItem=new JMenuItem("Exit"); menu.add(exitItem); exitItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); label=new JLabel(); Container c=getContentPane(); c.add(label); chooser=new JFileChooser(); final ExtensionFileFilter filter =new ExtensionFileFilter(); filter.addExtension("jpg"); filter.addExtension("jpeg"); filter.addExtension("gif"); filter.setDescription("Image files"); chooser.setFileFilter(filter); chooser.setAccessory(new ImagePreviewer(chooser)); chooser.setFileView(new FileIconView(filter,new ImageIcon("02.gif"))); } private class FileOpenListener implements ActionListener { public void actionPerformed(ActionEvent e) { chooser.setCurrentDirectory(new File(".")); final ExtensionFileFilter filter =new ExtensionFileFilter(); filter.addExtension("jpg"); filter.addExtension("jpeg"); filter.addExtension("gif"); filter.setDescription("Image files"); chooser.setFileFilter(filter); int result=chooser.showOpenDialog(ImageViewerFrame.this); if(result==JFileChooser.APPROVE_OPTION) { String name=chooser.getSelectedFile().getPath(); label.setIcon(new ImageIcon(name)); } } }; }; class ExtensionFileFilter extends FileFilter { private String description=""; private ArrayList extensions=new ArrayList(); public void addExtension(String extension) { if(!extension.startsWith(".")) extension="."+extension; extensions.add(extension.toLowerCase()); } public void setDescription(String description) { this.description=description; } public String getDescription() { return description; } public boolean accept(File f) { if(f.isDirectory()) return false; String name=f.getName().toLowerCase(); for(int i=0;i<extensions.size();i++) if(name.endsWith((String)extensions.get(i))) return true; return false; } }; class FileIconView extends FileView { private FileFilter filter; private Icon icon; public FileIconView(FileFilter filter,Icon icon) { this.filter=filter; this.icon=icon; } public Icon getIcon(File f) { if(!f.isDirectory()&&filter.accept(f)) return icon; else return null; } }; class ImagePreviewer extends JLabel { public ImagePreviewer(JFileChooser chooser) { setPreferredSize(new Dimension(100,100)); setBorder(BorderFactory.createEtchedBorder()); chooser.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if(e.getPropertyName()==JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) { File f=(File)(e.getNewValue()); if(f.isFile()) { ImageIcon icon=new ImageIcon(f.getPath()); if(icon.getIconWidth()>getWidth()) icon=new ImageIcon(icon.getImage().getScaledInstance(getWidth(),-1,Image.SCALE_DEFAULT)); setIcon(icon); } } } }); } };  颜色选择器 上个例子你已经看到,高质量的文件选择器是一个很复杂的用户界面组件,你可能不愿意自己实现。除了文件选择器之外,Swing只提供了另外一种选择器-----JColorChooser。 你可以使用它来挑选一种颜色。同JFileChooser类一样,颜色选择器是一个组件而非一个对话框。但是它包含了用于创建包含一个颜色选择器组件的对话框的方法。 例如:JColorChooserTest.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class JColorChooserTest { public static void main(String[] args) { JColorChooserFrame f=new JColorChooserFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } }; class JColorChooserFrame extends JFrame { public JColorChooserFrame() { setTitle("JColorChooserTest"); setSize(400,300); ColorChooserPanel panel=new ColorChooserPanel(); Container contentPane=getContentPane(); contentPane.add(panel); } }; class ColorChooserPanel extends JPanel { public ColorChooserPanel() { JButton modalButton=new JButton("Modal"); modalButton.addActionListener(new ModalListener()); add(modalButton); JButton modelessButton=new JButton("Modeless"); modelessButton.addActionListener(new ModelessListener()); add(modelessButton); JButton immediateButton=new JButton("Immediate"); immediateButton.addActionListener(new ImmediateListener()); add(immediateButton); } private class ModalListener implements ActionListener { public void actionPerformed(ActionEvent e) { Color defaultColor=getBackground(); Color selected=JColorChooser.showDialog(ColorChooserPanel.this,"Set background",defaultColor); setBackground(selected); } }; private class ModelessListener implements ActionListener { private JDialog dialog; private JColorChooser chooser; public ModelessListener() { chooser=new JColorChooser(); dialog=JColorChooser.createDialog(ColorChooserPanel.this,"Background Color",false,chooser,new ActionListener() { public void actionPerformed(ActionEvent e) { setBackground(chooser.getColor()); } },null); } public void actionPerformed(ActionEvent e) { chooser.setColor(getBackground()); dialog.show(); } } private class ImmediateListener implements ActionListener { private JDialog dialog; private JColorChooser chooser; public ImmediateListener() { chooser=new JColorChooser(); chooser.getSelectionModel().addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { setBackground(chooser.getColor()); } }); dialog=new JDialog((Frame)null,false/*not moal */); dialog.getContentPane().add(chooser); dialog.pack(); } public void actionPerformed(ActionEvent e) { chooser.setColor(getBackground()); dialog.show(); } }; };

2009-08-26

标准建模语言UML教程

UML教程UML的生长和产生以及他的应用领域等什么方面的知识点都有

2009-08-26

JAVA ORACLE数据库资料讲解

数据库设计 以及所有数据库的性能优化 所谓数据库设计就是根据具体应用环境设计出合理的数据库模式。其中应用环境包括:业务需求、数据需求和技术条件等具体情况,而数据库模式包括数据之间的联系、数据应满足的约束以及对数据的典型操作。从面向对象的角度讲:数据库设计就是类的持久化。 1 数据库设计的重要性 各种信息系统都以数据库为其中心,各种大型应用系统都以数据库为其枢纽。数据库的设计是一项十分复杂的任务,设计的质量直接关系信息系统建设的成败! 1.1 数据是企业的重要资产 数据是需要精心设计,并长时间积累方可获得的一种资源。数据不仅对组织的运作和管理是重要的,而且还决定者组织的竞争能力或运行效率。例如:婚姻介绍所的求婚者数据是该婚介所的生命线;股票经纪人的股票及其价格的历史数据是这些经纪人的生命线。因此,数据是组织(企事业单位,机关,学校等)的相当重要资产,应当像管理其它资产那样管理组织的数据。 1.2 数据位于信息系统的中心 从简单的单证数据处理、统计汇总与查询到综合信息服务,以及按照“如果…将会…”(what-if)思维模式进行人-机交互的辅助决策等活动,都是对精心设计的数据库的存取操作。数据位于信息系统的中心。 1.3 数据是稳定的,而处理是多变的 数据是按实体(如客户、产品、零件、员工、设备等)存储的。除了偶尔少量加入几个新的实体类型外,在企业经营方向不发生改变的前提下,这些实体类型及其属性之间的内在联系是不会变化的,变化的只是实体的属性值。如同机场航班信息牌上的数据一样,数据的格式一般是不变的,而数据的取值是随时变化的。虽然数据是相对稳定的,但是,对于数据的处理规则是经常变化的。 1.4 数据建模是信息系统建设的核心和难点 从技术角度讲,信息系统建设的实质是系统集成,而系统集成的关键在于处理好各系统之间的互连性和互操作性(即接口)。硬件及系统软件的互连性和互操作性均可由标准化接口或协议来实现,而应用软件系统(比如:财务、供应、生产、销售等等)之间的互连性和互操作性,必须通过开发商或集成商与企业的业务人员和管理人员一起,对企业管理中的各种业务流程、业务数据以及相关的规章制度进行深入细致的调查、分析,并进行归纳、抽象,在此基础上建立企业运行的逻辑模型—集成化的数据模型(即数据库模式)和业务模型才能实现,这是信息系统建设的核心和难点。 稳定的数据库模式是客观存在的,它深藏于组织的业务之中,必须采取科学的方法并下大力气方可获得。建立稳定的数据库模式(即数据建模)是信息系统建设的一项基础性工作。早期信息系统建设屡遭挫折的根本原因就在于没有建立起稳定的数据库模式。 2 需求获取与分析 2.1 业务建模(Business Modeling) 业务模型是用“职能范围(Function Area)—业务过程(Process)—业务活动(Activity)”这样的层次结构描述的。 2.1.1 职能范围 职能范围指的是一个企业中的主要业务领域,比如工程、市场、生产、科研、销售等。下面举出一个中型制造厂的职能范围:  经营计划  财务  产品计划  材料  生产计划  生产  销售  分配  财会  人事 职能范围图表展示了整个企业的概貌,即职能模型(Functional Model)。 2.1.2 业务过程 每个职能范围都要执行一些业务过程。下面是前面例子中的中型制造厂的各职能范围的业务过程(图表1): 职能范围和业务过程的确定,应该独立于当前的组织机构。组织机构可能变化,但要执行的业务职能以及相应的业务过程仍然相同。例如,有的企业的组织机构如同某些政府一样,每两年或稍长一点时间就改组一次,而其职能范围和相应的业务过程则保持不变。因此,企业的职能范围和业务过程的确定,应反映出这样一种基本的考虑,即撇开企业当前的组织结构(它常使人误解),该企业将怎样运行?

2009-08-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除