java scala user-interface

java - Marco GUI adecuado para Scala?



user-interface (5)

Ahora que ha pasado un tiempo, vale la pena señalar que ScalaJS también es una opción a considerar.

En contra de sus requisitos:

  • maduros y usados ​​extensamente - HTML / CSS / JS son, ScalaJS no lo es (pero sorprendentemente es bueno teniendo en cuenta). Por lo tanto, puede encontrarse con problemas específicos de ScalaJS, pero la tecnología subyacente es muy sólida.
  • conjunto de widgets ricos que rinde bien - Sí.
  • Scala idiomático - No: terminarás usando mucho jquery, que en su mayoría será tipeado dinámicamente. ScalaTags hace mucho para mejorarlo.
  • Tengo un constructor de GUI WYSIWYG-ish pero flexible: sí, muchos.
  • documentación de API independiente (si es un contenedor, no debería hacerme referir el proyecto principal en otro idioma) - Sí.

La desventaja es que saca su GUI de la JVM y la lleva al navegador, por lo que no puede usar todas esas bibliotecas Java.

Por adecuado, quiero decir:

  • maduro y usado extensivamente
  • conjunto de widgets ricos que rinde bien
  • Scala idiomático
  • Tengo un constructor de GUI WYSIWYG-ish pero flexible
  • Documentación de API independiente (si es un contenedor, no debería hacer que remita el proyecto padre en otro idioma)

Sin ningún orden en particular.

¿Qué kits de herramientas GUI satisfacen qué condiciones?


Scala tiene su propia biblioteca Swing. Esto utilizará la biblioteca Swing estándar debajo del capó, pero tiene algunas bonitas adiciones y, sobre todo, porque está hecha para Scala, puede usarse de una manera mucho más concisa que la biblioteca estándar Swing:

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

¿Ves lo agradable y fácil que es establecer las propiedades del widget?

Excepto por la sintaxis más agradable y las pequeñas adiciones (como la clase SimpleSwingApplication ), creo que las ventajas y desventajas son más o menos las mismas que con Swing de vanilla.

Aquí hay una descripción general de Scala Swing .


ScalaFX es un envoltorio maduro para JavaFX 2. Es superficialmente similar a Scala Swing en algunos aspectos, pero tiene algunas características que lo hacen destacar:

  • Acoplamientos a bibliotecas gráficas nativas: esto significa acceso a la aceleración de hardware y otras ventajas, pero requiere que JavaFX runtime se instale en el sistema. Está incluido en la mayoría de las principales distribuciones de Java 8. Esto también significa que rinde muy bien en los sistemas con los que es compatible.

  • Enlaces a la propiedad: esta es la característica más importante para mí. Diga que tengo tres elementos: A , B y C A y B son redimensionables, y se supone que C tiene una altura que es la suma de las alturas de A y B en todo momento. En Swing, esto implicaría escribir un conjunto de oyentes de eventos personalizados para realizar este trabajo. Los enlaces de ScalaFX le permiten expresar esto simplemente usando el operador de enlace de propiedad: C.height <== A.height + B.height . Esto, entre otras características, crea una sensación muy idiomática de Scala.

  • JavaFX Scene Builder (en beta desde el momento de la escritura) es un editor de GUI WYSIWYG (aunque no lo he probado).

  • La documentación es su punto débil. Al ser un envoltorio, a menudo hace referencia a la documentación de JavaFX.


Yo diría que use .Net es maduro y se usa mucho.

Pero ...

Supongo que necesita usar Scala. Para eso me quedaría con Java, ya que tiene una mejor herramienta de soporte como en IDEA o NetBeans. Por supuesto, puede mezclar Java y Scala. Entonces su GUI se puede hacer en Java que llama a back-end de Scala. También echa un vistazo a JGoodies que tienen muchas cosas buenas para construir UI en Swing. En este momento, no hay soporte de herramientas para las aplicaciones de la GUI de Scala (y para las que no tienen una GUI todavía está detrás de Java).


Yo uso Java Swing. Así es como se compara con sus requisitos:

  • maduro y usado ampliamente: sí, una tonelada.

  • conjunto de widgets ricos y rinde bien: esto es discutible. Cuando considera la posibilidad de complementar fácilmente Java Swing con bibliotecas adicionales (por ejemplo, SwingX), al menos funciona mejor que Scala Swing en este aspecto, aunque probablemente no tan bien como algunos otros kits de herramientas de Java (aunque no puedo hablar con ellos). .

  • Scala idiomático: no tan malo como podrías pensar Algunas funciones de ayuda lo hacen mejor:

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

    Para que puedas hacer

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

    Ahora, en cuanto a los eventos y el estado, esto sigue siendo, en mi opinión, una ventaja en todos los frameworks de GUI: los oyentes tienen sus problemas, los streams de eventos tienen sus problemas. He tenido éxito general en aumentar los eventos de Swing con reactive-core y redo-signals (el mío, el indocumentado) para facilitar la organización del estado.

    Puede mejorar la verbosidad de la definición de oyentes con algunas funciones auxiliares más, como

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

    y

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

    Personalmente, desearía que Scala Swing hubiera tomado esta ruta. La redacción de envoltorios para las clases Java existentes es O (n) tiempo del programador, y no obtiene nada para las clases para las que los autores no eligieron escribir envoltorios. Crear azúcar sintáctico genérico te llevará mucho más rápido.

  • Obtuve un constructor de GUI WYSIWYG-ish pero flexible: uso formularios IntelliJ IDEA, para hacer una clase abstracta, y luego la subclase con una clase Scala. El costo organizacional es solo 1 archivo extra, y no escribo código Java.

  • Documentación de API independiente: sí.