70 votes

Cadre GUI approprié pour Scala ?

Par convenable, je veux dire :

  • mature et largement utilisé
  • un ensemble de widgets riches qui donnent un bon rendu
  • Scala idiomatique
  • Vous disposez d'un constructeur d'interface graphique WYSIWYG-ish mais flexible.
  • documentation API autonome (si c'est un wrapper, il ne doit pas m'obliger à me référer au projet parent dans une autre langue)

Sans ordre particulier.

Quelles boîtes à outils GUI répondent à quelles conditions ?

37voto

rolve Points 3833

Scala possède sa propre bibliothèque Swing. Celle-ci utilise la bibliothèque Swing standard, mais elle comporte quelques ajouts intéressants et, surtout, parce qu'elle est conçue pour Scala, elle peut être utilisée 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 comme il est agréable et facile de définir les propriétés des widgets ?

À l'exception d'une syntaxe plus agréable et de petits ajouts (comme la fonction SimpleSwingApplication ), je pense que les avantages et les inconvénients sont à peu près les mêmes qu'avec la classe Swing classique.

Voici un Aperçu de Scala Swing .

22voto

evilcandybag Points 1163

ScalaFX est une enveloppe mature autour de JavaFX 2. Il est superficiellement similaire à Scala Swing à certains égards, mais possède certaines caractéristiques qui le distinguent :

  • Couplages aux bibliothèques graphiques natives - Cela signifie un accès à l'accélération matérielle et à d'autres avantages, mais nécessite l'installation du runtime JavaFX sur le système. Il est inclus dans la plupart des distributions majeures de Java 8. Cela signifie également que le rendu est très bon sur les systèmes avec lesquels il est compatible.

  • Liaisons de propriétés - C'est la caractéristique la plus importante pour moi. Disons que j'ai trois éléments : A , B et C . A et B sont redimensionnables, et C est censé avoir une hauteur qui est la somme des hauteurs de A et B à tout moment. Dans Swing, cela impliquerait d'écrire un ensemble de récepteurs 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 . Ceci, parmi d'autres caractéristiques, donne une sensation très idiomatique de Scala.

  • JavaFX Scene Builder (en version bêta à l'heure où j'écris ces lignes) est un éditeur GUI WYSIWYG (je ne l'ai pas essayé, cependant).

  • La documentation est son point faible. Comme il s'agit d'une enveloppe, elle renvoie souvent à la documentation de JavaFX.

16voto

Owen Points 14439

J'utilise Java Swing. Voici comment il se positionne par rapport à vos exigences :

  • mature et utilisé de manière intensive : oui, une tonne.

  • un ensemble de widgets riche et un bon rendu : cela se discute. Si l'on considère la possibilité de compléter facilement Java Swing avec des bibliothèques supplémentaires (par exemple SwingX), il fait au moins mieux que Scala Swing à cet égard, mais probablement pas aussi bien que d'autres boîtes à outils Java (mais je ne peux pas parler de celles-ci).

  • Scala idiomatique : pas aussi mauvais qu'on pourrait le croire. Quelques fonctions d'aide l'améliorent :

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

    Pour ce qui est des événements et de l'État, il s'agit encore, à mon avis, d'un domaine difficile à cerner. tous frameworks gui -- les écouteurs ont leurs problèmes, les flux d'événements ont leurs problèmes. J'ai eu un succès général en augmentant les événements de Swing avec des événements de type noyau réactif 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 des écouteurs avec quelques fonctions d'aide supplémentaires telles que

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

    et

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

    Personnellement, j'aurais aimé que Scala Swing emprunte cette voie. Écrire des wrappers pour des classes Java existantes représente O(n) temps de programmation, et ne vous apporte 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 mènera beaucoup plus loin et plus rapidement.

  • J'ai un constructeur d'interface graphique WYSIWYG-ish mais flexible : J'utilise les formulaires IntelliJ IDEA, pour créer une classe abstraite, puis la sous-classer avec une classe Scala. Le coût organisationnel est seulement 1 fichier supplémentaire, et je n'écris pas de code Java.

  • Documentation API autonome : Oui.

6voto

Owen Points 14439

Maintenant qu'un certain temps a passé, il convient de noter que ScalaJS est également une option à envisager.

En fonction de vos besoins :

  • mature et largement utilisé - HTML/CSS/JS le sont, ScalaJS ne l'est pas (mais il est étonnamment bon compte tenu des circonstances). Vous pouvez donc rencontrer des problèmes spécifiques à ScalaJS, mais la technologie sous-jacente est très robuste.
  • un ensemble de widgets riches qui rendent bien -- Oui.
  • Scala idiomatique -- Non : vous finirez par utiliser beaucoup de jquery, qui sera principalement typée dynamiquement. ScalaTags fait beaucoup pour l'améliorer.
  • Vous avez un constructeur d'interface graphique WYSIWYG-ish mais flexible -- Oui, beaucoup.
  • documentation API autonome (si c'est un wrapper, il ne doit pas m'obliger à me référer au projet parent dans une autre langue) -- Oui.

L'inconvénient, c'est que l'interface graphique n'est plus dans la JVM mais dans le navigateur, ce qui vous empêche d'utiliser toutes les bibliothèques Java.

-19voto

Lukasz Points 829

Je dirais qu'il faut utiliser .Net, qui est mature et largement utilisé.

Mais...

Je suppose que vous avez besoin d'utiliser Scala. Pour cela, je m'en tiendrais à Java, qui offre un meilleur support d'outils, comme IDEA ou NetBeans. Vous pouvez bien sûr mélanger Java et Scala. Ainsi, votre interface graphique peut être réalisée en Java et appeler le backend Scala. Jetez également un coup d'œil à JGoodies, qui propose de nombreux outils intéressants pour créer des interfaces utilisateur en Swing. Pour l'instant, il n'y a pas de support d'outils pour les applications GUI en Scala (et pour les applications non GUI, il est toujours derrière Java).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X