How to center a window/frame with Scala Swing

To center a window/frame in a Scala Swing application, add this line to your frame definition:

peer.setLocationRelativeTo(null)

Here’s what this looks like in the top method definition inside a SimpleSwingApplication:

def top = new MainFrame { 
  title = "Convert Celsius / Fahrenheit" 
  contents = new FlowPanel(celsius, new Label(" Celsius = "), 
                           fahrenheit, new Label(" Fahrenheit"))
  peer.setLocationRelativeTo(null)
}

In case that doesn’t make sense, here’s the source code for a complete Scala Swing application:

package tests

import scala.swing._
import scala.swing.event.EditDone
import scala.swing.event.WindowActivated

object Converter extends SimpleSwingApplication { 

  def newField = new TextField {
    text = "0"
    columns = 5
  } 
  
  val celsius = newField
  val fahrenheit = newField
  
  def top = new MainFrame { 
    title = "Convert Celsius / Fahrenheit" 
    contents = new FlowPanel(celsius, new Label(" Celsius = "), 
                             fahrenheit, new Label(" Fahrenheit"))
    peer.setLocationRelativeTo(null)
  }

  listenTo(fahrenheit, celsius) 
  reactions += {
    case EditDone(`fahrenheit`) => 
      val f = Integer.parseInt(fahrenheit.text) 
      val c = (f - 32) * 5 / 9 
      celsius.text = c.toString
    case EditDone(`celsius`) => 
      val c = Integer.parseInt(celsius.text) 
      val f = c * 9 / 5 + 32 
      fahrenheit.text = f.toString
  }

}

At the moment that code is just a modified version of the celsius to fahrenheit converter you can find online (like this one at Artima), but it drives me crazy when windows don't open centered, so I thought this would be a relatively simple example.