RosettaCodeData/Task/Draw-a-clock/NetRexx/draw-a-clock.netrexx

103 lines
3.5 KiB
Plaintext

/* NetRexx */
options replace format comments java crossref symbols binary
import javax.swing.Timer
-- .+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
class RClockSwing public extends JFrame
-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
properties constant
K_TITLE = String "Clock"
isTrue = boolean (1 == 1)
isFalse = \isTrue
properties inheritable
content = Container
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
method RClockSwing() public
this(K_TITLE)
return
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
method RClockSwing(title = String) public
super(title)
initFrame()
return
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
method initFrame() private
content = getContentPane()
content.setLayout(BorderLayout())
content.add(RClockSwing.Panel(), BorderLayout.CENTER)
setResizable(isFalse)
pack()
return
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
method main(args = String[]) public static
clockFace = JFrame
clockFace = RClockSwing()
clockFace.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
clockFace.setVisible(isTrue)
return
--..+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
class RClockSwing.Panel shared extends JPanel implements ActionListener
properties constant
degrees450 = double Math.PI * 2.5
degrees006 = double Math.PI / 30.0
degrees030 = double degrees006 * 5
size = int 350
spacing = int 10
diameter = int size - 2 * spacing
x1 = int diameter / 2 + spacing
y1 = int diameter / 2 + spacing
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
method Panel() public
super()
initPanel()
return
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
method initPanel() public
setPreferredSize(Dimension(size, size))
setBackground(Color.WHITE)
ptimer = Timer(1000, this)
ptimer.start()
return
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
method paintComponent(gr = Graphics) public
super.paintComponent(gr)
g2 = Graphics2D gr
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)
gr.setColor(Color.black)
gr.drawOval(spacing, spacing, diameter, diameter)
cdate = Calendar.getInstance()
hours = cdate.get(Calendar.HOUR)
minutes = cdate.get(Calendar.MINUTE)
seconds = cdate.get(Calendar.SECOND)
angle = double degrees450 - (degrees006 * seconds)
drawHand(gr, angle, int (diameter / 2 - 10), Color.red)
minsecs = double (minutes + seconds / 60.0)
angle = degrees450 - (degrees006 * minsecs)
drawHand(gr, angle, int (diameter / 3), Color.black)
hourmins = double (hours + minsecs / 60.0)
angle = degrees450 - (degrees030 * hourmins)
drawHand(gr, angle, int (diameter / 4), Color.black)
return
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
method drawHand(gr = Graphics, angle = double, radius = int, color = Color) public
x2 = x1 + (int (radius * Math.cos(angle)))
y2 = y1 + (int (radius * Math.sin(-angle)))
gr.setColor(color)
gr.drawLine(x1, y1, x2, y2)
return
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
method actionPerformed(evt = ActionEvent) public
repaint()
return