Passendes GUI-Framework für Scala?

Lesezeit: 7 Minuten

Benutzer-Avatar
Jesvin José

Mit geeignet meine ich:

  • ausgereift und ausgiebig genutzt
  • reichhaltiges Widget-Set, das gut gerendert wird
  • idiomatische Scala
  • Ich habe einen WYSIWYG-artigen, aber flexiblen GUI-Builder
  • eigenständige API-Dokumentation (wenn es sich um einen Wrapper handelt, sollte ich nicht auf das übergeordnete Projekt in einer anderen Sprache verweisen)

In keiner bestimmten Reihenfolge.

Welche GUI-Toolkits erfüllen welche Bedingungen?

  • Es ist nicht hilfreich, sich Java-basierte Frameworks nicht anzusehen. Es gibt Scala Swing, das Swing teilweise umschließt und mit Scala geliefert wird. Es gibt wahrscheinlich kleinere Projekte, die versuchen, Scala-Wrapper um Dinge wie JavaFX 2.0 oder SWT herum zu bauen. Ich denke, andere (sogar) Java-Frameworks werden Ihre Anforderungen nicht erfüllen.

    – Zickzackstern

    8. Mai 2012 um 11:12 Uhr


  • Ich glaube nicht, dass es einen GUI-Builder für Scala gibt. Sie können den von NetBeans usw. generierten Java-Code für die automatische Übersetzung in Scala ausschneiden und in IntelliJ einfügen, aber es ist mühsam, wenn Sie anschließend das Layout ändern möchten, und Sie verwenden nur Java Swing, daher ist es nicht idiomatisch, aber leider gibt es aktuell alternativlos.

    – Luigi Plinge

    8. Mai 2012 um 15:17 Uhr


  • Was ich Ihnen vorschlagen werde, ist das, was ich heute für GUI mache. Entwickeln Sie Ihre GUI in HTML(5) und JavaScript (AngularJS ist nett) und dann können Sie einen sehr kleinen Server in Ihrer App entwickeln, um einige REST-ähnliche Dienste für Ihre GUI bereitzustellen. Sie können die App-Seite (localhost:your-server-port) im Standardbrowser des Systems öffnen oder eine Browserkomponente in einen JFrame einbetten. Meine Begründung hinter dieser Lösung ist, dass HTML die plattformunabhängigste und umfangreichste GUI-Bibliothek der Welt ist. Sogar Oracle hat offiziell erklärt, dass Swing nicht sehr lange gewartet wird.

    – ehsun7b

    18. März 2015 um 6:59 Uhr


Benutzer-Avatar
rollen

Scala hat eine eigene Swing-Bibliothek. Dies wird die Standard-Swing-Bibliothek unter der Haube verwenden, aber es hat einige nette Ergänzungen und vor allem, weil es für Scala gemacht wurde, kann es viel präziser verwendet werden als die Standard-Swing-Bibliothek:

import swing._

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

Sehen Sie, wie schön und einfach es ist, Widget-Eigenschaften festzulegen?

Bis auf die schönere Syntax und die kleinen Ergänzungen (wie die SimpleSwingApplication Klasse), ich denke, die Vor- und Nachteile sind so ziemlich die gleichen wie bei Vanilla Swing.

Hier ist ein Überblick über Scala Swing.

  • Sieht das nicht nach vielen Einkerbungen aus? Irgendwas, um den Bumerang-Effekt zu vermeiden?

    – Chetan Bhasin

    10. Oktober 2014 um 19:08 Uhr

ScalaFX ist ein ausgereifter Wrapper um JavaFX 2. Es ähnelt oberflächlich in mancher Hinsicht Scala Swing, hat aber einige Features, die es auszeichnen:

  • Kopplungen zu nativen Grafikbibliotheken – Dies bedeutet Zugriff auf Hardwarebeschleunigung und andere Extras, erfordert jedoch, dass die JavaFX-Laufzeitumgebung auf dem System installiert ist. Es ist in den meisten wichtigen Distributionen von Java 8 enthalten. Dies bedeutet auch, dass es auf den Systemen, mit denen es kompatibel ist, sehr gut gerendert wird.

  • Eigenschaftsbindungen – Dies ist das Killer-Feature für mich. Angenommen, ich habe drei Elemente: A, Bund C. A und B sind in der Größe veränderbar, und C soll eine Höhe haben, die die Summe der Höhen von ist A und B jederzeit. In Swing würde dies das Schreiben einer Reihe von benutzerdefinierten Ereignis-Listenern beinhalten, um diese Arbeit auszuführen. Mit ScalaFX-Bindungen können Sie dies einfach ausdrücken, indem Sie den Property-Bind-Operator verwenden: C.height <== A.height + B.height. Dies sorgt neben anderen Merkmalen für ein sehr Scala-idiomatisches Gefühl.

  • JavaFX Scene Builder (zum Zeitpunkt des Schreibens in der Beta-Version) ist ein WYSIWYG-GUI-Editor (ich habe ihn jedoch nicht ausprobiert).

  • Die Dokumentation ist seine Schwachstelle. Als Wrapper bezieht es sich oft auf die JavaFX-Dokumentation.

