如何使用 SuperMixin 创建 Scala swing 包装类?

2024-01-27

我试图从该线程的答案中了解以下类的工作原理:Scala 弹出菜单 https://stackoverflow.com/questions/938753/scala-popup-menu/6440072#6440072

由于该线程很旧,我决定开始一个新问题。我是 Scala 新手,有 Java 背景,我想知道这个类是如何工作的。我读到一个与类同名的对象就像一个带有单例对象的类?我不确定这如何适合实现包装器。(为什么我们需要该对象?)

SuperMixin 特性到底有什么作用? API 表示“此特征用于将某些调用从对等方重定向到包装器并返回。对于公开可通过重写进行自定义的方法很有用。”这并不能很好地向初学者解释。

如果有人能帮助向初学者解释这个类和对象(在我看来,神奇地)如何为我提供 JPopupMenu 的包装类,并让我调用使 popupMenu 出现在屏幕上的 show 方法,我将非常感激。 .并且似乎我可以设置其内容(contents+= some scala.swing.menuItem),而无需在下面的类中定义它?

import javax.swing.JPopupMenu
import scala.swing.{ Component, MenuItem }
import scala.swing.SequentialContainer.Wrapper

object PopupMenu {
  private[PopupMenu] trait JPopupMenuMixin { def popupMenuWrapper: PopupMenu }
}

class PopupMenu extends Component with Wrapper {

  override lazy val peer: JPopupMenu = new JPopupMenu with PopupMenu.JPopupMenuMixin with SuperMixin {
    def popupMenuWrapper = PopupMenu.this
  }

  def show(invoker: Component, x: Int, y: Int): Unit = peer.show(invoker.peer, x, y)

  /* Create any other peer methods here */
}

The 伴生对象 for PopupMenu除了充当辅助特征的名称空间之外,这里没有任何特定目的JPopupMenuMixin。然后可以通过使其“隐藏”此特征private[PopupMenu],所以只有类知道PopupMenu及其伴生对象。

坦白说,我不明白这个特性的目的。它定义了一个方法popupMenuWrapper指向外部 Scala Swing 组件,但根本没有使用该方法。因此,一个不太令人困惑的版本很简单:

import scala.swing._
import javax.swing.JPopupMenu

class PopupMenu extends Component with SequentialContainer.Wrapper {
  override lazy val peer: JPopupMenu = new JPopupMenu with SuperMixin

  def show(invoker: Component, x: Int, y: Int): Unit = peer.show(invoker.peer, x, y)
}

Test:

val pop = new PopupMenu {
  contents += new MenuItem("Foo")
}
lazy val but: Button = Button("Test") {
  pop.show(but, 0, 0)
}
val f = new Frame {
  contents = but
  pack().centerOnScreen()
  open()
}

包装器唯一需要的就是扩展scala.swing.Component并覆盖peer与底层资产的价值javax.swing成分。混音with SuperMixin 重写一些方法 https://github.com/scala/scala/blob/v2.10.3/src/swing/scala/swing/Component.scala#L51该组件的,例如paintComponent,以便将它们转发到外包装组件。就这样。

包装纸混合在SequentialContainer.Wrapper这允许contents +=添加菜单项的操作。

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

