gpt4 book ai didi

swing - 如何在 Scala 的 Swing 表中嵌入(工作)按钮?

转载 作者:行者123 更新时间:2023-12-05 01:32:41 26 4
gpt4 key购买 nike

我正在尝试使用 Scala/Swing 创建一个表,其中一列由 Button 填充。

我的起点是 SCells spreadsheet example来自 Odersky 等人的 book ,特别是使用 rendererComponent 来控制出现在每个单元格中的 Component

不幸的是,虽然这成功创建了一个按钮,但该按钮不可点击。这是一个相当小且独立的示例:

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
}
}

当我运行它时,我得到一个包含两列的表格;第一个包含标签,第二个包含按钮,但按钮不可点击。

可能相关的问题:单元格(包括包含按钮的单元格)是可编辑的。禁用编辑的最佳方法是什么?

我看过 this question (和 this one )并尝试按照那里的方法(使用 Table.AbstractRenderer)但这也行不通 - 而且我根本不清楚在那个版本中在哪里对按钮点击使用react. (这种方法过时了吗?还是 Scala 书中的方法太简单了?)

感谢您的任何建议!

最佳答案

您可以通过提供自定义表格模型使列不可编辑。但是,您的单元格必须是可编辑的,因为这是编辑组件变为“实时”(重新绘制状态更改、接收鼠标事件)的唯一方式。

在正常渲染中(使用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 tutorial渲染器和编辑器的复杂细节。

关于swing - 如何在 Scala 的 Swing 表中嵌入(工作)按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8635737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com