GIGO: words unreadable aloud
Mishrogo Weedapeval
 

 

  Sunday 8 February 2004
Scala Swing example

Here (below) is an example of Scala interacting with the java Swing GUI library, to put up a real silly GUI window. It's neither a good example of Swing usage, nor a good example of how much more clearly Scala can express some things than Java can; it's more of a "how-to", to show a little of how scala interacts with Java libraries. It works and does almost the same thing on Solaris (2.8), Windows XP, and Mac OS X (10.2.4).

Somewhat interesting tidbits:

  • I renamed JButton to JSwJB upon import.
  • The variable exitButton is initialized with an underscore, which tells scala to give it a "default initialization value".
  • I use "this." a lot; I think it should be required. It is not required in Scala, just as it is not required in Java.
  • In the mkExitButton method, I omitted the outermost {curly} braces. I'm still not sure that it's a good idea to make them omittable.
  • In the sbwob.init method, the call to mkExitButton does not need "()".
  • In the next line, the anonymous instance of the inner class "goAway" was created without requiring me to say "new goAway". That's because I declared the goAway class to be a "case class".
  • "goAway with foo" is how you say that class goAway implements the Java interface named foo.

//
// Translated into Scala from the jython version seen at
//   http://www.eros-os.org/pipermail/e-lang/2002-April/006351.html ,
// which just happened to be a simple example at the top of
// the Google heap for "jython swing simple".
//
import javax.swing.{ JButton => JSwJB };
class sbwob extends javax.swing.JFrame {
    var exitButton : JSwJB = _;
    var paintCalls = 0;
    var buttonPresses = 0;
    override def paint (g: java.awt.Graphics) = {
        paintCalls = paintCalls + 1;
        Console.println( "sbwob paint calls " + this.paintCalls );
        g.setColor(java.awt.Color.black);
        g.drawString("hello", 10, 10);
        g.fillOval(10, 10, 100, 100);
    }
    def mkExitButton = exitButton = new JSwJB( "Get me Out" );
    def init = {
        Console.println( "sbwob frame thing" );
        this.setTitle( "sbwob frame thing" );
        this.setSize(256, 256);
        mkExitButton;
        exitButton.addActionListener(goAway());
        this.getContentPane().add( exitButton );
    }
    // Inner class to handle button presses
    //   Will exit only after 6 or more repaints.
    case class goAway with java.awt.event.ActionListener {
        def actionPerformed ( e: java.awt.event.ActionEvent ) = {
            buttonPresses = buttonPresses + 1;
            if( sbwob.this.paintCalls > 5 ) {
                Console.println( "Button pressed " +
                    sbwob.this.buttonPresses + " times.  Exiting." );
                System.exit(0);
            }
        }
    }
}
object sbw_main {
    def main ( args : Array[String] ) = {
        var myhr = new sbwob;
        myhr.init;
        myhr.setVisible(true);
        Thread.sleep(20000);
        /*
        catch {
            // How can I catch just the InterruptedException?
            case Throwable =>
                Console.println( "20-second sleep interrupted." );
        }
        */
        var m: String =
            if( myhr.buttonPresses == 0 ) "No button pressed.";
            else   "Button pressed " + myhr.buttonPresses +
                   " times.  Exiting.";
        Console.println( m + "  Ran out of patience." );
        System.exit( 0 );
    }
}

Updated: I removed all of the blank lines because Radio's renderer insists on putting three blank lines wherever I had a single blank line. Yecch. So I made a directory to hold the examples I come up with as I learn the language. It is here: http://dal.i.am/sw/scala-ex/ and this particular example is http://dal.i.am/sw/scala-ex/sbw_db8.scala

Further update: the comment at the start had the wrong message number from the e-lang list. Fixed now.
12:43:32 AM   comment/     



Click here to visit the Radio UserLand website. Click to see the XML version of this web page. © Copyright 2007 Doug Landauer .
Last update: 07/2/6; 12:37:02 .
Click here to send an email to the editor of this weblog.

February 2004
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29            
Jan   Mar

Previous/Next