2009-07-16 92 views
8

为了响应previous question关于如何使用Swing实现特定效果,我被引导至JDesktopPane和JInternalFrame。不幸的是,scala.swing似乎没有任何类的封装,所以我只剩下扩展它。如何扩展scala.swing?

我该怎么知道和做什么才能使这些类的最小可用包装,与scala.swing一起使用,以及使用其中大部分步骤的额外步骤是什么?

编辑:

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

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

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

请注意:

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

  • 阅读现有的scala.swing类的源代码来学习如何做到这一点,我试图避免这个问题的工作。

回答

0

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

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

Java in scala

0

你想用什么样的scala功能?这可能有助于提出一个答案。即 - 你试图用Java做什么?然后我们可以试着想出一个更好的方式来使用Scala来实现它,并且/或者为这些类创建一个包装器,这会让你试图做的更容易。

+0

不够公平。我会推荐我的问题。 – 2009-07-18 15:02:27

+0

感谢您的额外信息,但我的意思是在更技术层面 - 即以编程方式,您想用Swing课程做什么? – 2009-07-19 10:04:43

3

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

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

现在定义一个类RichJInternalFrame(),这需要的JInternalFrame,并有你喜欢的任何方法的JInternalFrame与延伸,例如:

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

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

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

斯卡拉将自动转换JIF成RichJInternalFrame,让你在其上调用此方法。

0

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

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