精华内容
下载资源
问答
  • 展开全部java GUI一般,通过AWT,SWING 实现其余比较流行的是SWT,但是它不是官方库, 并且不能32313133353236313431303231363533e59b9ee7ad9431333339653736跨平台//注意:Swing, 所以很多不涉及界面组件的一些类比如...

    展开全部

    java   GUI一般,通过AWT,SWING 实现

    其余比较流行的是SWT,但是它不是官方库, 并且不能32313133353236313431303231363533e59b9ee7ad9431333339653736跨平台

    //注意:

    Swing, 所以很多不涉及界面组件的一些类比如布局 等Swing也可以使用

    但是组件,最好不要混用, 容易出现一些组件叠加,等显示错误 比如JButton TextField等混用

    //参考代码

    下面使用Swing组件来实现import java.awt.*;

    import java.awt.event.*;

    import javax.swing.*;

    //本类实现了ActionListener接口. 一个ActionListener可以响应JMenuItem 和JButton的动作

    //本类实现FocusListener接口,一个FocusListener可以响应JTextField,JButton等

    //JButton响应多个事件接口

    public class MyGuiFrame extends JFrame implements ActionListener, FocusListener {

    private JTextField jtf1;

    private JTextField jtf2;

    private JTextField jtf3;

    private JButton jb1;

    public MyGuiFrame() {

    // ----------窗口属性的设置----------

    setTitle("窗口应用程序");// 窗口标题

    setSize(380, 120);// 窗口大小

    setLocationRelativeTo(null);// 窗口居于屏幕中央

    setDefaultCloseOperation(EXIT_ON_CLOSE);// 点击关闭窗口后退出jvm虚拟机

    getContentPane().setLayout(new BorderLayout(5, 3));// 边界布局,水平间距5,垂直间距3

    // 菜单栏组件初始化

    initMenu();

    // 主要面板的初始化

    initPanel();

    }

    private void initPanel() {

    JPanel jp = new JPanel(new FlowLayout(FlowLayout.CENTER));// 流式布局

    jtf1 = new JTextField(8);

    jtf1.addFocusListener(this);// 添加焦点响应

    JLabel jl = new JLabel("+");

    jtf2 = new JTextField(8);

    jtf2.addFocusListener(this);

    jb1 = new JButton("=");

    jb1.addActionListener(this);// 添加动作响应

    jb1.addFocusListener(this);// 添加焦点响应

    jtf3 = new JTextField(8);

    jtf3.setEditable(false);

    jp.add(jtf1);

    jp.add(jl);

    jp.add(jtf2);

    jp.add(jb1);

    jp.add(jtf3);

    getContentPane().add(jp, BorderLayout.CENTER);

    }

    private void initMenu() {// 菜单栏的初始化和 设置

    JMenuBar jmb = new JMenuBar();

    JMenu jm1 = new JMenu("系统");

    JMenuItem jmi101 = new JMenuItem("退出");

    jmi101.addActionListener(this);// 添加动作响应

    JMenu jm2 = new JMenu("帮助");

    JMenuItem jmi201 = new JMenuItem("功能说明");

    jmi201.addActionListener(this);

    jm1.add(jmi101);

    jm2.add(jmi201);

    jmb.add(jm1);

    jmb.add(jm2);

    setJMenuBar(jmb);//设置菜单栏

    }

    // main方法, 创建对象窗口, 并且设置可见

    public static void main(String[] args) {

    new MyGuiFrame().setVisible(true);

    }

    // 动作响应处理

    public void actionPerformed(ActionEvent e) {

    String cmd = e.getActionCommand();//根据命令来区分不同的操作

    if (cmd.equals("退出")) {

    System.exit(0);

    }

    if (cmd.equals("功能说明")) {

    JOptionPane.showMessageDialog(this, "加法");

    }

    if (cmd.equals("=")) {

    String s1 = jtf1.getText().trim();

    String s2 = jtf2.getText().trim();

    if(s1.equals("")){

    s1="0";

    }

    if(s2.equals("")){

    s2="0";

    }

    double num1 = Double.parseDouble(s1);//从字符串转小数

    double num2 = Double.parseDouble(s2);

    jtf3.setText((num1 + num2) + "");// 数字类型转字符串类型

    }

    }

    // 焦点响应处理

    public void focusGained(FocusEvent e) {//获得焦点

    JComponent cmp = (JComponent) e.getComponent();//根据事件来源组件来区分不同的操作

    if (cmp == jtf1 || cmp == jtf2) {

    cmp.setBorder(BorderFactory.createLineBorder(Color.BLUE));// 设置边框

    }

    if (cmp == jb1) {

    jb1.setForeground(Color.RED);//设置文字颜色

    }

    }

    public void focusLost(FocusEvent e) {//失去焦点

    JComponent cmp = (JComponent) e.getComponent();

    if (cmp == jtf1 || cmp == jtf2) {

    cmp.setBorder(BorderFactory.createLineBorder(Color.GRAY));

    }

    if (cmp == jb1) {

    jb1.setForeground(Color.BLACK);

    }

    }

    }

    运行效果如图

    31dc95ccf255802f5d5ccf283c7a92ca.png

    3ef09ea6b705ff37abbb1975488e3897.png

    2386f88d354b414b178ad0191d29debd.png

    6bb6a12d4809ca354da7d3624699d45d.png

    展开全文
  • 前言当前,Python 已经成为最流行的程序设计语言之一,被越来越多的人作为首选语言来学习和应用。作为一种解释型的语言,Python具有内置的高级数据结构和简单有效的面向对象编程机制。同时,其语法简洁而清晰,类库...

    前言
    当前,Python 已经成为最流行的程序设计语言之一,被越来越多的人作为首选语言来学习和应用。作为一种解释型的语言,Python具有内置的高级数据结构和简单有效的面向对象编程机制。同时,其语法简洁而清晰,类库丰富而强大,非常适合进行快速原型开发。另外,Python 可以运行在多种系统平台下,从而使得只需要编写-次代码,就可以在多种系统平台下实现同等的功能。
    与相同类型的Perl语言相比,年轻的Python语言的优势非常突出。随着各大公司支持力度的增大,其应用领域越来越广。现在,围绕着Python的相关技术包括Web开发和图形界面开发等都在飞速发展,相关的资源也越来越丰富。
    为了使广大读者既能了解Python语言的基础知识,又能将Python语言应用于一些特定领域(如Web开发),本篇全面地介绍了用Python语言进行程序开发的相关知识。在学习完本篇之后,相信读者能够掌握Python语言,并可以使用Python语言进行实际项目的开发。

    b3e9c4e4899413017023f14a2c71a41e.png


    本书的内容本篇共分为四大部分,共27章的内容,由于篇幅限制,所以只展示了部分知识点,每个小节都有更加细化的内容,各章的主要内容如下。第一部分Python语言基础知识
    第1章:本章从Pytbon 能做什么讲起,介绍了Pyhon的特征和优势,Python 的发展历史及其特点、开发环境的搭建、Pybon的开发工具等基础知识,读者如果是一个Pybon新手,本章将把读者带入Python世界。
    第2章:详细介绍了Python的语法知识,深入讲解了Python的编码规则、变量和常量的定义及其使用方法、数据类型、运算符和表达式。通过本章的学习,读者能掌握Pyton编码的一些规范和Python的语法知识。
    第3章:详细介绍了Pyhon中的控制语句、循环语句以及一些习惯用法,结合实例讲解了Python进行结构化编程的要点。
    第4章:主要介绍了Pybon的内置数据结构一元组、 列表、字典和序列。分别介绍了这些内置数据结构的特点、区别及其使用方法。
    第5章:讲解了Pyhon中模块和函数的概念。重点介绍了Pyton的常用内置模块、函数的参数、递归函数、lambda函数、generator 函数等。
    第6章:重点介绍了Pyhon中字符串的处理,包括字符串的格式化、 比较、合并、截取、查找、替换等。讲解了正则表达式的概念以及使用te 模块处理正则表达式的方法。
    第7章:主要介绍了Python对文件的基本操作,包括文件的创建、读写、删除、复制、查找、替换和比较。重点介绍了Pyhlon对目录遍历的实现方法以及Python的流对象。
    第8章:主要介绍了面向对象程序设计的要点,重点讲解了Pybon实现面向对象的特性以及Python中的设计模式。
    第9章: 详细介绍了Pytho对异常的处理、异常的捕获和抛出、自定义异常等内容。讲解了使用PythonWin、Eelipse 调试Python程序的方法。
    第10章:介绍了Pytho的数据库编程,重点讲解了使用ODBC、DAO、ADO、Pyton等专用模块连接数据库以及Pybon的持久化。最后结合SsQu ite数据库的实例讲解了Python 对数据库的操作。

    5bf4a99d6bbdcd64dd2228dd490a0729.png

    第二部分Python的GUI程序设计
    第11章:介绍Python下的Gu开发。主要介绍了当前Pyhon中使用比较多的ThinterPyGTK和PyQr等GuI开发库。然后对WwxPythonGU开发库及其开发环境进行了介绍,包括其封装以及界面设计工具等。
    第12章:介绍了WxPython的基本运行机制,包括程序的组成和事件驱动模型原理及其使用方法。同时,对WxPython中的基本组件进行了介绍。

    dbbd508f78427c44c2076fbccc7e330c.png


    第13章:讲解了WxPython的基本组件,包括文本框、按钮、单选框、多选框、下拉列表和布局管理器等控件的基本属性、方法和事件。
    第14章:介绍了WxPyhon菜单与窗口组件。包括多级菜单、位图菜单、上下文菜单的创建,Frame窗口、MDI窗口、HTML窗口的创建等内容。重点讲解了对话框的应用以及对话框和窗口的交互。
    第15章:介绍了WxPyhon库中的高级控件,包括常见的表格、列表、树型和定时器控件。重点讲解了这些控件的样式、事件及应用场合。
    第16章:介绍了WwxPython 框架的高级功能,包括HTML显示、XRC的使用方法和系统剪贴板的操作。

    1a415ebbe946c99d2973b5863caa9d71.png

    第三部分Python的Web开发
    第17章:介绍了Pyhon的HTML应用。详细介绍了URL的解析以及HTML资源的获取方法,同时对CGI的使用和HTML文档的解析方法进行了介绍。
    第18章:讲解了Pybon的XML操作。包括XML的各种内容实体如节点等,并对XML文档的SAX和DOM这两种处理方式进行了详细地讲解。
    第19章: Pybon 的Web开发是近年来发展迅速的一个领域。在本章中对Pybon中常用的Web开发框架进行了介绍。同时在介绍MVC模式的基础上,对Djago框架进行了详细地讲解,包括其基本使用和高级使用方法。
    第20章:介绍了Python中的测试框架。主要讲解Pyton中的uitet和doctest这两种测试框架,且都有相应的实例,以帮助读者快速掌握。

    6027b72180bef2e8444476b384a4642d.png

    第四部分Python 的其他应用
    第21章:介绍了Python下进程和线程的概念。主要内容包括进程和线程的创建和管理等。同时,着重讲解了多线程环境下的数据同步机制。
    第22章:介绍了Pyhon的系统管理。其中主要讲解IPython 的应用。内容不仅包括IPython的介绍,还包括常见的系统管理应用。

    7f5aaad058d67747147f2dceb88ca461.png


    第23章:讲解了Python中和网络编程相关的知识,包括服务器端和客户端的通信。随后着重介绍了网络中的异步通信方式,最后对Twisted框架进行了介绍。
    第24章:讲解了Pyton开发中常见的网络应用。主要包括文件传输、邮件的接收和发送、远程登录以及简单网络管理功能的实现。最后还对使用Scapy分析网络数据进行了介绍。
    第25章:讲解了Pyhon图像处理和游戏编程。主要涉及PL和PyGame这两个包。通过各种实例,使读者能够迅速地掌握相关知识并用于实践。
    第26章:介绍了Python语言的扩展和嵌人应用。这两种技术使得Pyhon语言有了更进一步的发展空间。
    第27章:在本章中对Windows下的Pyhon进行了介绍。主要介绍了组件对象模型和Python对其支持。同时,使用实例讲解了Windows下的各种Python应用。

    5bf01fa3b9f61362cbb322c2a626277b.png

    由于文章内容过多,小编在这里就不多做过多的介绍了,需要领取【Python开发技术详解】技术文档的小伙伴,可以转发此文关注小编,私信小编“学习”来得到获取方式了哦~~~~~
    深入解析Python语言,透析应用开发的方方面面,涵盖9大应用领域的各类Python框架
    本篇特色
    详细讲解Python语言的基本要点和基础类库
    内容覆盖GUI、数据库、Web、 系统管理、网络编程、图像处理、游戏开发等领域
    深入讲解常用开发框架Django、PyWin32、PyGame、 Twisted等框架工具包
    通过丰富的典型应用实例,引领读者迅速掌握实用技术

    展开全文
  • 教育网用户可用搜狗浏览器登录 Bottle,极轻量web框架 自带服务器,无需第三方模块支持...而且是最流行的符合WSGI接口的框架。 在我的计划中,将用它为我的本地应用制作GUI界面。 Helloworld from bot...

    官网地址:http://bottlepy.org

    教育网用户可用搜狗浏览器登录

    Bottle,极轻量web框架

    自带服务器,无需第三方模块支持

    单文件,180KB。

    顺手写了一个HelloWorld,运行内存只占5MB。启动速度很快。

    而且是最流行的符合WSGI接口的框架。

    在我的计划中,将用它为我的本地应用制作GUI界面。

    Helloworld

    from bottle import route, run
    
    @route('/:name')
    def index(name='World'):
        return '<b>Hello %s!</b>' % name
    
    run(host='localhost', port=8080)
    

      

    转载于:https://www.cnblogs.com/bitspace/archive/2011/09/18/2180454.html

    展开全文
  • Java™ 图形用户界面 (GUI) ...本文将说明什么是数据绑定框架,介绍几种流行的 Java GUI 数据绑定框架,并将分析使用数据绑定的优缺点。很多流行的 Web 应用程序都有视图层的特性,视图层足够智能可以将请求和应答变量
     
    
    Java™ 图形用户界面 (GUI) 应用程序的大量开发时间都用于将域对象的数据简单地移入 GUI 组件,然后再从 GUI 组件返回给域对象。近年来,几种数据绑定框架走在了自动同步数据过程研究的最前沿。本文将说明什么是数据绑定框架,介绍几种流行的 Java GUI 数据绑定框架,并将分析使用数据绑定的优缺点。

    很多流行的 Web 应用程序都有视图层的特性,视图层足够智能可以将请求和应答变量与 HTML 输入标记同步。此过程可以轻松地完成,因为用户输入是通过 Web 应用程序的结构层和 HTTP 来路由的。而另一方面,Java GUI 应用程序经常都不能支持这种特性。无论是用 Standard Widget Toolkit (SWT) 编写还是用 Swing 编写,这些 Java GUI 应用程序的域对象与其 GUI 控件 (通常也称为 组件) 之间通常都没有定义好的路径。

    样本(boilerplate)数据同步

    打乱顺序最糟糕的结果是造成数据混乱,最幸运的结果是大块样本同步代码出现 bug。参考 清单 1 中的代码引用。这是一个称为 FormBean 的简单的域对象的定义。当一个对话框需要使用此数据时,对话框必须从域对象中提取此数据并将数据插入组件才能显示,如位于构建程序的末尾的方法调用中所示。相应地,在用户更改信息后,必须将此数据从 GUI 组件中提取出来并放回域模型中。这种往复过程是通过 syncBeanToComponents()syncComponentsToBean() 方法来执行的。最后,请注意对 GUI 组件的引用在对象范围内必须保持可用,这样才能在同步方法中访问这些组件。


    清单 1. 没有数据绑定的 Swing 对话框
    package com.nfjs.examples;
    import com.jgoodies.forms.layout.FormLayout;
    import com.jgoodies.forms.layout.CellConstraints;
    import com.jgoodies.forms.builder.DefaultFormBuilder;
    
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    
    public class NoBindingExample {
    
        private JFrame frame;
        private JTextField firstField;
        private JTextField lastField;
        private JTextArea descriptionArea;
        private FormBean bean;
    
        public NoBindingExample() {
            frame = new JFrame();
    
            firstField = new JTextField();
            lastField = new JTextField();
            descriptionArea = new JTextArea(6, 6);
    
            DefaultFormBuilder builder = 
            	new DefaultFormBuilder(new FormLayout("r:p, 2dlu, f:p:g"));
            builder.setDefaultDialogBorder();
            builder.append("First:", firstField);
            builder.append("Last:", lastField);
            builder.appendRelatedComponentsGapRow();
            builder.appendRow("p");
            builder.add(new JLabel("Description:"),
                        new CellConstraints(1, 
                        	5, CellConstraints.RIGHT, 
                        	CellConstraints.TOP),
                        new JScrollPane(descriptionArea),
                        new CellConstraints(3, 
                        	5, CellConstraints.FILL, 
                        	CellConstraints.FILL));
    
            builder.nextRow(2);
            builder.append(new JButton(new MessageAction()));
    
            frame.add(builder.getPanel());
            frame.setSize(300, 300);
    
            bean = new FormBean();
            syncBeanToComponents();
        }
    
        private void syncBeanToComponents() {
            firstField.setText(bean.getFirst());
            lastField.setText(bean.getLast());
            descriptionArea.setText(bean.getDescription());
        }
    
        private void syncComponentsToBean() {
            bean.setFirst(firstField.getText());
            bean.setLast(lastField.getText());
            bean.setDescription(descriptionArea.getText());
        }
    
        public JFrame getFrame() {
            return frame;
        }
    
        private class FormBean {
            private String first;
            private String last;
            private String description;
    
            public FormBean() {
                this.first = "Scott";
                this.last = "Delap";
                this.description = "Description";
            }
    
            public String getFirst() {
                return first;
            }
    
            public void setFirst(String first) {
                this.first = first;
            }
    
            public String getLast() {
                return last;
            }
    
            public void setLast(String last) {
                this.last = last;
            }
    
            public String getDescription() {
                return description;
            }
    
            public void setDescription(String description) {
                this.description = description;
            }
        }
    
        private class MessageAction extends AbstractAction {
            public MessageAction() {
                super("Message");
            }
    
            public void actionPerformed(ActionEvent e) {
                syncComponentsToBean();
                JOptionPane.showMessageDialog(null, "First name is " + bean.getFirst());
            }
        }
    
        public static void main(String[] args) {
            NoBindingExample example = new NoBindingExample();
            example.getFrame().show();
        }
    }
    

    救援的数据绑定



    回页首


    此示例只是一个简单示例,如果要计算构建程序中的组件引用指定,还需要有另外 10 行代码。如果向 Bean 中添加新字段,则需要添加另外三行代码进行初始化以及在 GUI 组件和域模型实现双向同步。重复编写这段代码是十分令人厌烦的,经常会导致将错误引入应用程序中。幸运的是,有更好的解决方案可用。

    数据绑定框架使开发人员可以轻松地将 JavaBean 属性与 GUI 组件 “粘” 在一起。JavaBean 属性通常被一个字符串引用,该字符串用于告诉数据绑定框架在 JavaBean 上查找相应的 getter 和 setter。例如,"first" 表示在给定 JavaBean 上有 getFirst()setFirst() 方法。组件将被数据自动初始化。当组件中的值发生改变时,关联的 JavaBean 属性也会随之改变。同样地,JavaBean 支持属性更改侦听程序,因此当 GUI 组件的相应 JavaBean 属性发生改变时,也可以更新 GUI 组件。

    还可以配置流行的 Java 数据绑定框架何时同步更改 (通常在按下按键时、单击鼠标时或光标丢失时)。这些数据绑定框架还支持各种 GUI 组件,例如文本字段、复选框、列表和表。

    清单 2 显示了重新编写 清单 1 中的代码引用以使用 JGoodies 数据绑定框架。


    清单 2. 使用 JGoodies 数据绑定的同一个 Swing 对话框
    package com.nfjs.examples;
    import com.jgoodies.forms.layout.FormLayout;
    import com.jgoodies.forms.layout.CellConstraints;
    import com.jgoodies.forms.builder.DefaultFormBuilder;
    import com.jgoodies.binding.beans.BeanAdapter;
    import com.jgoodies.binding.adapter.BasicComponentFactory;
    
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    
    public class BindingExample {
    
        private JFrame frame;
        private FormBean bean;
    
        public BindingExample() {
            frame = new JFrame();
    
            bean = new FormBean();
    
            BeanAdapter adapter = new BeanAdapter(bean);
    
    
            JTextField firstField = BasicComponentFactory.createTextField(
            				adapter.getValueModel("first"));
            JTextField lastField = BasicComponentFactory.createTextField(
            				adapter.getValueModel("last"));
            JTextArea descriptionArea = BasicComponentFactory.createTextArea(
            				adapter.getValueModel("description"));
            DefaultFormBuilder builder = 
            	new DefaultFormBuilder(new FormLayout("r:p, 2dlu, f:p:g"));
            builder.append("First:", firstField);
            builder.append("Last:", lastField);
            builder.appendRelatedComponentsGapRow();
            builder.appendRow("p");
            builder.add(new JLabel("Description:"),
                        new CellConstraints(1, 5, 
                        	CellConstraints.RIGHT, 
                        	CellConstraints.TOP),
                        new JScrollPane(descriptionArea),
                        new CellConstraints(3, 5, 
                        	CellConstraints.FILL, 
                        	CellConstraints.FILL));
            builder.nextRow(2);
    
            builder.append(new JButton(new MessageAction()));
    
            frame.add(builder.getPanel());
            frame.setSize(300, 300);
        }
    
        public JFrame getFrame() {
            return frame;
        }
    
        public class FormBean {
    
    
    	//Same as above
    	
        }
    
        private class MessageAction extends AbstractAction {
            public MessageAction() {
                super("Message");
            }
    
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "First name is " + bean.getFirst());
            }
        }
    
        public static void main(String[] args) {
            BindingExample example = new BindingExample();
            example.getFrame().show();
        }
    }
    

    我会在后面介绍详细的实现方法。现在,请注意那些在与第一个示例对比时所没有的内容

    • 没必要仅因为要同步而公开对组件的引用。这些引用不会被传播到构建程序范围之外。
    • 未提供任何一种同步方法。
    • 构建程序中没有初始同步过程用于填充组件。
    • 显示对话框之前没有同步操作。

    不管所有这些条目现在都已丢失的事实,此示例将完全执行与第一个示例相同的操作。





    回页首


    JGoodies 数据绑定实现细节

    介绍整个 JGoodies 数据绑定框架不在本文讨论范围内。但是,看一看 清单 2 所示的示例的实现细节十分有用。下面的两行揭示了所有奥秘:

    BeanAdapter adapter = new BeanAdapter(bean);

    JTextField firstField = BasicComponentFactory.createTextField(adapter.getValueModel("first"));

    第一行用于创建一个 JGoodies 对象,名为 BeanAdapter,该对象用于创建值模型对象。值模型用于定义一种一般方法来访问 JavaBean 属性,而无需知道该属性名称的详细信息。清单 3 显示了 ValueModel 接口定义。


    清单 3. ValueModel 接口
    public interface ValueModel {
        java.lang.Object getValue();
    
        void setValue(java.lang.Object object);
    
        void addValueChangeListener(PropertyChangeListener propertyChangeListener);
    
        void removeValueChangeListener(PropertyChangeListener propertyChangeListener);
    }
    

    BasicComponentFactory 类含有创建 Swing 组件的方法,这些组件将与提供的 ValueModel 绑定在一起。第二行将使用 BasicComponentFactory 来创建一个 JTextField。在这种情况下,JTextField 将与 FormBean"first" 属性绑定在一起。JGoodies 数据绑定 API 将执行用来源于 FormBean 的数据对文本字段进行初始化操作的其余过程,它还将在文本字段中所作的所有更改都同步回 FormBean 中。





    回页首


    从域对象获取值导入模型中

    整个同步执行过程仍可能好像是在变魔术一样虚幻。但是,事实并不如此。几乎所有流行的 GUI 组件的背后都有一个模型。数据绑定框架的任务是获取存储在域对象中的值再导入模型中。框架采用两种方法来执行这项任务。

    调整 Bean 字段

    一种方法是调整被绑定的 Bean 字段变为组件模型本身。使用这种方法,当组件的视图部分尝试检索或修改值时,它可直接转到 Bean 中的值。JGoodies 数据绑定框架在很多情况下都使用了这种方法。

    图 1 显示了 JGoodies 怎样使用 DocumentAdapterPropertyAdapter 类来装饰 Bean 以将其用于 JTextComponent 的模型。


    图 1. JGoodies 调整字段用于 JTextComponent 模型
    JGoodies 调整字段用于 JTextComponent 模型

    自动调用 getter 和 setter

    将模型与 GUI 值同步的另一种方法是当一个值在另一端发生改变时自动调用关系两端的 getter 和 setter。JFace 数据绑定框架使用了这种技术以与 SWT 结合使用。

    清单 4 显示了与前述相同的示例用 SWT 和 JFace 数据绑定重写后的结果。这个框架充当的是将字段联系在一起的上下文对象。请注意,这里使用了三个 context.bind() 方法调用,用于将文本控件与 FormBean 字段关联起来。


    清单 4. 使用 JFace 数据绑定的同一个 Swing 对话框
    import org.eclipse.jface.examples.databinding.nestedselection.BindingFactory;
    import org.eclipse.jface.internal.databinding.provisional.DataBindingContext;
    import org.eclipse.jface.internal.databinding.provisional.description.Property;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.MessageBox;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
    
    public class JFaceBindingExample {
    
        private Shell shell;
        private FormBean bean;
    
        public void run() {
        	Display display = new Display();
        	shell = new Shell(display);
    
        	GridLayout gridLayout = new GridLayout();
        	gridLayout.numColumns = 2;
        	shell.setLayout(gridLayout);
    
        	bean = new FormBean();
    
    
        	
        	DataBindingContext context = BindingFactory.createContext(shell);
        	
        	Label label = new Label(shell, SWT.SHELL_TRIM);
        	label.setText("First:");
        	
        	GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        	Text text = new Text(shell, SWT.BORDER);
        	text.setLayoutData(gridData);
        	context.bind(text, new Property(bean, "first"), null);
        	
        	label = new Label(shell, SWT.NONE);
        	label.setText("Last:");
        	text = new Text(shell, SWT.BORDER);
        	context.bind(text, new Property(bean, "last"), null);
    
        	gridData = new GridData();
        	gridData.horizontalAlignment = SWT.CENTER;
        	gridData.horizontalSpan = 2;
        	Button button = new Button(shell, SWT.PUSH);
        	button.setLayoutData(gridData);
        	button.setText("Message");
        	button.addSelectionListener(new SelectionAdapter() {
        		
        		public void widgetSelected(SelectionEvent e) {
                    MessageBox messageBox = new MessageBox(shell);
                    messageBox.setMessage("First name is " + bean.getFirst());
                    messageBox.open();
        		}
    
        	});
    
    		shell.pack();
    		shell.open();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    		display.dispose();
        }
    
        public static void main(String[] args) {
            JFaceBindingExample example = new JFaceBindingExample();
            example.run();
        }
    }
    





    回页首


    与 Swing 进行数据绑定

    现在有大量优秀的数据绑定框架可以与 Java GUI API 结合使用。下面是为与 Swing 应用程序结合使用创造出来的主要开源 API。

    JGoodies 数据绑定 API

    流行的 JGoodies 数据绑定 API 几年前就以 Java.net 上的开源项目的形式出现了。它是由 Karsten Lentzsch 编写的,他还是流行的 JGoodies FormLayout 的作者。此框架存在的历史最久,已经经过多次修改和 bug 修正以使其用于产品用途时更加稳定。

    Spring RCP

    Spring Rich Client Platform (RCP) 项目 —— 流行的 Spring Application Framework 的子项目 —— 还包含一个 Swing 数据绑定框架。Spring RCP 和 JGoodies 都受到了 VisualWorks Smalltalk 中的数据绑定设计的影响。Spring RCP 还没有完成 V1.0 发布。这说明,代码库的数据绑定部分十分稳定并且被很多开发人员使用着。

    SwingLabs

    Java.net 中的 SwingLabs 项目已经开展了多年的 Swing 数据绑定框架开发工作。不过,在此项目中取得的成果最近被转到了一个由 Sun Microsystems 发起的新数据绑定 Java Specification Request (JSR) 上。

    JSR 295:Bean 绑定

    这是最近创建的 JSR 项目,由 Sun 的 Scott Violet 及专家组成员 Ben Galbraith 和 Karsten Lentzsch 共同领导,这个项目旨在为在桌面环境和服务器环境中使用的数据绑定提供标准的 API。JSR 295 尚处于开发阶段,因此它不适于现在就需要这类解决方案的开发人员。





    回页首


    与 SWT 进行数据绑定

    有两个主要的开源数据绑定 API 用于与 SWT 结合使用。

    SWTBinding

    Jaysoft 接入了流行的 JGoodies 数据绑定 API 用于与 SWT 结合使用。核心类几乎同 JGoodies 一样。特定于 Swing 的模型则被适用于 SWT 控件的模型所替代。

    JFace 数据绑定

    最近出现的另一个 Java 数据绑定新成员是 JFace 数据绑定框架。Eclipse V3.2 发布版中附带了该 API 的临时版本。不同于 SWTBinding/JGoodies 框架,JFace 数据绑定是从头开始构建的,专门与 SWT 和 JFace 结合使用。





    回页首


    数据绑定的优点

    除了解决同步问题之外,在应用程序中使用数据绑定框架还有其他优点。由于是重复使用同一段同步代码,而不是创建自己的同步代码,因此出现的错误会少一些。另一个主要的优点是获得应用程序可测试性。

    流行的 Presentation Model (请参阅 参考资料) 提倡将应用程序的状态与业务逻辑分开放入模型层中,而模型层是从视图的 GUI 控件中分离出来的。模型的状态频繁与视图同步,如图 2 所示。


    图 2. 使用 Presentation Model 的关系
    使用 Presentation Model 的关系

    这类设计允许测试应用程序的所有业务逻辑而无需将视图实例化。例如,当总数大于 100 时启用表中的某些控件,有一个 "if total > 100" 的启用条件,还有一个基于此条件评估的相关状态。

    使用 Presentation Model 模式,此状态被设在 Presentation Model 的变量中,并与视图同步以修改控件的启用。正因为这样,才能够测试逻辑而无需访问视图中的 GUI 组件。

    用 SWT 和 Swing 通常很难访问 GUI 组件并模拟(mock)这些组件。针对 Presentation Model 运行所有测试,因为 Presentation Model 包含有条件的逻辑和一个储存随执行而更改的状态的空间。整个模式的一个难点是何时或怎样在 Presentation Model 和视图之间来回同步数据。在数据绑定前,解决这个问题很难。现在,这个问题就像在 Presentation Model 中将控件绑定到字段上或关联的域对象上一样容易。





    回页首


    数据绑定的缺点

    在应用程序中使用数据绑定框架有一些缺点。首先,应用程序更难调试,因为附加的绑定层使追踪控件与域对象之间的数据流变得更难。不过,当熟悉了所使用框架的实现规范后,调试过程会变得更容易。

    由于使用字符串表示属性,因此应用程序在重构期间很可能变得更脆弱。考虑一下清单 5 中的代码引用。字符串 "first" 用于通知 JFace 数据绑定框架绑定到 getFirst() / setFirst() 属性上。将 getFirst()setFirst() 重构为 getFirstName()setFirstName() 需要将字符串更改为 "firstName"。目前的 IDE 重构工具不会捕捉这种变化。


    清单 5. 区域重构不捕捉
    context.bind(text, new Property(bean, "first"), null);
    
    . . . 
    
    private class FormBean {
            private String first;
    
    	  ...
    
            public FormBean() {
                this.first = "Scott";
                this.last = "Delap";
                this.description = "Description";
            }
    
            public String getFirst() {
                return first;
            }
    
            public void setFirst(String first) {
                this.first = first;
            }
    	  
      . . .
    }
    





    回页首


    结束语

    无论是否在 SWT 或 Swing 中进行开发,在项目中使用数据绑定框架好处很多。没有人喜欢编写或维护样本 GUI 至域模型同步代码。我希望这篇入门级文章已经向您展示了 Java 数据绑定框架是如何能够让您从这些工作中解脱出来的。附带的好处是这些数据绑定框架在与适当的 GUI 设计模式结合使用时能够提高可测试性。



    参考资料

    学习

    获得产品和技术

    讨论


    关于作者

    Scott Delap 是专注于 Java EE 和富 Java 客户机的独立顾问。他在 JavaOne 发表过论文并积极活跃于桌面 Java 社区。他还是 ClientJava.com 的管理员,该网站是关于桌面 Java 开发的门户网站。ClientJava.com 频繁出现于 Web 上,从 JavaBlogs 一直到 Sun Microsystems 的网站。

    展开全文
  • Qt/Qte/Qtopia三者区别

    2020-03-18 16:20:05
    Qt/Qte/Qtopia三者的区别 Qt 泛指 Qt software的所有版本的图像界面库,包括 Qt/X11(Unix/Linux),Qt Windows, Qt Mac 等,但这只是相...Unix/Linux上最流行的桌面环境之一KDE就是采用Qt来写的。 Nokia 在2008年收购...
  • Qt、Qte、Qtopia三者区别

    千次阅读 2019-02-18 08:57:09
    Qt、Qte、Qtopia三者的区别 Qt 泛指 Qt software的所有版本的图像界面库,包括 Qt/X11(Unix/Linux)、Qt Windows...Unix/Linux上最流行的桌面环境之一KDE就是采用Qt来写的。 Nokia 在2008年收购 Trolltech 后,将...
  • qt、qte、qtopia区别

    2014-06-20 15:57:03
    Qt 泛指 Qt software的所有版本的图像界面库,包括 Qt/X11(Unix/Linux),Qt Windows, Qt Mac 等...Unix/Linux上最流行的桌面环境之一KDE就是采用Qt来写的。 Nokia 在2008年收购 Trolltech 后,将 Qt 更名为 Qt So
  • Qt 泛指 Qt software的所有版本的图像界面库,包括 Qt/X11(Unix/Linux),Qt Windows, Qt ...Unix/Linux上最流行的桌面环境之一KDE就是采用Qt来写的。 Nokia 在2008年收购 Trolltech 后,将 Qt 更名为 Qt Software...
  • Qt开发之路1---Qt概述

    2020-06-23 16:23:19
    一. 什么是Qt Qt 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序...1996年 进入商业领域,它也是目前流行的Linux桌面环境KDE的基础; 2008年 Nokia从Trolltech公司收购Qt,并增加LGPL的授权模式,Qt称
  • awesome-python 是 vinta 发起维护 Python 资源列表,内容包括:Web 框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。由「开源前哨...
  • Qt :跨平台应用程序和用户界面框架。 Reason :跨平台框架,使开发者能够更容易地使用Java,.Net和Python,同时也满足了他们对C++性能和优势需求。 ROOT :具备所有功能一系列面向对象框架,能够非常...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • Java资源包01

    2016-08-31 09:16:25
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包101

    2016-07-13 10:11:08
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包2

    热门讨论 2013-06-28 09:17:39
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包3

    热门讨论 2013-06-28 09:20:52
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包6

    热门讨论 2013-06-28 09:48:32
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包5

    热门讨论 2013-06-28 09:38:46
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包10

    热门讨论 2013-06-28 10:06:40
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包4

    热门讨论 2013-06-28 09:26:54
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包8

    热门讨论 2013-06-28 09:55:26
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包9

    热门讨论 2013-06-28 09:58:55
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • java开源包7

    热门讨论 2013-06-28 09:52:16
    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Tcp服务端与客户端JAVA实例源代码,一个简单Java TCP服务器端程序,别外还有一个客户端程序,两者互相配合可以开发出超多网络程序,这是基础部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

最流行的gui界面框架