/* A sample graphics stand-alone application for the Java 1.1 (or later) platform, using dependent and adapter classes. This draws two buttons in a frame window on the screen, and sets the background colour whenever one is pushed. An off-screen image is used to show how one is handled. It is not needed for this simple effect, but is usually needed for anything more complicated. The image reverts to default background when the window is resized. */ options binary -- optional, for speed /* ------------------------------------------------------------------ */ /* The main (parent) class */ /* ------------------------------------------------------------------ */ class Buttons adapter extends Frame- implements WindowListener, ComponentListener properties shared shadow=Image -- offscreen image properties constant mywidth=200 -- our shape myheight=300 -- .. glass=Toolkit.getDefaultToolkit.getScreenSize -- screen geometry /* The 'main' method is called when this class is started as an application */ method main(s=String[]) static frame=Buttons("My Buttons" Rexx(s)) -- make a titled frame -- now size and place it mid-screen frame.setBounds((glass.width-mywidth)%2,(glass.height-myheight)%2,- mywidth, myheight) frame.show -- and make it visible /* The constructor for Buttons */ method Buttons(s=String) super(s) -- pass title to superclass setLayout(FlowLayout()) -- set component layout scheme add(Buttons.Left()) -- add one button .. add(Buttons.Right()) -- .. and the other addWindowListener(this) -- please tell us about Window events .. addComponentListener(this) -- .. and component events /* newimage -- make a new offscreen image */ method newimage shadow=createImage(getSize.width, getSize.height) /* update -- called when the window is updated */ /* paint -- called when the window needs to be redrawn */ method update(g=Graphics) -- we supply this to avoid flicker paint(g) method paint(g=Graphics) if shadow=null then newimage -- ensure we have an image g.drawImage(shadow, 0, 0, this)-- copy the image to screen /* componentResized -- called after graphics area resized */ method componentResized(e=ComponentEvent) newimage -- make new sized image /* windowClosing -- called when the window is closed */ -- We need to handle this to end the program method windowClosing(e=WindowEvent) exit /* ------------------------------------------------------------------ */ /* A dependent class for a button */ /* ------------------------------------------------------------------ */ class Buttons.Left dependent extends Button implements ActionListener method Left -- construct the button super("Green") -- we choose the label addActionListener(this) -- listen for action events method actionPerformed(a=ActionEvent) -- Button pressed g=parent.shadow.getGraphics -- get the image g.setColor(Color.green) -- choose a colour -- now colour the image g.fillRect(0, 0, parent.getSize.width, parent.getSize.height) parent.repaint -- and request redraw /* ------------------------------------------------------------------ */ /* A dependent class for a button */ /* ------------------------------------------------------------------ */ -- (If many buttons are similar, it could be worth making a shared -- superclass. Equally, a method on the parent object could be called -- to set and fill the new colour, for example, use: -- parent.newColor(Color.red) -- to call a newColor method in the Buttons class on the parent object.) class Buttons.Right dependent extends Button implements ActionListener method Right -- construct the button super("Red") -- we choose the label addActionListener(this) -- listen for action events method actionPerformed(a=ActionEvent) -- Button pressed g=parent.shadow.getGraphics -- get the image g.setColor(Color.red) -- choose a colour -- now colour the image g.fillRect(0, 0, parent.getSize.width, parent.getSize.height) parent.repaint -- and request redraw