packages feed

java-bridge-0.20130606.3: examples/calculator/src/calculator.hs

import Foreign.Java
import Data.Maybe

import Foreign.Java.Bindings.Support


main :: IO ()
main = runJavaGui $ do
    
    (Just jFrameClass)  <- getClass "javax.swing.JFrame"
    (Just jButtonClass) <- getClass "javax.swing.JButton"
    (Just jGridLayoutClass) <- getClass "java.awt.GridLayout"

    setVisible   <- jFrameClass `bindMethod` "setVisible" ::= boolean --> void
    addComponent <- jFrameClass `bindMethod` "add" ::= object "java.awt.Component"
                                                   --> object "java.awt.Component"
    setLocation  <- jFrameClass `bindMethod` "setLocationRelativeTo" ::= object "java.awt.Component"
                                                                     --> void
    setSize'     <- jFrameClass `bindMethod` "setSize" ::= int --> int --> void
    let setSize obj (a, b) = setSize' obj a b
    setLayout    <- jFrameClass `bindMethod` "setLayout" ::= object "java.awt.LayoutManager"
                                                         --> void

    addActionListener <- jButtonClass
        `bindMethod` "addActionListener" ::= object "java.awt.event.ActionListener" --> void

    (Just jButtonConstr)     <- getConstructor jButtonClass $ string
    (Just jGridLayoutConstr) <- getConstructor jGridLayoutClass $ int --> int
    
    (Just jFrame) <- newObject jFrameClass
    
    newObjectFrom jGridLayoutConstr 4 4 >>= setLayout jFrame

    buttons <- mapM (newObjectFrom jButtonConstr)
                    [ "1", "2", "3", "*"
                    , "4", "5", "6", "-"
                    , "7", "8", "9", "·"
                    , "C", "0", "=", "÷" ]
    
    mapM_ (addComponent jFrame) buttons

    let action = do
            io $ putStrLn "Let's have some fun!"

    listener <- sushimaki "java.awt.event.ActionListener" action

    mapM_ (flip addActionListener (Just listener) . fromJust) buttons

    jFrame `setSize` (400, 300)
    jFrame `setLocation` Nothing
    jFrame `setVisible` True