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

2024-02-20

我正在尝试使用 Scala/Swing 创建一个表,其中一列由以下内容填充Buttons.

我的出发点是SCells 电子表格示例 http://my.safaribooksonline.com/book/programming/scala/9780981531649/programming-in-scala/chapter_35_the_scells_spreadsh来自奥德斯基等人的book http://www.artima.com/shop/programming_in_scala,特别是使用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
  }
}

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

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

我见过这个问题 https://stackoverflow.com/questions/7907761/how-to-put-buttons-into-swing-table-in-scala (and this one https://stackoverflow.com/questions/1195013/idiomatic-table-cell-renderers-in-scala)并尝试遵循那里的方法(使用Table.AbstractRenderer)但这也不起作用 - 而且对我来说,在该版本中对按钮点击做出反应的地方一点也不明显。 (这种方法是否已经过时?或者 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 教程 http://docs.oracle.com/javase/tutorial/uiswing/components/table.html了解渲染器和编辑器的复杂细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Scala 的 Swing 表中嵌入(工作)按钮? 的相关文章

  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • 使用 LinearLayout 将按钮放在屏幕底部?

    我有以下代码 如何使 3 个按钮位于底部
  • Android - 从渲染线程内结束活动

    下午好 我不熟悉 android 中的活动生命周期 并且一直在尽可能地阅读 但我不知道如何以良好的方式解决以下问题 我有一个使用 GLSurfaceView 的活动来在屏幕上绘制各种内容 在这个 GLSurfaceView 的渲染线程中 我
  • Java制作一条有向线并使其移动

    我想画一条有向线并让它移动 我能够绘制一条有向线并移动该线 但当我移动该线时箭头会移位 这是我的绘画方法 Line2D Double line new Line2D Double startX startY endX endY g2d dr
  • Scala Tuple2Zipped 与 IterableLike zip

    两种实现有什么区别 这个比那个好吗 有一篇博客文章说 Tuple2Zipped 性能更好 但没有提供原因 并且查看源代码我没有看到差异 val l1 List 1 2 3 val l2 List 5 6 7 val v1 l1 zip l2
  • Spark Scala 将列从一个数据帧复制到另一个数据帧

    我有一个原始数据框的修改版本 我在其上进行了聚类 现在我想将预测列恢复为原始 DF 索引没问题 因此匹配 我该怎么做 使用这段代码我得到一个错误 println Predicted dfWithOutput show println Ori
  • 使用spark phoenix从表中读取rdd分区号为1

    当我运行我的火花代码时 val sqlContext spark sqlContext val noact table primaryDataProcessor getTableData sqlContext zookeeper table
  • 对 Scala Not Null 特征的库支持

    Notice 从 Scala 2 11 开始 NotNull已弃用 据我了解 如果您希望引用类型不可为空 则必须混合魔法NotNull特征 编译器会自动阻止你输入null 可以值在里面 看到这个邮件列表线程 http www nabble
  • 根据内容(行数)重置 JTable

    我有一个JTable在 JPanel 中 而 JPanel 又在Jframe The JTable从表中加载用户 数据库位于MySQL 我有一个使用的搜索引擎DNIs其中键对键 带有KeyTyped事件 正在更新表中的联系人 并仅显示符合浏
  • Jlabel HTML 格式

    我有一个 JLabel 里面有一个电子邮件地址 我在 JLabel 上使用了 HTML 格式 因此它显示为链接 但是 您无法单击该链接 事实上 您无法选择标签中的任何文本 我是否可以在 JLabel 上设置一个属性 以允许用户至少选择电子邮
  • scala play框架如何对异步控制器进行单元测试

    使用 Scala play 2 5 版并尝试遵循以下文档中的单元测试控制器指南 https www playframework com documentation 2 5 x ScalaTestingWithScalaTest https
  • Java-创建离散彩虹颜色数组

    很难描述我想要做什么 我基本上想创建一个离散的彩虹渐变 这样对于 i 个 JButton 的任何一行 它们之间的颜色渐变都会看起来彩虹 我已经完成了以下操作 但它实际上只创建了一个红色渐变 然后是绿色渐变 然后是蓝色渐变 Color c n
  • 如何制作行业标准的桌面Java应用程序? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Akka 2 中的调度程序有哪些差异和使用模式?

    我很难理解它们的差异和推荐用法Akka 2 中的调度程序 http doc akka io docs akka current scala dispatchers html 我想我明白了平衡调度程序 http doc akka io api
  • 如何在 Spark Dataframe 中显示完整的列内容?

    我正在使用 Spark csv 将数据加载到 DataFrame 中 我想做一个简单的查询并显示内容 val df sqlContext read format com databricks spark csv option header
  • 用 JavaScript 改变文本颜色?

    我想在单击按钮时更改标题的颜色 这是我的代码 但它不起作用 我不明白为什么不 var about function init about document getElementById about innerHTML about style
  • Jsplitpane 自动调整大小

    我有一个 JSPlitPane 它们之间有 50 的分隔线 这工作正常 但是 当我在右侧添加一些 JLabels 时 jsplitpane 会忽略我的 50 分隔符 左侧窗格会增加其大小 并会挤压右侧窗格 为什么会发生这种情况以及如何解决
  • 向 Scala Swing Panel 添加标签时出现类型不匹配错误

    我有这个课程扩展FlowPanel我正在尝试向其中添加标签 import java awt Label Color import scala swing import scala util Random class MyPanel exte
  • 使用 AbstractTableModel 获取 JTable 中选定的行

    我有一个JTable using AbstractTableModel我在哪里有一个JCheckBox在第一列中用于选择行 现在 我需要从已检查的表中获取选定的行 现在 我按顺序从第一行遍历到最后一行并获取所有选择的行 如下所示 List
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语

