First they ignore you
then they ridicule you
then they fight you
then you win
    -- Mahatma Gandhi
Chinese => English     英文 => 中文             
随笔-219  评论-1047  文章-0  trackbacks-0
最近一直很忙,为了放松放松,自己就用Groovy写了个计算器玩玩,顺便也给还不太了解Groovy中SwingBuilder的朋友展示一下SwingBuilder的用法。

注意:请使用最新版本的Groovy,否则显示有问题


运行结果:



/*
 * Copyright 2007 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      
http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 
*/

package  edu.ecust.swing

import  groovy.swing. *
import  javax.swing. *
import  java.awt. *

/**
 * Groovy Calculator for studying SwingBuilder
 * 
 * 
@author  Daniel Sun(realbluesun@hotmail.com)
 *
 * 
@since  0.1
 
*/

class  GroovyCalculator {
    def swing 
=   new  SwingBuilder()
    JFrame frame
    def toolkit 
=  Toolkit.getDefaultToolkit()
    def screenSize 
=  toolkit.getScreenSize()
    
    
    def WIDTH 
=   320
    def HEIGHT 
=   200
    
int  X  =  (screenSize.width  -  WIDTH)  /   2
    
int  Y  =  (screenSize.height  -  HEIGHT)  /   2
    
    
boolean  flag  =   false
    
    
private   void  run() {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
        frame 
=  swing.frame(title:  ' Demo ' ,
                            size: [WIDTH, HEIGHT],
                            location: [X, Y],
                            defaultCloseOperation: javax.swing.WindowConstants.DISPOSE_ON_CLOSE) {
            

            
            panel(layout: 
new  BorderLayout()) {
                textField(id: 
" expr " , constraints: BorderLayout.NORTH)
                
                panel(constraints: BorderLayout.CENTER) {
                    tableLayout {
                        tr {
                            td {
                                button(text:
" 7 " ) {
                                    action(getAction(
" 7 " ))
                                }
                            }
                            td {
                                button(text:
" 8 " ) {
                                    action(getAction(
" 8 " ))
                                }
                            }
                            td {
                                button(text:
" 9 " ) {
                                    action(getAction(
" 9 " ))
                                }
                            }
                            td {
                                button(text:
" / " ) {
                                    action(getAction(
" / " ))
                                }
                            }
                        }
                        tr {
                            td {
                                button(text:
" 4 " ) {
                                    action(getAction(
" 4 " ))
                                }
                            }
                            td {
                                button(text:
" 5 " ) {
                                    action(getAction(
" 5 " ))
                                }
                            }
                            td {
                                button(text:
" 6 " ) {
                                    action(getAction(
" 6 " ))
                                }
                            }
                            td {
                                button(text:
" * " ) {
                                    action(getAction(
" * " ))
                                }
                            }
                        }
                        tr {
                            td {
                                button(text:
" 1 " ) {
                                    action(getAction(
" 1 " ))
                                }
                            }
                            td {
                                button(text:
" 2 " ) {
                                    action(getAction(
" 2 " ))
                                }
                            }
                            td {
                                button(text:
" 3 " ) {
                                    action(getAction(
" 3 " ))
                                }
                            }
                            td {
                                button(text:
" - " ) {
                                    action(getAction(
" - " ))
                                }
                            }
                        }
                        tr {
                            td {
                                button(text:
" 0 " ) {
                                    action(getAction(
" 0 " ))
                                }
                            }
                            td {
                                button(text:
" = " ) {
                                    action(name:
" = " , closure:  this . & eval)
                                }
                            }
                            td {
                                button(text:
" C " ) {
                                    action(name:
" C " , closure:  this . & clear)
                                }
                            }
                            td {
                                button(text:
" + " ) {
                                    action(getAction(
" + " ))
                                }
                            }
                        }
                    }
                }
            }
        }
        
        swing.expr.setEditable(
false )
        swing.expr.setHorizontalAlignment(JTextField.RIGHT)
        swing.expr.setBackground(Color.WHITE)
        
        frame.pack()
        frame.setResizable(
false )
        frame.setVisible(
true )
    }
    
    
private   void  append(EventObject evt  =   null ) {
        
if  (flag) {
            swing.expr.text 
=   ""
            flag 
=   false
        }
        
        String name 
=  evt.source.text
        swing.expr.text 
<<=  name
        swing.expr.text 
=  swing.expr.text.replaceAll( " // " " / " )
    }
    
    
private   void  clear(EventObject evt  =   null ) {
        swing.expr.text 
=   ""
    }
    
    
private   void  eval(EventObject evt  =   null ) {
        String expr 
=  swing.expr.text
        
        def b
=   new  Binding()
        def conf
= new  org.codehaus.groovy.control.CompilerConfiguration()
        conf.setSourceEncoding(
' unicode ' )
        def groovyShell 
=   new  GroovyShell(b,conf)
        
        
try  {
            swing.expr.text 
=  groovyShell.evaluate(expr)
        } 
catch  (Throwable t) {
            swing.expr.text 
=   " invalid expression! "
            flag 
=   true
        }
        
    }
    
    def getAction(name) {
        
return  swing.action(name:name, closure:  this . & append)
    }
    
    
static   void  main(args) {
        
new  GroovyCalculator().run()
    }

}


附:朝花夕拾——Groovy & Grails
posted on 2007-08-05 20:52 山风小子 阅读(5438) 评论(17)  编辑  收藏 所属分类: Groovy & Grails