私は、古い scala swing アプリケーションを scala 2.7.7 から 2.9.3 に、jdk 1.6 をできれば jdk 1.7 にアップグレードしている最中です。
古いセットアップでアプリケーションを実行でき、IntelliJ IDEA 12.1 でアプリケーションを scala 2.9.3 および jdk 1.7 にアップグレードすることにほぼ成功しました。
しかし、ComboBox で問題が発生し続けています。
トラブルメーカー ファイル:
package gui
import gui.model.scenario._
import swing._
object ScenarioComboBox {
private val model = new javax.swing.DefaultComboBoxModel
}
class ScenarioComboBox extends ComboBox[MutableScenario](Seq(new MutableScenario("", Map()))) {
import ScenarioComboBox.model
peer.setModel(model)
private val dataModel = model.asInstanceOf[javax.swing.DefaultComboBoxModel]
def contents = {
var list: List[MutableScenario] = Nil
val size = dataModel.getSize
(0 to size - 1).foreach { index =>
list = list ::: List(dataModel.getElementAt(index).asInstanceOf[MutableScenario])
}
list
}
def contents_=(v: List[MutableScenario]) {
dataModel.removeAllElements
v map dataModel.addElement
}
def selectedItem = dataModel.getSelectedItem.asInstanceOf[MutableScenario] match {
case null => None
case s => Some(s)
}
def selectedItem_=(v: Option[MutableScenario]) {
v match {
case Some(s) => dataModel setSelectedItem s
case None => dataModel setSelectedItem null
}
selection.publish(swing.event.SelectionChanged(this))
}
listenTo(selection)
}
まず、jdk 1.7 IntelliJ を使用すると、次の警告が表示されます。
Type mismatch, expected: ComboBoxModel[E], actual: DefaultComboBoxModel[Nothing]
行で:
peer.setModel(model)
このファイルをそのまま使用してソースをコンパイルすると、jdk 1.6 と 1.7 の両方で次のエラーが発生します。
something is wrong (wrong class file?): class JComboBox with type parameters [E] gets applied to arguments [], phase = typer
peer.setModel(model)
^
タイプの不一致エラーが発生したり、コンボボックスを修正しようとしても、このコードをコンパイルできないようです。(たとえば、このスタックオーバーフローの質問Editing Combobox Scalaで提示されたアイデアを試しました)
私は元のコードの作成者ではなく、この 2 週間で scala と swing を学んだばかりです。
このコンボボックスで何百万ものことを試したような気がします..