随机推荐

  • 如何组合数据框中的连续数据并累加值

    我有一个数据框 Type Volume Date Q 10 2016 6 1 Q 20 2016 6 1 T 10 2016 6 2 Q 10 2016 6 3 T 20 2016 6 4 T 20 2016 6 5 Q 10 2016 6
  • 如何使用 _this_ Jeditable 获取被操纵的 dom 元素的值?

    这是一个延续Jeditable 如何根据dom元素属性设置参数 https stackoverflow com questions 1255596 请在这里回复 这是我的 真实 帐户 我正在尝试将不同的参数值分配给启用了 jQuery 插件
  • 使用 matlab 创建跨图像边界的强度带

    I have this image 8 bit pseudo colored gray scale 我想在其边界周围创建一个特定度量的强度带 我尝试了腐蚀和其他数学运算 包括过滤以实现所需的频带 但一旦我使用腐蚀来切割部分边界 实际图像强度
  • 如何在 Postgresql 中提取子字符串模式

    我有一列包含很多不一致的字符串 其中一些包含具有一致模式的子字符串 2015mmdd AB CD EFG text text HIJ 我想提取它 我觉得这是正则表达式和子字符串命令的交叉情况 到目前为止我最好的方法是相当丑陋的 substr
  • NSURLSession,上传任务 - 获取传输的实际字节数

    我收到错误报告 称我的 iOS 应用程序在连接速度较慢时无法上传图像 虽然我的超时可能不够长 但还有另一个问题 我发现上传进度很快就达到 100 尽管我可以在 Charles 中看到字节仍在传输 我使用 NSURLSession 的以下方法
  • “nice”是否影响Java线程的优先级[重复]

    这个问题在这里已经有答案了 在 Unix 系统上 您可以以较低的 CPU 优先级 运行进程 迂腐地说 它不会改变所谓的 优先级 priority 而是影响可用 CPU 时间的使用份额 这是一般意义上的 优先级 使用nice命令 nice p
  • 如何在pytorch中打印Adadelta中的“实际”学习率

    In short 在 pytorch 中使用 adadelta 优化器时 我无法绘制 lr epoch 曲线 因为optimizer param groups 0 lr 始终返回相同的值 详细 Adadelta 可以仅使用一阶信息随时间动态
  • jquery mobile - 附加 html 内容并应用 JQuery mobile 的样式

    我有一个移动网站 它是通过附加 XML 提要中的数据创建的 最初加载提要及其所有数据 然后当用户浏览站点时从数组中获取正确的提要内容 以前的内容从 div 中清除 并应用新内容 我试图在附加新内容时向 jquery mobile 调用某种
  • 如何从 bash 读取参数[重复]

    这个问题在这里已经有答案了 我很好奇如何通过终端将参数传递到 bash 脚本并读取它们并根据参数处理脚本函数 所以如果我做了类似的事情 scriptname sh install or scriptname sh assets instal
  • Perl 模块 HTML::Template 可以使用除 之外的其他语法吗?

    我正在尝试利用Perl module HTML Template根据文档 它说你可以使用HTML注释而不是标记周围的大于 小于 但它对我不起作用 来自 HTML Template 的 perldoc 如果您热衷于有效的 HTML 并且希望您
  • OCI 运行时执行失败:container_linux.go:344:启动容器进程导致“没有这样的文件或目录”:未知

    我正在运行示例教程Hyperledger Fabric 文档 https hyperledger fabric readthedocs io en release 1 4 html 尝试使用以下命令运行 构建您的第一个网络 示例 byfn
  • Vue 3 - 访问路由器视图实例以调用子方法

    我正在尝试将 Vue 2 x 应用程序迁移到 Vue 3 x 不幸的是 在过去的两天里 我正在努力寻找解决这个简单问题的方法 我的应用程序适用于移动设备 在屏幕顶部有一个顶部栏 左侧和右侧有 2 个上下文按钮 这些按钮触发与我的视图中加载的
  • 带有粘性标题的 flutter DraggableScrollableSheet

    我正在我的 flutter 应用程序中实现 DraggableScrollableSheet 并希望有一个粘性标题 即只有列表视图滚动 并且工作表的顶部始终保持在原位 我的小部件看起来像这样 SizedBox expand child Dr
  • Scintilla 中的交替行着色

    我在用着wxStyledTextCtrl http wiki wxwindows org WxStyledTextCtrl来自 wxPython 一个围绕闪烁体 http www scintilla org 成分 有什么方法可以在其上获得替
  • Lua 中的 OOP - 创建类?

    我知道这个网站上有一些关于在 Lua 中实现 OOP 的问题 但是 这个问题有点不同 至少与我发现的相比 我正在尝试创建一个名为 human 并使其使用 人类 的 新 构造函数创建的对象继承人类内部的所有内容 除了它的构造函数 但是 我也不
  • 如何使用 TypeScript 定义 DynamoDB get 的返回类型?

    I have let resItem Schema resItem await dynamoClient get TableName Key uuid request body uuid promise 但我得到 Type PromiseR
  • WPF 弹出窗口 IsOpen 问题

    使用发现的概念在 StackOverflow 上 https stackoverflow com a 8946055 24399 请注意 ToggleButton IsHitTestVisible一定会Popup IsOpen with S
  • Objective-C ARC:强与保留,弱与分配

    ARC 引入了两个新的内存管理属性 strong and weak 除了copy 这显然是完全不同的东西 之间有什么区别吗strong vs retain and weak vs assign 根据我的理解 这里唯一的区别是weak将分配n
  • 如何扩展Nutch进行文章爬取

    我正在寻找一个框架来抓取文章 然后我找到了Nutch 2 1 这是我的计划和每个计划的问题 1 将文章列表页面添加到 url seed txt 这里有一个问题 我真正想要索引的是文章页面 而不是文章列表页面 但是 如果我不允许列表页面被索引
  • 如何在 Scala 的 Swing 表中嵌入(工作)按钮?

    我正在尝试使用 Scala Swing 创建一个表 其中一列由以下内容填充Buttons 我的出发点是SCells 电子表格示例 http my safaribooksonline com book programming scala 97