web-dev-qa-db-ja.com

Scalaに適したGUIフレームワーク?

適切とは

  • 成熟し、広く使用されている
  • よくレンダリングされる豊富なウィジェットセット
  • 慣用的なScala
  • WYSIWYGに似た柔軟なGUIビルダーを手に入れた
  • スタンドアロンAPIドキュメント(ラッパーの場合、別の言語で親プロジェクトを参照させないでください)

順不同です。

どのGUIツールキットがどの条件を満たすか?

68
Jesvin Jose

Scalaには独自のSwingライブラリがあります。これはボンネットの下で標準のSwingライブラリを使用しますが、いくつかの素敵な追加があります。最も注目すべきは、Scala用に作られているため、標準のSwingライブラリよりもはるかに簡潔に使用できることです。

import swing._

object HelloWorld extends SimpleSwingApplication {
  def top = new MainFrame {
    title = "Hello, World!"
    contents = new Button {
      text = "Click Me!"
    }
  }
}

ウィジェットのプロパティを設定するのがいかに簡単で簡単かをご覧ください。

より良い構文と小さな追加(SimpleSwingApplicationクラスなど)を除いて、長所と短所はVanilla Swingとほぼ同じだと思います。

Scala Swing の概要)です。

36
rolve

ScalaFXはJavaFX 2の成熟したラッパーです。表面的には、Scala Swingと似ていますが、いくつかの特徴があります。

  • ネイティブグラフィックライブラリへのカップリング-これは、ハードウェアアクセラレーションおよびその他の機能へのアクセスを意味しますが、JavaFXランタイムがシステムにインストールされている必要があります。これは、Java 8のほとんどの主要な配布に含まれています。これは、互換性のあるシステムで非常によくレンダリングされることも意味します。

  • プロパティのバインディング-これは私にとってのキラー機能です。 AB、およびCの3つの要素があるとします。 ABはサイズ変更が可能で、CABの高さの合計である高さを持つことになっています常に。 Swingでは、この作業を実行するカスタムイベントリスナーのセットを作成する必要があります。 ScalaFXバインディングでは、プロパティバインド演算子を使用するだけでこれを表現できます:C.height <== A.height + B.height。これは、他の機能の中でもとりわけ、非常にScalaのイディオマティックな雰囲気を作り出します。

  • JavaFX Scene Builder(執筆時点ではベータ版)は、WYSIWYG GUIエディターです(ただし、試していません)。

  • ドキュメントはその弱点です。ラッパーであるため、JavaFXのドキュメントを参照することがよくあります。

22
evilcandybag

私はJava Swingを使用します。要件に応じて次のように積み重ねます。

  • 成熟しており、広く使用されています。はい、トン。

  • 豊富なウィジェットの設定とレンダリング:議論の余地があります。 Java SwingXを追加したライブラリでSwingを簡単に補完する機能を検討する場合、少なくともこの点に関しては、Scala Swingよりも優れていますが、他のいくつかのJavaツールキットとは異なります(私はそれらと話すことはできませんが)。

  • 慣用的なScala:思っているほど悪くはありません。いくつかのヘルパー関数がそれを改善します:

    implicit class And[A](a: A) {
      def and(f: A => Unit): A = {
        f(a); a
      }
    }
    

    あなたができるように

    val button = (new JButton("Press me!")
        and (_ setForeground Color.red)
        and (_ setFont new Font(null, Font.PLAIN, 12)))
    
    val win = (new JFrame("Hello!")
      and (_ add button)
      and (_ pack())
      and (_ setDefaultCloseOperation JFrame.EXIT_ON_CLOSE)
      and (_ setVisible(true)))
    

    今、イベントと状態については、これはまだ、私の意見では、allguiフレームワークの大まかなエッジです-リスナーには問題があり、イベントストリームには彼らの問題。状態を整理しやすくするために、Swingのイベントを reactive-core および redo-signals (ドキュメント化されていない独自の)==で増強することに成功しました。

    次のようないくつかのヘルパー関数を使用して、リスナーを定義する冗長性を改善できます。

      def actionListener(f: => Unit) = new ActionListener {
        def actionPerformed(e: ActionEvent) { f }
      }
    

    そして

      def later(thing: => Unit) {
        SwingUtilities.invokeLater(new Runnable {
          def run() {
            thing
          }
        })
      }
    

    個人的に、私はScala Swingがこのルートを取ったことを望みます。既存のJavaクラスのラッパーはO(n)プログラマー作成者がラッパーを作成することを選択しなかったクラスについては何も取得できません。汎用の構文糖衣を作成すると、はるかに高速になります。

  • WYSIWYGに似た柔軟なGUIビルダーを手に入れました。IntelliJIDEA=フォームを使用して抽象クラスを作成し、それをScalaクラスでサブクラス化します。組織のコストはたった1つの追加ファイルであり、Javaコードはありません。

  • スタンドアロンAPIドキュメント:はい。

16
Owen

時間が経った今、ScalaJSも考慮すべきオプションであることに注意する価値があります。

要件に対して:

  • 成熟し、広範囲に使用されています-HTML/CSS/JSはそうではありませんが、ScalaJSはそうではありません(しかし、驚くほど良いことです)。そのため、ScalaJS固有のハングアップに遭遇する可能性がありますが、基盤となるテクノロジーは非常に堅牢です。
  • よくレンダリングされる豊富なウィジェットセット-はい。
  • idiomatic Scala-いいえ:最終的には多くのjqueryを使用することになり、ほとんどが動的に型指定されます。 ScalaTags はそれを改善するために多くのことを行います。
  • WYSIWYGに似た、しかし柔軟なGUIビルダーを手に入れました-はい、たくさん。
  • スタンドアロンAPIドキュメント(ラッパーの場合、別の言語で親プロジェクトを参照させないでください)-はい。

欠点は、GUIをJVMからブラウザに移動するため、これらすべてのJavaライブラリを使用できないことです。

5
Owen