Swing表渲染器组件中的scala.MatchError
当我尝试使用自定义呈现组件向表中添加新行时,我遇到了类java.lang.Integer的scala.MatchError:0: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
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是一个相当完整的项目。只是一些组件,如树和表,遭受弱类型或复杂的问题。