Java Swing用户界面设计:序

开发 后端
Swing属于JFC(Java Foundation Classes)的一部分。JFC包含了AWT,Swing,辅助功能API,Java2D,拖放。Swing的出现是为了解决AWT(Abastract Window Toolkit)的移植性和提供更多的企业级应用程序所需要的功能。Swing建立在核心AWT库上,JDK1.2以及更高的版本已经包含了Swing库。

Swing是什么

Swing属于JFC(Java Foundation Classes)的一部分。JFC包含了AWT,Swing,辅助功能API,Java2D,拖放。Swing的出现是为了解决AWT(Abastract Window Toolkit)的移植性和提供更多的企业级应用程序所需要的功能。Swing建立在核心AWT库上,JDK1.2以及更高的版本已经包含了Swing库。

Swing内部采用了MVC体系结构(modle-view-controller)。modle负责存放Swing组件的状态(数据),controller负责处理事件,view负责绘制图形。Swing使用了简化的MVC变体,controller和view合并称为UI代理。这种设计使得一个modle可以对应多个UI代理,因此非常灵活。

第一个简单的Swing组件

我的这个Swing组件非常简单,只是一个toolbar。参考下面的实现代码:

  1. package test1;  
  2. import java.awt.*;  
  3. import java.awt.event.*;  
  4. import javax.swing.*;  
  5. /**  
  6. *  
  7. * @author root  
  8. */ 
  9. public class ToolbarFrame extends Frame{  
  10. /** Creates a new instance of ToolbarFrame */ 
  11. public ToolbarFrame() {  
  12. super("My Toolbar(Swing)");//通过调用基类Frame的构造函数初始化标题栏文字  
  13. setSize(450,250);  
  14. addWindowListener(new WindowAdapter()  
  15. {  
  16. public void windowClosing(WindowEvent e)  
  17. {  
  18. System.exit(0);  
  19. }  
  20. });  
  21. }  

注意红色代码是创建了一个内部类,该类是WindowAdapter的子类,并且重写了虚函数windowClosing。然后将该类的引用交由TollbarFrame管理,通过方法addWindowListener。

如果没有这步,我们的toolbar可以显示,但是用不会被关闭。

现在创建调用代码:

  1. package test1;  
  2. /**  
  3. *  
  4. * @author root  
  5. */ 
  6. public class Main {  
  7. /** Creates a new instance of Main */ 
  8. public Main() {  
  9. }  
  10. /**  
  11. * @param args the command line arguments  
  12. */ 
  13. public static void main(String[] args) {  
  14. ToolbarFrame toolbar=new ToolbarFrame();  
  15. toolbar.setVisible(true);  
  16. }  

调用代码只有两行,非常简单。现在我们来看看运行的效果,见下图:

由于没有设置窗口的起始位置,所以默认停留在屏幕左上方。

既然我们使用Net Beans来开发程序,Net Beans向导也可以为我做同样的事情。通过使用newJFrame Form来创建一个ToolbarFrame2类。我们获得下面的代码:

  1. package test1;  
  2. /**  
  3. *  
  4. * @authorroot  
  5. */ 
  6. public class ToolbarFrame2 extends javax.swing.JFrame {  
  7. /** Creates new form ToolbarFrame2 */ 
  8. public ToolbarFrame2() {  
  9. initComponents();  
  10. }  
  11. /** This method is called from within the constructor to  
  12. * initialize the form.  
  13. * WARNING: Do NOT modify this code. The content of this method is  
  14. * always regenerated by the Form Editor.  
  15. */ 
  16. // <editor-fold defaultstate="collapsed" desc=" Generated Code ">  
  17. private void initComponents() {  
  18. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  
  19. javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());  
  20. getContentPane().setLayout(layout);  
  21. layout.setHorizontalGroup(  
  22. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
  23. .addGap(0400, Short.MAX_VALUE)  
  24. );  
  25. layout.setVerticalGroup(  
  26. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
  27. .addGap(0300, Short.MAX_VALUE)  
  28. );  
  29. pack();  
  30. }// </editor-fold>  
  31. /**  
  32. * @param args the command line arguments  
  33. */ 
  34. public static void main(String args[]) {  
  35. java.awt.EventQueue.invokeLater(new Runnable() {  
  36. public void run() {  
  37. new ToolbarFrame2().setVisible(true);  
  38. }  
  39. });  

 

我们获得了没有标题的ToolbarFrame2,并且已经可以响应关闭按钮。

注意,我们的ToolbarFrame2类从JFrame派生,而不是Frame。Frame是AWT的类,而JFrame是Swing提供的类。我们应该尽量使用Swing类。

private void initComponents() 方法的实现涉及到 GroupLayout类等细节,后面会逐渐介绍。关于JFrame类的文档请参考下面的链接

http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE)中,使用了类WindowConstants的公有静态整形常量,这些常量分别代表窗口关闭时的行为,具体可以参考

http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html#windowevents

我们可以通过调用JFrame的成员函数setTitle来设置标题。

添加控件

在Net Beans IDE中,我们可以使用编辑器进行可视化编辑(通过Design视图),比如添加一个JButton。向导将为我们定义如下变量:

  1. // Variables declaration - do not modify  
  2. private javax.swing.JButton jButton1;  
  3. // End of variables declaration 

并且在private void initComponents() 方法中增加下面一行:

  1. jButton1 = new javax.swing.JButton(); 

事件处理

所有的Swing类以及派生类都拥有方法public void addActionListener(ActionListener 。l)

该方法可以添加事件的监听者,当有事件发生,Swing组件就会调用这些监听者的public void actionPerformed(java.awt.event.ActionEvent evt)方法。形成事件回调。我们可以利用Net Beans为我们创建这些注册的代码。右键点击JButton,然后选择events->action->actionPerformed,Net Beans将创建私有方法actionPerformed,然后在initComponents方法中增加下面的代码:

  1. jButton1.addActionListener(new java.awt.event.ActionListener() {  
  2. public void actionPerformed(java.awt.event.ActionEvent evt) {  
  3. jButton1ActionPerformed(evt);  
  4. }  
  5. }); 

我们只需要将 我们的处理逻辑写到jButton1ActionPerformed私有方法中就可以响应事件了。

如果我们有两个JButton控件,Net Beans将为我们创建两个私有方法,并且创建两个继承自ActionListener的内部类,确保不会互相干扰。请看下面的实例代码:

  1. private void initComponents() {  
  2. jButton1 = new javax.swing.JButton();  
  3. jButton2 = new javax.swing.JButton();  
  4. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  
  5. jButton1.setText("Button1");  
  6. jButton1.addActionListener(new java.awt.event.ActionListener() {  
  7. public void actionPerformed(java.awt.event.ActionEvent evt) {  
  8. jButton1ActionPerformed(evt);  
  9. }  
  10. });  
  11. jButton2.setText("Button2");  
  12. jButton2.addActionListener(new java.awt.event.ActionListener() {  
  13. public void actionPerformed(java.awt.event.ActionEvent evt) {  
  14. jButton2ActionPerformed(evt);  
  15. }  
  16. }); 

ActionEvent对象能够提供很多的信息,请参考文档:http://java.sun.com/javase/6/docs/api/java/awt/event/ActionEvent.html

原文链接:http://yangyou230.iteye.com/blog/1307786

【编辑推荐】

  1. 用Swing制作精美的图层叠加图
  2. 简述Java图形用户界面设计(Swing)
  3. Effective Java 创建和销毁对象
  4. Java编码及网络传输中的编码问题
  5. 探讨:Java中删除数组中重复元素
责任编辑:林师授 来源: yangyou230的博客
相关推荐

2012-01-16 11:03:09

javaswing

2011-06-01 10:58:57

2009-07-09 13:44:22

Swing动态界面设计

2011-06-01 10:30:41

用户界面

2011-04-08 13:58:10

Android界面设计

2011-04-11 17:25:30

线性布局用户界面设计Android

2011-04-11 17:07:33

布局基础用户界面设计Android

2011-04-19 09:19:37

相对布局界面设计Android

2011-05-19 08:49:01

使用片段界面设计Android

2011-04-22 11:01:36

框架布局界面设计Android

2011-06-01 09:31:46

用户界面设计

2014-11-26 10:42:55

界面设计

2011-03-02 14:03:02

DashboardAndroid用户界面反例模板

2013-11-27 10:12:11

2011-03-02 10:49:42

DashboardAndroid用户界面设计模板

2014-04-03 09:49:20

设计界面设计

2011-12-20 10:42:22

Android应用界面设计

2011-06-01 16:50:05

Android ListView

2013-12-26 15:46:30

Android开发Android应用用户界面设计

2014-04-09 14:21:44

Firefox OS用户界面
点赞
收藏

51CTO技术栈公众号