Swing表渲染器组件中的scala.MatchError

Swing表渲染器组件中的scala.MatchError,swing,scala,Swing,Scala,当我尝试使用自定义呈现组件向表中添加新行时,我遇到了类java.lang.Integer的scala.MatchError:0: import java.awt.Dimension import scala.swing.BorderPanel import scala.swing.Button import scala.swing.Component import scala.swing.Panel import scala.swing.Table import javax.swing.tab

当我尝试使用自定义呈现组件向表中添加新行时,我遇到了类java.lang.Integer的scala.MatchError:0:

import java.awt.Dimension

import scala.swing.BorderPanel
import scala.swing.Button
import scala.swing.Component
import scala.swing.Panel
import scala.swing.Table
import javax.swing.table.DefaultTableModel
import scala.swing.Label

object MatchErrorInTable {

  def initPanel() : Panel = {
    val tableModel = new DefaultTableModel(Array[Object]("col1", "col2"), 0)
    val panel = new BorderPanel
    class MyRenderer extends Label {
      def prepare(o: String) {
          text = "foo"
      }
    }
    val tcr = new Table.AbstractRenderer[String, MyRenderer](new MyRenderer) {
      def configure(t: Table, sel: Boolean, foc: Boolean, o: String, row: Int, col: Int) = {
        component.prepare(o)
      }
    }
    val table = new Table(0, 2) {
      override protected def rendererComponent(sel: Boolean, foc: Boolean, row: Int, col: Int): Component  = {
        col match {
          case 1 => tcr.componentFor(this, sel, foc, "bar", row, col)
        }
      }
    }
    table.model = tableModel
   val addButton = Button("add") {
      tableModel.addRow(Array[Object]("text", null))
   }

    panel.layout(table) = BorderPanel.Position.Center
    panel.layout(addButton) = BorderPanel.Position.South
    panel
  }

  def main(args: Array[String]) {
    val mainFrame = new MainFrame()
    mainFrame.preferredSize = new Dimension(800, 600)
    mainFrame.contents = initPanel
    mainFrame.visible = true

  }
}
例外情况:

Exception in thread "AWT-EventQueue-0" scala.MatchError: 0 (of class java.lang.Integer)
    at com.mm.calendar.MatchErrorInTable$$anon$1.rendererComponent(MatchErrorInTable.scala:29)
    at scala.swing.Table$$anon$2$$anon$10.getTableCellRendererComponent(Table.scala:116)
    at scala.swing.Table$$anon$2$$anon$10.getTableCellRendererComponent(Table.scala:114)
    at javax.swing.JTable.prepareRenderer(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
    at javax.swing.plaf.ComponentUI.update(Unknown Source)
    at javax.swing.JComponent.paintComponent(Unknown Source) 
我如何可能在RenderComponent中获得java.lang.Integer

我的解决方案主要基于:

我正在使用2.11.1版本。

如果您添加其他版本

      case _ => tcr.componentFor(this, sel, foc, "foo", row, col)
作为def RenderComponent中match中的后备组件,它至少可以正常工作

模型中有两列,实际列索引将为0和1;这些将传递给渲染器组件

要获得完整演示,请执行以下操作:

import swing._
import javax.swing.table.DefaultTableModel

object MatchErrorInTable {

  def initPanel(): Panel = {
    val tableModel = new DefaultTableModel(Array[Object]("col1", "col2"), 0)
    val panel = new BorderPanel
    class MyRenderer extends Label {
      def prepare(o: String) {
        text = o // changed
      }
    }
    val tcr = new Table.AbstractRenderer[String, MyRenderer](new MyRenderer) {
      def configure(t: Table, sel: Boolean, foc: Boolean, o: String, row: Int, col: Int) = {
        component.prepare(o)
      }
    }
    val table = new Table(0, 2) {
      override protected def rendererComponent(sel: Boolean, foc: Boolean, row: Int, col: Int): Component = {
        col match {
          case 0 => tcr.componentFor(this, sel, foc, tableModel.getValueAt(row, 0).toString, row, col) // changed
          case 1 => tcr.componentFor(this, sel, foc, tableModel.getValueAt(row, 1).toString, row, col) // changed
        }
      }
    }
    table.model = tableModel
    val addButton = Button("add") {
      tableModel.addRow(Array[Object]("text 1", "text 2")) // changed
    }

    panel.layout(table) = BorderPanel.Position.Center
    panel.layout(addButton) = BorderPanel.Position.South
    panel
  }

  def main(args: Array[String]) {
    val mainFrame = new Frame()
    mainFrame.preferredSize = new Dimension(800, 600)
    mainFrame.contents = initPanel()
    mainFrame.visible = true

  }
}
这样,添加到模型中的值将显示在表中。
当然,在这段代码中,两个case语句没有多大意义;在这种情况下,不需要匹配,因为您总是使用相同的渲染器组件。

是否第一列是0而不是1?多亏了这一点,才解决了这个问题,但异常对您来说似乎相当混乱me@MariuszMarciniakjavax.swing.JTable已经非常混乱了。加上半生不熟的Scala立面,你的困惑会翻两番:-O@0__非常同意,但Scala没有好的GUI框架,这只是一个支持工具app@0__我也同意。最重要的是,如果他们找不到新的维护人员,2.12中就不会出现scala swing。MariuszMarciniak:它可能会消失,这可能对你很重要。@铍我不会担心Scala Swing的未来。我经常用它。据我所知,已经有社区支持继续发展。虽然API有时是不完整的,但Scala Swing是一个相当完整的项目。只是一些组件,如树和表,遭受弱类型或复杂的问题。