Ich verwende Java-Swing. So schlägt es sich mit Ihren Anforderungen:

  • ausgereift und ausgiebig genutzt: ja, eine Tonne.

  • Reichhaltiges Widget-Set und gute Darstellung: darüber lässt sich streiten. Wenn Sie die Möglichkeit in Betracht ziehen, Java Swing einfach mit zusätzlichen Bibliotheken (z. B. SwingX) zu ergänzen, ist es in dieser Hinsicht zumindest besser als Scala Swing, wenn auch wahrscheinlich nicht so gut wie einige andere Java-Toolkits (obwohl ich zu denen nicht sprechen kann). .

  • idiomatische Scala: nicht so schlimm, wie Sie vielleicht denken. Ein paar Hilfsfunktionen machen es besser:

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

    Damit Sie tun können

    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)))
    

    Was nun die Ereignisse und den Zustand betrifft, so ist dies meiner Meinung nach immer noch eine grobe Kante alle GUI-Frameworks — Listener haben ihre Probleme, Event-Streams haben ihre Probleme. Ich hatte allgemeinen Erfolg bei der Erweiterung von Swing-Events mit reaktiver Kern und Redo-Signale (mein eigenes, undokumentiert), um es einfacher zu machen, den Staat zu organisieren.

    Sie können die Ausführlichkeit beim Definieren von Listenern mit ein paar weiteren Hilfsfunktionen wie

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

    und

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

    Ich persönlich wünschte, Scala Swing hätte diesen Weg eingeschlagen. Das Schreiben von Wrappern für vorhandene Java-Klassen ist O(n)-Programmiererzeit und bringt Ihnen nichts für die Klassen, für die die Autoren keine Wrapper schreiben wollten. Das Erstellen von generischem syntaktischem Zucker bringt Sie viel schneller weiter.

  • Ich habe einen WYSIWYG-artigen, aber flexiblen GUI-Builder: Ich verwende IntelliJ IDEA-Formulare, um eine abstrakte Klasse zu erstellen, und untergliedere sie dann mit einer Scala-Klasse. Die organisatorischen Kosten betragen nur 1 zusätzliche Datei, und ich schreibe keinen Java-Code.

  • Eigenständige API-Dokumentation: Ja.

Jetzt, da einige Zeit vergangen ist, ist es erwähnenswert, dass ScalaJS auch eine Option ist, die in Betracht gezogen werden sollte.

Gegen Ihre Anforderungen:

  • ausgereift und ausgiebig verwendet — HTML/CSS/JS sind es, ScalaJS nicht (aber es ist überraschend gut, wenn man bedenkt). Sie können also auf ScalaJS-spezifische Hänger stoßen, aber die zugrunde liegende Technologie ist sehr robust.
  • Reichhaltiges Widget-Set, das gut gerendert wird – Ja.
  • idiomatische Scala — Nein: Sie werden am Ende viel jquery verwenden, das meistens dynamisch typisiert wird. ScalaTags trägt viel dazu bei, dass es besser wird.
  • Ich habe einen WYSIWYG-artigen, aber flexiblen GUI-Builder – ja, viele.
  • Standalone-API-Dokumentation (wenn es sich um einen Wrapper handelt, sollte ich nicht auf das übergeordnete Projekt in einer anderen Sprache verweisen) — Ja.

Der Nachteil ist, dass Ihre GUI von der JVM in den Browser verschoben wird, sodass Sie nicht alle diese Java-Bibliotheken verwenden können.

Ich würde sagen, verwenden Sie .Net, es ist ausgereift und wird ausgiebig verwendet.

Aber …

Ich gehe davon aus, dass Sie Scala verwenden müssen. Dafür würde ich mich an Java halten, da es eine bessere Tool-Unterstützung wie in IDEA oder NetBeans hat. Sie können natürlich Java und Scala mischen. Ihre GUI kann also in Java ausgeführt werden, das das Scala-Backend aufruft. Werfen Sie auch einen Blick auf JGoodies, sie haben viele nette Sachen, um die Benutzeroberfläche in Swing zu erstellen. Im Moment gibt es keine Tool-Unterstützung für Scala-GUI-Anwendungen (und für Nicht-GUI-Anwendungen ist es immer noch hinter Java).

  • JGoodies Binding ist eine wirklich gute Möglichkeit, eine Benutzeroberfläche funktional zu beschreiben. Sein ValueModel-Konzept ist Lenses sehr ähnlich. Ich wünschte, jemand würde einen Scala-Wrapper oder eine Implementierung schreiben.

    – Felix Leibold

    7. November 2014 um 14:24 Uhr

  • Können Sie .Net von Java aus aufrufen?

    – vy32

    24. Oktober 2015 um 12:04 Uhr

  • Okey … aber auf welche Weise ist dies eine Antwort auf die Frage?

    – Emrys Myrooin

    9. Mai 2016 um 7:52 Uhr

  • JGoodies Binding ist eine wirklich gute Möglichkeit, eine Benutzeroberfläche funktional zu beschreiben. Sein ValueModel-Konzept ist Lenses sehr ähnlich. Ich wünschte, jemand würde einen Scala-Wrapper oder eine Implementierung schreiben.

    – Felix Leibold

    7. November 2014 um 14:24 Uhr

  • Können Sie .Net von Java aus aufrufen?

    – vy32

    24. Oktober 2015 um 12:04 Uhr

  • Okey … aber auf welche Weise ist dies eine Antwort auf die Frage?

    – Emrys Myrooin

    9. Mai 2016 um 7:52 Uhr

1176780cookie-checkPassendes GUI-Framework für Scala?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy