Par convenable, je veux dire:
Dans aucun ordre particulier.
Quelles boîtes à outils GUI satisfont à quelles conditions?
Scala possède sa propre bibliothèque Swing. Cela utilisera la bibliothèque Swing standard sous le capot, mais il a quelques ajouts sympas et notamment, car il est fait pour Scala, il peut être utilisé de manière beaucoup plus concise que la bibliothèque Swing standard:
import swing._
object HelloWorld extends SimpleSwingApplication {
def top = new MainFrame {
title = "Hello, World!"
contents = new Button {
text = "Click Me!"
}
}
}
Vous voyez à quel point il est agréable et facile de définir les propriétés des widgets?
Sauf pour la syntaxe plus agréable et les petits ajouts (comme la classe SimpleSwingApplication
), je pense que les avantages et les inconvénients sont à peu près les mêmes qu'avec Vanilla Swing.
Voici un Présentation de Scala Swing .
ScalaFX est un wrapper mature autour de JavaFX 2. Il est superficiellement similaire à Scala Swing à certains égards, mais possède certaines fonctionnalités qui le distinguent:
Couplages aux bibliothèques graphiques natives - Cela signifie l'accès à l'accélération matérielle et à d'autres avantages, mais nécessite que le runtime JavaFX soit installé sur le système. Il est inclus dans la plupart des principales distributions de Java 8. Cela signifie également qu'il rend très bien sur les systèmes avec lesquels il est compatible.
Liaisons de propriété - C'est la fonctionnalité la plus intéressante pour moi. Disons que j'ai trois éléments: A
, B
et C
. A
et B
sont redimensionnables et C
est supposé avoir une hauteur qui est la somme des hauteurs de A
et B
de tout temps. Dans Swing, cela impliquerait d'écrire un ensemble d'écouteurs d'événements personnalisés pour effectuer ce travail. Les liaisons ScalaFX vous permettent d'exprimer cela simplement en utilisant l'opérateur de liaison de propriété: C.height <== A.height + B.height
. Cela, entre autres caractéristiques, donne une sensation très Scala-idiomatique.
JavaFX Scene Builder (en version bêta au moment de l'écriture) est un éditeur d'interface graphique WYSIWYG (je ne l'ai pas essayé, cependant).
La documentation est son point faible. Étant un wrapper, il renvoie souvent à la documentation JavaFX.
J'utilise Java Swing. Voici comment cela se compare à vos besoins:
mature et largement utilisé: oui, une tonne.
jeu de widgets riche et bien rendu: c'est discutable. Lorsque vous envisagez la possibilité de compléter facilement Java Swing avec des bibliothèques supplémentaires (par exemple SwingX), cela fait au moins mieux que Scala Swing à cet égard, bien que probablement pas aussi bien que d'autres Java toolkits (bien que je ne puisse pas en parler)).
scala idiomatique: pas aussi mauvais qu'on pourrait le penser. Quelques fonctions d'aide améliorent les choses:
implicit class And[A](a: A) {
def and(f: A => Unit): A = {
f(a); a
}
}
Pour que vous puissiez faire
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)))
Maintenant, en ce qui concerne les événements et l'état, c'est toujours, à mon avis, un bord approximatif dans tous les cadres de l'interface graphique - les auditeurs ont leurs problèmes, les flux d'événements ont leurs problèmes. J'ai généralement réussi à augmenter les événements de Swing avec reactive-core et redo-signaux (le mien, non documenté) afin de faciliter l'organisation de l'état.
Vous pouvez améliorer la verbosité de la définition d'écouteurs avec quelques fonctions d'assistance supplémentaires comme
def actionListener(f: => Unit) = new ActionListener {
def actionPerformed(e: ActionEvent) { f }
}
et
def later(thing: => Unit) {
SwingUtilities.invokeLater(new Runnable {
def run() {
thing
}
})
}
Personnellement, je souhaite que Scala Swing ait pris cette route. L'écriture de wrappers pour les classes Java existantes est O(n) programmeur) temps et ne vous donne rien pour les classes pour lesquelles les auteurs n'ont pas choisi d'écrire des wrappers. La création de sucre syntaxique générique vous emmènera beaucoup plus rapidement.
Vous avez un constructeur d'interface graphique WYSIWYG mais flexible: j'utilise IntelliJ IDEA formulaires, pour créer une classe abstraite, puis la sous-classe avec une classe Scala. La le coût organisationnel est seulement 1 fichier supplémentaire, et j'écris pas Java code.
Documentation API autonome: Oui.
Maintenant qu'un certain temps s'est écoulé, il convient de noter que ScalaJS est également une option à considérer.
Contre vos exigences:
L'inconvénient est qu'il enlève votre interface graphique de la JVM et dans le navigateur, vous ne pouvez donc pas utiliser toutes ces bibliothèques Java.