2014-06-29 4 views
0

J'essaye de retirer un label du contents d'un BoxPanel dans Scala-Swing mais j'obtiens l'erreur suivante. J'ai vérifié et trouvé qu'il est un membre de scala.Seq. Maintenant, je ne suis pas sûr de ce qui ne va pas ici.Changer le contenu de BoxPanel dans Swing

def contents : scala.Seq[scala.swing.Component] = { /* compiled code */ } 

Mon code est ci-dessous.

import scala.swing._ 
import scala.swing.event._ 

object Starter extends SimpleSwingApplication { 

    def top = new MainFrame { 
    title = "Swing Test APp" 
    val button = new Button { 
     text = "Click if you can" 
    } 
    val label = new Label { 
     text = ") Clicks" 
    } 

    contents = new BoxPanel(Orientation.Vertical) { 
     contents += button 
     contents += label 
     border = Swing.EmptyBorder(30, 30, 10, 30) 
    } 
    listenTo(button) 
    var numClicks = 0 
    reactions += { 
     case ButtonClicked(b) => 
     numClicks += 1 
     contents.contents -= label //Problem here 
     label.text = numClicks.toString() 
    } 

    } 
} 

Répondre

1

Le problème est que vous essayez d'accéder BoxPanel via la méthode générique contents de votre cadre dont le type est juste Seq[Component] alors que le panneau de la boîte met effectivement en œuvre l'interface SequentialContainer qui permet la mutation de son contenu.

Il suffit de garder une poignée sur votre panneau de boîte directement:

def top: Frame = new Frame { 
    title = "Swing Test App" 
    val button = new Button("Click if you can") 
    val label = new Label("0 Clicks") 

    val box = new BoxPanel(Orientation.Vertical) { 
    contents += button 
    contents += label 
    border = Swing.EmptyBorder(30, 30, 10, 30) 
    } 
    contents = box 
    listenTo(button) 
    var numClicks = 0 
    reactions += { 
    case ButtonClicked(b) => 
     numClicks += 1 
     if (numClicks < 3) { 
     label.text = s"$numClicks Clicks" 
     } else { 
     box.contents -= label 
     box.revalidate() // refresh layout 
     box.repaint() 
     } 
    } 

    pack() 
    open() 
} 

top 
Questions connexes