8

针对之前的一个问题,如何用 Swing 实现一定的效果,我被定向到 JDesktopPane 和 JInternalFrame。不幸的是,scala.swing 似乎没有任何一个类的包装器,所以我只剩下扩展它了。

我必须知道和做什么才能为这些类制作最少可用的包装器,以便与 scala.swing 一起使用并由 scala.swing 使用,以及制作其中大部分的额外步骤是什么?

编辑:

根据某人的建议,让我解释一下我打算达到的效果。我的程序控制(个人)彩票投注。所以我有很多不同的票,每张票可以有很多不同的赌注和不同的有效性。

这个想法是在一个单独的“空间”中显示这些票证中的每一个,而 JInternalFrames 似乎正是我想要的,让人们创建新票证,从文件中加载它们,将它们保存到文件中,并通常检查或编辑信息每一个。

除此之外,还需要一个展示彩票结果的空间,我打算改进这个程序,使其能够控制集体投注——谁贡献了多少,以及如何分配任何中奖。我还没有考虑过那个接口。

请注意:

  • 我不能“只使用”Java 类,而仍然充分利用 Scala swing 特性。上一个问题中的答案已经告诉我如何使用 Java 类做我想做的事,而这不是我在这里要问的。

  • 阅读现有 scala.swing 类的源代码以了解如何去做是我试图避免这个问题的工作。

4

5 回答 5

3

您可能会考虑 Scala 的“隐式转换”机制。你可以这样做:

implicit def enrichJInternalFrame(ji : JInternalFrame) = 
               new RichJInternalFrame(ji)

您现在定义了一个 RichJInternalFrame() 类,该类采用 JInternalFrame,并具有您想要扩展 JInternalFrame 的任何方法,例如:

class RichJInternalFrame(wrapped : JInternalFrame) {
   def showThis = {
     wrapped.show()
   }
}

这将创建一个新方法 showThis,它只调用 JInternalFrame 上的 show。您现在可以在 JInternalFrame 上调用此方法:

val jif = new JInternalFrame()
println(jif.showThis);

Scala 会自动将 jif 转换为 RichJInternalFrame 并让您在其上调用此方法。

于 2009-07-25T14:31:02.857 回答
0

您可能可以使用scala.swing源作为参考,例如http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk/src/swing/scala/swing/Button.scala

于 2009-07-17T09:36:20.190 回答
0

您尝试使用哪种 scala 功能?这可能有助于提出答案。即 - 你试图用它做什么,可能是在 Java 中?然后我们可以尝试想出一个更好的方法来使用 Scala 和/或为类创建一个包装器,这将使您尝试做的事情变得更加容易。

于 2009-07-18T06:39:40.460 回答
0

您可以将所有 java 库直接导入到您的 scala 代码中。

试试 scala 教程部分:“与 Java 的交互”。

Scala中的Java

于 2009-07-17T04:48:13.297 回答
0

在 JRuby 中,您可以将一个(或多个)特征混合到 JDesktopPane 或 JInternalFrame 中,而不是扩展它们。这样您就不必包装类,而只需使用现有对象。据我所知,这对于 Scala 特征是不可能的。

幸运的是,有一个几乎和 Ruby 一样灵活的解决方案:词法开放类。这篇博客文章给出了很好的介绍,恕我直言。

于 2009-07-25T21:14:27.783 回答