1

Textfield に項目を書き込んでから、その項目をコンボ ボックスに挿入して反応するボタンを入力できる単純なアプリケーションを実装しようとしています。

ただし、scala コンボボックスのスイングが可変ではないという問題に直面しています (推測します)。

scala swing を使用してコンボを変更可能にする方法はありますか?

import scala.swing._
import scala.swing.event._
import scala.swing.BorderPanel.Position._

object ReactiveSwingApp extends SimpleSwingApplication {
  def top = new MainFrame {
    title = "Reactive Swing App"

    val button = new Button {
      text = "Add item" 
    }   
    var textfield = new TextField {
      text = "Hello from a TextField"
    }

    var items = List("Item 1","Item 2","Item 3","Item 4")
    val combo = new ComboBox(items)

    contents = new BorderPanel {
      layout(new BoxPanel(Orientation.Vertical) {
          contents += textfield 
          contents += button
          contents += combo   
          border = Swing.EmptyBorder(30, 30, 10, 30)
      }) = BorderPanel.Center
    }

    listenTo(button, textfield)
    reactions += {
      case ButtonClicked(button) =>
        // var items1 = textfield.text :: items  <- how can a read Item be inserted
    }
  }
}
4

2 に答える 2

2

おっしゃる通り、Scala-SwingComboBoxラッパーにJComboBoxは、追加や削除を許可しない静的モデルがあります。残念ながら、Scala-Swing には、基盤となる Java-Swing コンポーネントよりも機能が劣るものがかなりあります。

ただし、良い点は、各 Scala-Swing コンポーネントには Java-Swingpeerフィールドがあり、不足しているビットを修正するために使用できることです。javax.swing.DefaultComboBoxModel次のような薄いラッパーを作成するのが最も簡単だと思います。

class ComboModel[A] extends javax.swing.DefaultComboBoxModel {
  def +=(elem: A) { addElement(elem) }
  def ++=(elems: TraversableOnce[A]) { elems.foreach(addElement) }
}

次に、あなたの構造は次のようになります

val combo = new ComboBox(List.empty[String])
val model = new ComboModel[String]
model ++= items
combo.peer.setModel(model)  // replace default static model

そしてあなたの反応

reactions += {
  case event.ButtonClicked(button) =>
    model += textfield.text
}
于 2013-03-28T19:46:14.017 に答える