# Scala MenuListener



## Spin (4. Aug 2011)

Hallo liebe Community,

wie kann ich hier meinen MenuItems einen Listener hinzufügen ohne die Variablen global bzw. statisch zu machen.

Habe es mit listenTo versucht aber nichts geht. Danke für Hilfe.

Code:


```
import scala.swing._
import java.awt.{Dimension, Point, Toolkit}
import javax.swing.UIManager
import java.awt.event.ActionListener

object Main extends SimpleSwingApplication {

  /**
   * frame height
   */
   val height:Int = 480;

  /**
   * frame width
   */
  val width:Int = 640;


  /**
   * create main frame
   * @override
   */
  override def top = new MainFrame {
    this.title = "Gamedevelopment in Scala"
    this.location = Main.getCenterLocation()
    this.size = new Dimension(Main.width, Main.height)
    this.maximumSize = new Dimension(Main.width, Main.height)

    //look and feel
    Main.changeLookAndFeel()

    //this.iconImage = Toolkit.getDefaultToolkit.getImage(Main.resourceFromClassloader(''))

    // menu bar
    this.menuBar = Main.getMenuBar()

    

  }

  /**
   * get center location depends on screen size
   */
  def getCenterLocation() : Point = {
      // get current screen size
      val screenSize  = Toolkit.getDefaultToolkit.getScreenSize()

      val location = new Point((screenSize.width/2) - (Main.width/2),
                               (screenSize.height/2) - (Main.height/2))

      return location
  }

  /**
   * change to a nimbus look and feel
   */
  def changeLookAndFeel() : Unit = {
	      try{
           // set new look and feel
	         UIManager.setLookAndFeel(new com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel);
	      } catch {
          // catch default case_
	         case _ => UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
	      }
  }

  /**
   * get frame menu bar
   */
  def getMenuBar() : MenuBar =  {
      val menuBar = new MenuBar {
        // component buffer
        contents += new Menu("File"){
          contents += new MenuItem("New")
          contents += new Separator()
          contents += new MenuItem("Quit")
        }
        contents += new Menu("Help"){
          contents += new MenuItem("About")
        }
      }

      return menuBar
  }
}
```


grüße Spin


----------



## Jay_030 (4. Aug 2011)

Hm, wo hast du da jetzt Listener hinzugefügt?

Anyway, vielleicht hilft dir das: How to add listeners to Swing components in Scala? - Stack Overflow

Habe mit Scala Swing selbst noch nichts gemacht.


----------



## Spin (5. Aug 2011)

Moin Jay,

ich habe ed endlich:


```
private def _getMenuBar() : MenuBar =  {
      val menuBar = new MenuBar {
        // component buffer
        contents += (new Menu("Game Menu"){
          contents += (new MenuItem(Action("New"){
            System.exit(0)
          }))
          contents += new Separator()
          contents += (new MenuItem(Action("Quit"){
            System.exit(0)
          }))
        })
        contents += new Menu("Help"){
          contents += new MenuItem("About")
        }
      }

      return menuBar
  }
}
```
Ich werd jetzt mal eine Klasse bauen die von Publisher erbt und diese dann hinzufügen.
Ich weiss nicht ob das listenTo überhauüt noch gang und gebe ist.
Das meckert immer .....:/

Aber bin noch ziemlich am anfang mit scala , daher ist rumärgern legitim 
Danke für Tipp, weitere gute Links sind willkommen. Habe schon einiges gefunden und versuche darauf aufzubauen.

ABER : SCALA ...ist echt gewöhnungsbedürftig!


----------



## escalate (5. Aug 2011)

Spin hat gesagt.:


> ABER : SCALA ...ist echt gewöhnungsbedürftig!


Das geht wohl den meisten am Anfang so. Die Begeisterung kommt später (hoffentlich) 

Mit Swing und Scala habe ich allerdings auch noch nicht programmiert (steht aber auf der TODO-Liste), daher kann ich jetzt auch nicht sagen, ob mal das noch deutlich besser machen kann.

Das "val menuBar =" und das return menuBar am Schluss kannst du dir aber sparen, geht ohne genauso gut . Die Typangabe der Funktion würde man auch eher weglassen, weil das sowieso offensichtlich ist.


----------



## Landei (5. Aug 2011)

Man kann direkt schreiben...


```
private def _getMenuBar() = new MenuBar {
   ...
```

Ob es "drinne" besser geht, müsste ich erst ausprobieren...


----------



## Landei (5. Aug 2011)

OK, mal ein erster Versuch:


```
import scala.swing._
import Swing._
import java.awt.Toolkit
import javax.swing.UIManager
 
object Main extends SimpleSwingApplication {
 
  /**
   * frame width and height
   */
  val frameSize = new Dimension(640, 480)
  val screenSize  = Toolkit.getDefaultToolkit.getScreenSize
 
  /**
   * create main frame
   * @override
   */
  override def top = new MainFrame {
    this.title = "Gamedevelopment in Scala"
    this.location = getCenterLocation()
    this.size = frameSize
    this.maximumSize = frameSize
 
    //look and feel
    changeLookAndFeel()
 
    //this.iconImage = Toolkit.getDefaultToolkit.getImage(Main.resourceFromClassloader(''))
 
    menuBar = new MenuBar {
      // component buffer
      contents ++= new Menu("Game Menu"){
          contents ++= new MenuItem(Action("New"){
                System.exit(0)
              }) ::
              new Separator() ::
              new MenuItem(Action("Quit"){
                System.exit(0)
              }) :: Nil
      } ::
      new Menu("Help"){
        contents += new MenuItem("About")
      } :: Nil
    }
 
  }
 
  /**
   * get center location depends on screen size
   */
  def getCenterLocation() : Point = 
    ((screenSize.width - frameSize.width) /2,
     (screenSize.height - frameSize.height)/2)
 
  /**
   * change to a nimbus look and feel
   */
  def changeLookAndFeel() : Unit = {
    try{
      // set new look and feel
      UIManager.setLookAndFeel(new com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel);
    } catch {
      // catch default case_
      case _ => UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
  }
  
}
```

Mit [c]++=[/c] kann man mehrere Elemente an einen [c]Buffer[/c] wie [c]contents[/c] anfügen. Diese müssen als [c]Traversable[/c] vorliegen, also z.B. als eine [c]Seq[/c] oder [c]List[/c]. Ich habe hier eine [c]List[/c] genommen, weil die alternative Schreibweise [c]1 :: 2 :: 3 :: Nil[/c] optisch gut passt.


----------

