package jp.co.fit.hayami.groovy /** * 割り算に関するデモプログラム * @author hayami */ import groovy.swing.SwingBuilder import java.awt.Font import java.awt.event.KeyEvent as KE import java.math.MathContext as MC import java.math.RoundingMode as RM import javax.swing.DefaultComboBoxModel import javax.swing.KeyStroke as KS import javax.swing.ScrollPaneConstants as SPC import javax.swing.UIManager import javax.swing.WindowConstants as WC //Set L&F (Groovy way!) UIManager.lookAndFeel = UIManager.systemLookAndFeelClassName //MathContext map def roundingMode = ['MathContext':null, 'DECIMAL32':MC.DECIMAL32, 'DECIMAL64':MC.DECIMAL64, 'DECIMAL128':MC.DECIMAL128] //Create SwingBuilder SwingBuilder builder = new SwingBuilder() //Def 'clear' action clearAction = builder.action { builder.clear.doClick() } //Create default display font font = Font.decode('Dialog 40') //Create 'Calc' panel def calcPanel = { builder.hbox(id:'calcPanel', title:'Calc') { //Create 'Calc' textField textField(id:'calcText', columns:20, font:font) } //Add method for 'Calc' panel builder.calcPanel.metaClass { doCalcAction << { //Evaluate text and set result builder.result.text = evaluate(builder.calcText.text) } doClearAction << { //Clear text builder.calcText.text = '' } } //Set escape key action for 'Calc' panel builder.calcText.keymap.addActionForKeyStroke(KS.getKeyStroke(KE.VK_ESCAPE, 0), clearAction) } //Create 'BigDecimal' panel def bigDecimalPanel = { builder.vbox(id:'bigDecimalPanel', title:'BigDecimal') { //Create horizontal box for layout hbox { //Create 'Number' textField textField(id:'number', columns:15, font:font) //Create horizontal strut hstrut(width:10) //Create '/' label label(text:'/', font:font) //Create horizontal strut hstrut(width:10) //Create 'Divisor' textField textField(id:'divisor', columns:3, font:font) } //Create horizontal box for layout hbox { //Create 'Scale' slider slider(id:'scale', minimum:0, maximum:20, value:10, majorTickSpacing:2, minorTickSpacing:1, snapToTicks:true, paintLabels:true, paintTicks:true, paintTrack:true) //Create horizontal strut hstrut(width:10) //Create 'RoundingMode' comboBox comboBox(id:'roundingMode', model:new DefaultComboBoxModel(roundingMode.keySet().toList() as Vector), actionPerformed: { //Enable/disable slider builder.scale.enabled = (roundingMode[builder.roundingMode.selectedItem] == null) } ) } } //Add method for 'BigDecimal' panel builder.bigDecimalPanel.metaClass { doCalcAction << { //Is calc text not null? if (builder.number.text != '' && builder.divisor.text != '') { //Get number as BigDecimal BigDecimal number = builder.number.text as BigDecimal //Get divisor as BigDecimal BigDecimal divisor = builder.divisor.text as BigDecimal //Get roundingMode MC mc = roundingMode[builder.roundingMode.selectedItem] //If roundingMode is 'MathContext', create MathContext mc = mc ?: new MC(builder.scale.value) //Divide number BigDecimal result = number.divide(divisor, mc) //Set result as plain string builder.result.text = result.toPlainString() } else { //Clear result builder.result.text = '' } } doClearAction << { //Clear number builder.number.text = '' //Clear divisor builder.divisor.text = '' } } //Set escape key action for 'BigDecimal' panel builder.number.keymap.addActionForKeyStroke(KS.getKeyStroke(KE.VK_ESCAPE, 0), clearAction) builder.divisor.keymap.addActionForKeyStroke(KS.getKeyStroke(KE.VK_ESCAPE, 0), clearAction) } //Create main frame frame = builder.frame(title:'JGGUG 20100127 Divide Demo', location:[100, 100], defaultCloseOperation:WC.EXIT_ON_CLOSE, pack:true, show:true) { //Create vertical box for layout vbox { //Create tabbedPane tabbedPane(id:'tab') { //Set 'Calc' panel calcPanel() //Set 'BigDecimal' panel bigDecimalPanel() } //Create 'Button' panel hbox { //Create 'Calc!' button button(id:'calc', text:'Calc!', font:font, defaultCapable:true, defaultButton:true, actionPerformed: { builder.tab.selectedComponent?.doCalcAction() } ) //Create horizontal strut hstrut(width:10) //Create 'Clear' button button(id:'clear', text:'Clear', font:font, actionPerformed: { builder.tab.selectedComponent?.doClearAction() builder.calc.doClick() } ) } //Create 'Result' panel hbox { //Create scrollPane scrollPane(horizontalScrollBarPolicy:SPC.HORIZONTAL_SCROLLBAR_ALWAYS) { //Create 'Result' textArea textArea(id:'result', columns:20, rows: 1, editable: false, font:font) } } } }