【IT168 技术文档】最近一直很忙,为了放松放松,自己就用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() } }