如何在Scala中的Swing表中嵌入(工作)按钮?
我试图使用Scala/Swing创建一个表,其中一列由如何在Scala中的Swing表中嵌入(工作)按钮?,swing,scala,button,renderer,Swing,Scala,Button,Renderer,我试图使用Scala/Swing创建一个表,其中一列由按钮s填充 我的出发点是来自Odersky等人的,特别是使用RenderComponent来控制每个单元格中出现的组件 不幸的是,虽然这成功创建了一个按钮,但该按钮不可单击。下面是一个合理的最小且自包含的示例: import swing._ import swing.event._ class TableButtons extends ScrollPane { viewportView = new Table(2,2) { ro
按钮s填充
我的出发点是来自Odersky等人的,特别是使用RenderComponent
来控制每个单元格中出现的组件
不幸的是,虽然这成功创建了一个按钮,但该按钮不可单击。下面是一个合理的最小且自包含的示例:
import swing._
import swing.event._
class TableButtons extends ScrollPane {
viewportView = new Table(2,2) {
rowHeight = 25
override def rendererComponent(isSelected: Boolean, hasFocus: Boolean,
row: Int, column: Int): Component =
if (column == 0) {
new Label("Hello")
} else {
val b = new Button { text = "Click" }
listenTo(b)
reactions += {
case ButtonClicked(`b`) => println("Clicked")
}
b
}
}
}
object Main extends SimpleSwingApplication {
def top = new MainFrame {
title = "Table button test"
contents = new TableButtons
}
}
当我运行这个时,我得到一个有两列的表;第一个包含标签,第二个包含按钮,但按钮不可单击
可能相关问题:单元格(包括包含按钮的单元格)可编辑。禁用编辑的最佳方法是什么
我已经看过(和)并尝试过采用这种方法(使用Table.AbstractRenderer
),但这也不起作用——而且我根本不知道在那个版本中,在哪里可以对按钮点击做出反应。(这种方法过时了吗?还是Scala手册中的方法过于简单?)
谢谢你的建议 通过提供自定义表模型,可以使列不可编辑。但是,单元格必须是可编辑的,因为这是编辑组件变为“活动”(重新绘制状态更改、接收鼠标事件)的唯一方式
在正常渲染(使用renderComponent
)中,组件仅用于“标记”它,即表仅调用组件上的paint
。因此,在性能方面,您应该重复使用每个渲染组件的一个实例,而不是在每次调用中创建一个新的标签
/按钮
因此,您需要重写编辑器
方法。不幸的是,它返回的是一个普通的javax.swing.table.TableCellEditor
,因此您必须跳转到普通的javax.swing
内容并释放所有Scala元素
下面的方法几乎奏效。奇怪的是,当点击按钮时,按钮消失了——不知道为什么:-(
无论如何,请查看渲染器和编辑器的复杂细节。谢谢!我的表格只有几行,因此多个标签/按钮的性能影响应该不会有问题,但这样做很好。我也会看一看教程。干杯!我认为应该使用table.peer.setDefaultEd编辑器
而不是覆盖编辑器
。
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
}