如何使用 SuperMixin 创建 Scala swing 包装类? 的相关文章

  • 将参数传递给 Scala 对象

    是否可以从外部对象初始化 Scala 对象 我尝试初始化的 Scala 对象没有任何 Companion 类 这是一个例子 object ObjectA val mongoDBConnectionURI This is the Val th
  • JFrame 和 JDialog 有什么区别?

    和有什么区别JFrame and a JDialog 为什么我们不能使用setDefaultCloseOperation JDialog EXIT ON CLOSE 对于 JDialog JFrame是一个普通窗口 带有普通按钮 可选 和装
  • 生成 k 个成对独立的哈希函数

    我正在尝试实施一个计数最小草图 http en wikipedia org wiki Count Min sketchScala中的算法 所以我需要生成k个成对独立的哈希函数 这是一个比我以前编写过的任何东西都低的级别 除了算法类之外 我对
  • 如何将Spark DataFrame插入Hive内表?

    以追加模式将 DF 插入 Hive 内部表的正确方法是什么 看来我们可以使用 saveAsTable 方法直接将 DF 写入 Hive 或将 DF 存储到临时表然后使用查询 df write mode append saveAsTable
  • 方法返回类型的类型推断

    当存在显式方法时 为什么 Scala 无法推断方法的返回类型return方法中使用的语句 例如 为什么下面的代码可以编译 object Main def who 5 def main args Array String println wh
  • java中的配置文件

    我创建了一个 Swing 应用程序 GUI 其中包含文本字段 标签 复选框和组合框等字段 当用户输入一些信息时 我希望将文本字段 组合框和复选框的详细信息保存到文件中 并且下次用户打开此窗口时 我希望将已保存在文件中的详细信息 即那些用户上
  • 如何跟踪通过elastic4s客户端发送到Elasticsearch的json请求?

    假设我使用这样的代码 ElasticClient client client execute search in places gt cities query paris start 5 limit 10 如何查看发送到 Elasticse
  • 在sbt的build.sbt文件中添加模块依赖信息

    我在 IntelliJ 中有一个多模块项目 如该屏幕截图所示 contexProcessor 模块依赖于 contextSummary 模块 一旦我在项目结构中设置了依赖项 IntelliJ 就会处理所有事情 然而 当我跑步时sbt tes
  • 基于 Java 的 Swing 浏览器应支持 JavaScript

    在我的公司 我正在实现一个基于java的html浏览器 我发现很多工具只能在 Swing 中生成完整的浏览器 它们看起来像 Mozilla 但我没能找到支持 JavaScript 的浏览器 我将实现的浏览器应该在 HTML 端执行 Java
  • 在 URL 中嵌入 ETag

    有关 Play 中资产指纹识别的问题 如何要求 Play 在 URL 中嵌入 ETag 而不使用第三方插件 例如 如果 css resource cssETag 为1234 那么它就会变成 css responsive 1234 css 相
  • Scala 中简单表达式的非法开始

    我刚刚开始学习scala 在尝试实现递归函数时 我在 Eclipse 中收到错误 简单表达式的非法开始 def foo total Int nums List Int if total nums sorted head 0 0 else r
  • tokio::net::TcpStream 如何实现 tokio::prelude::Stream?

    In the tokio rs https tokio rs docs getting started echo 在文档中我们看到以下片段 split the socket stream into readable and writable
  • 如何在不进行硬编码的情况下使用 Cake 模式进行依赖注入?

    我刚刚阅读并享受蛋糕图案文章 http jonasboner com real world scala dependency injection di 然而 在我看来 使用依赖项注入的关键原因之一是您可以改变 XML 文件或命令行参数所使用
  • 我需要比较两个数据帧以进行类型验证并发送非零值作为输出

    我正在比较两个数据帧 基本上 这些是两个不同数据源的模式 一个来自 hive 另一个来自 SAS9 2 我需要验证两个数据源的结构 因此我将模式转换为两个数据帧 它们是 SAS 架构将采用以下格式 scala gt metadata sho
  • 您最好的 Swing 设计模式和技巧是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将一个组件放在其他组件之上?

    我有一个JScrollPanel其中包括一个大面板 其本身包括 3 个内面板 我想将一个面板 例如 放在一个特殊的位置 以便始终可以看到 我的意思是用户可以滚动到想要的任何地方 但该面板始终位于其他组件的顶部并且不会移动 我试图通过这样做J
  • JProgressBar 不在循环内更新

    我目前正在自学Java 我一直在尝试不同的事情 比如JRadioButtons JcomboBoxes 等 现在 我正在尝试使用JProgressBar但它似乎无法正常工作 相关代码段 JProgressBar progress JButt
  • SwingWorker 在另一个 SwingWorker 的 did 方法中

    首先 我需要通知您 我正在尽最大努力学习如何用 Java 编写代码 虽然有点困难 但我相信我能做到 我过去提交了几个有关 SwingWorkers 等的问题 每一个我都以为我已经做到了 但后来发现我仍然需要学习 希望这一次不是那样的一次 话
  • 如何使 JScrollPane 与嵌套 JPanel 一起正常工作?

    我正在使用 NetBeans 在 Java 中构建 Swing 应用程序 但我遇到布局问题 我的主框架包含一个JScrollPane其中包含一个JPanel called contentPanel其中又包含一个JPanel called l
  • 使用 Scala 在 Apache Spark 中拆分字符串

    我有一个数据集 其中包含以下格式的行 制表符分隔 Title lt t gt Text 现在对于每个单词Text 我想创建一个 Word Title 一对 例如 ABC Hello World gives me Hello ABC Worl

随机推荐