Task

Create a window that has:

   a label that says   "There have been no clicks yet" 
   a button that says   "click me"


Upon clicking the button with the mouse, the label should change and show the number of times the button has been clicked.




/* REXX ***************************************************************************************
* 18.06.2014 Walter Pachl shortened from Rony Flatscher's bsf4oorexx (see sourceforge) samples
* Look there for ShowCount.rxj
* bsf4oorexx lets the ooRexx program use Java classes
**********************************************************************************************/
userData=.directory~new    -- a directory which will be passed to Rexx with the event
 
   --  create a framed Java window, set a title text
win=.bsf~new("java.awt.Frame", "Show Count")
   -- Create a Java RexxProxy for controlling the closing of the application
rexxCloseEH =.RexxCloseAppEventHandler~new   -- Rexx event handler
   -- Create Java RexxProxy for the Rexx event handler
rpCloseEH=BsfCreateRexxProxy(rexxCloseEH,,"java.awt.event.WindowListener" )
win~addWindowListener(rpCloseEH) -- add RexxProxy event handler
 
   -- create a Java push button
but=.bsf~new("java.awt.Button","Press me!")
   -- Create a RexxProxy for the button Rexx event handler
rp=BsfCreateRexxProxy(.RexxShowCountEventHandler~new,userData,"java.awt.event.ActionListener")
but~addActionListener(rp)        -- add RexxProxy event handler
 
lab=.bsf~new("java.awt.Label")   -- create a Java label,set it to show the text centered
userData~label=lab               -- save label object for later use in event handler
lab~setAlignment(lab~center)     -- set alignment to center
lab~setText("Button was not yet pressed") -- assign initial text to the label
 
win ~~add("Center",lab) ~~add("South",but) -- add the label and the button to the frame
win ~~pack                       -- now calculate all widget dimensions
call enlargeWidth win,but,120    -- enlarge the width of the frame and the button
 
win ~~setVisible(.true) ~~toFront   -- make frame visible and move it to the front
 
userData~i=0                     -- set counter to 0
 
rexxCloseEH~waitForExit          -- wait until we are allowed to end the program
 
-- if Java was loaded by Rexx,then terminate Java's RexxEngine to inhibit callbacks from Java
call BSF.terminateRexxEngine
 
::requires BSF.CLS      -- get Java support
 
   /* enlarge the width of the frame and of the button without using a layout manager  */
::routine enlargeWidth
  use arg win,but,addToWidth
  winDim=win~getSize            -- get frame's dimension
  winDim~width+=addToWidth      -- increase width
  win~setSize(winDim)           -- set frame's dimension
 
/* ------------------------------------------------------------------------ */
/* Rexx event handler to set "close app" indicator */
::class RexxCloseAppEventHandler
::method init                   -- constructor
  expose closeApp
  closeApp  = .false            -- if set to .true, then it is safe to close the app
 
::attribute closeApp            -- indicates whether app should be closed
 
::method unknown                -- intercept unhandled events,do nothing
 
::method windowClosing          -- event method (from WindowListener)
  expose closeApp
  closeApp=.true                -- indicate that the app should close
 
::method waitForExit            -- method blocks until attribute is set to .true
  expose closeApp
  guard on when closeApp=.true
 
/* ------------------------------------------------------------------------ */
/* Rexx event handler to process tab changes */
::class RexxShowCountEventHandler
::method actionPerformed
  use arg eventObject,slotDir
  call showCount slotDir~userData
 
/* ------------------------------------------------------------------------ */
::routine ShowCount             -- increment counter and show text
   use arg userData
   userData~i+=1                -- increment counter in directory object
   Select                       -- construct text part
     When userData~i=1 Then how_often='once'
     When userData~i=2 Then how_often='twice'
     When userData~i=3 Then how_often='three times'
     Otherwise how_often=userData~i 'times'
   End
   userData~label~setText("Button was pressed" how_often) -- display text