在同一个项目中同时进行Java和Scala开发

时间:2009-06-23 08:02:23

标签: java eclipse netbeans scala

我想以熟悉的Swing方式开发用户界面时利用Scala的Actor Framework。

是否可以在Eclipse,NetBeans或任何其他IDE中使用混合的Java-Scala项目?

7 个答案:

答案 0 :(得分:21)

Eclipse的“官方”Scala插件允许您将“scala性质”添加到任何项目,以及Java性质。这允许你按照自己的意愿混合搭配。

我昨晚第一次玩scala,使用Eclipse IDE,效果非常好。


另外,我刚看过这篇文章:http://www.codecommit.com/blog/scala/joint-compilation-of-scala-and-java-sources

似乎scalac已经足够了解java能够解析java源代码的依赖关系而不实际编译它们。很聪明。

答案 1 :(得分:5)

Intellij在支持混合Java / Scala项目方面做得很好。目前,Intellij中的Scala支持对我来说比Eclipse的Scala IDE更好。 (我一直是Eclipse的老用户,最近在其他一些Scala程序员的推荐下尝试了Intellij)。

答案 2 :(得分:2)

混合JAVA(Netbeans GUI-Builder)和Scala-Swing:

我刚刚创建了一个带有GUI-Builder和一些控件和简单逻辑的新JPanel。

然后创建一个Scala对象,如Scala-Swing教程中所示:

object MySampleView extends Frame { title = "SomeTitle" ...

然后我将新的JPanel添加到内容中:

   contents = new Component { override lazy val peer = new MySampleJPanel() }

编译项目时,我会在GUI-Builder Cool中看到JPanel的每次更改。

答案 3 :(得分:1)

您是否尝试过Scala的Swing包装器?它是非常轻量级的,因为你总是可以访问底层的Swing类,但是经过深思熟虑。我发现它很愉快 - react 模式使事件处理变得更加容易,并且actor框架使事件传播比使用PropertyChangeSupport

更加清晰

完全可以将它与您自己的自定义Swing小部件一起使用。

答案 4 :(得分:1)

我已经在我的应用程序中成功混合了Java和Scala。它在Goggle App Engine中运行,我使用Spring MVC作为UI。 (稍后将移至Lift)

Intellij的插件是一个很好的帮助。虽然现在还处于早期阶段,但偶尔会出现问题。 (例如,Scala插件编译器似乎不太喜欢JDO增强的Java类...有一个解决方法,我相信这个bug很快就会修复)。

我发现混合的唯一一件事就是处理在Scala中返回Java集合类的Java API。它非常笨重,你必须跳过一些箍。

答案 5 :(得分:0)

Scala plugins for NetBeans也表现不错。使用NetBeans使Swing开发变得如此简单,它可能正是您所寻找的:)

答案 6 :(得分:0)

大!!!感谢您分享这个想法。

为了补充,下面的代码使用GUI编辑器(我使用WindowBuilder + Eclipse + Scala插件)​​来设计GUI,然后使用Scala完成其他所有操作。现在可以使用Java Swing GUI编辑器并在Scala中完成所有编程。

import swing._
import event._
object TestApp extends Frame {
def main(args: Array[String]): Unit = {
    title = "Scala Swing Test App"
    val gui = new MyTestPanel() // a JPanel class from the GUI Editor
    val button = new Button {override lazy val peer = gui.getBtnMyButton()}
            // getBtnMyButton() is generated in the Gui Editor (Expose Component)
    contents = new Component{ override lazy val peer = gui }
    this.listenTo(button)
    reactions += {
        case ButtonClicked(b) => println("BUTTON CLICK.")
    }
    this.visible = true
} }

Mvackel