如何扩展scala.swing?

时间:2009-07-16 21:14:13

标签: user-interface scala scala-swing

对于如何使用Swing实现某种效果的previous question,我被引导到JDesktopPane和JInternalFrame。不幸的是,scala.swing似乎没有任何一个类的包装器,所以我只剩下它了。

我需要知道什么才能为这些类创建最低限度的包装器,与scala.swing一起使用,以及制作大多数这些类的附加步骤是什么?

修改

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

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

除此之外,还需要有一个空间来显示彩票结果,我打算进一步发展该计划,以便能够控制集体投注 - 谁贡献了多少,以及如何分配任何获胜。我还没有考虑过这个界面。

请注意:

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

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

5 个答案:

答案 0 :(得分: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,并允许您在其上调用此方法。

答案 1 :(得分:0)

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

尝试使用scala教程部分:“与Java交互”。

Java in scala

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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