您可以通过提供自定义表模型来使列不可编辑。但是,您的单元格必须是可编辑的,因为这是编辑组件变为“活动”状态的唯一方式(重新绘制状态更改、接收鼠标事件)。
在正常渲染中(使用renderComponent
),该组件仅用于“标记”它,即表仅调用paint
在组件上。因此,从性能角度来看,您应该重复使用每个渲染组件的一个实例,而不是创建一个新的实例Label
/ Button
在每次通话中。
所以,你需要重写editor
方法。不幸的是它返回一个简单的javax.swing.table.TableCellEditor
,因此你必须走下坡路javax.swing
东西并释放所有 Scala 的优点......
下面的几乎可以工作。奇怪的是,点击按钮时按钮消失了——不知道为什么:-(
import scala.swing._
import scala.swing.event._
import javax.swing.{AbstractCellEditor, JTable}
import javax.swing.table.TableCellEditor
import java.awt.{Component => AWTComponent}
class TableButtons extends ScrollPane {
private val lb = new Label("")
private val b = new Button
private val buttonEditor = new AbstractCellEditor with TableCellEditor {
listenTo(b)
reactions += {
case ButtonClicked(`b`) =>
println("Clicked")
fireEditingStopped()
}
def getCellEditorValue: AnyRef = "what value?"
// ouch, we get JTable not scala.swing.Table ...
def getTableCellEditorComponent(tab: JTable, value: AnyRef, isSelected: Boolean,
row: Int, col: Int): AWTComponent = {
b.text = "Click!"
b.peer // ouch... gotta go back to AWT
}
}
viewportView = new Table(2, 2) {
rowHeight = 25
override def rendererComponent(isSelected: Boolean, hasFocus: Boolean,
row: Int, column: Int): Component =
if (column == 0) {
lb.text = "Hello"
lb
} else {
b.text = "Click?"
b
}
override def editor(row: Int, col: Int): TableCellEditor =
if (col == 1) buttonEditor else super.editor(row, col)
}
}
val top = new Frame {
title = "Table button test"
contents = new TableButtons
pack()
visible = true
}
无论如何,请检查Oracle JTable 教程 http://docs.oracle.com/javase/tutorial/uiswing/components/table.html了解渲染器和编辑器的复杂细节。