2012-05-08 17 views
65

da appositi, voglio dire:Framework GUI adatto per Scala?

  • maturo e usato ampiamente
  • widget di ricco set che rende ben
  • idiomatica Scala
  • Got un costruttore WYSIWYG-ish ma GUI flessibile
  • standalone documentazione API (se un wrapper, non dovrebbe farmi riferire il progetto genitore in un'altra lingua)

In nessun ordine particolare.

Quali toolkit della GUI soddisfano quali condizioni?

+1

Non considerare i framework basati su Java non è utile. C'è Scala Swing, che avvolge parzialmente Swing e viene fornito con Scala. Probabilmente ci sono progetti più piccoli che tentano di costruire wrapper Scala su cose come JavaFX 2.0 o SWT. Penso che altri (anche) framework Java non soddisferanno le tue esigenze. – ziggystar

+0

Non penso che esista un costruttore di GUI per Scala. È possibile tagliare e incollare il codice Java generato da NetBeans ecc in IntelliJ per la traduzione automatica su Scala, ma è un problema se successivamente si desidera modificare il layout e si utilizzerà semplicemente Java Swing, quindi non è unidirezionale, ma sfortunatamente c'è nessuna alternativa al momento. –

+1

Quello che sto per suggerire è quello che faccio oggigiorno per la GUI. Sviluppa la tua GUI in HTML (5) e JavaScript (AngularJS è bello) e poi puoi sviluppare un minuscolo server nella tua app per esporre alcuni servizi simili a REST per la tua GUI. È possibile aprire la pagina dell'app (localhost: your-server-port) nel browser predefinito del sistema oppure incorporare un componente del browser in un JFrame. La mia giustificazione dietro questa soluzione è che HTML è la libreria GUI più indipendente e più ricca sulla terra. Perfino Oracle ha dichiarato ufficialmente che Swing non verrà mantenuto a lungo. – ehsun7b

risposta

-17

Direi che uso .Net è maturo e ampiamente utilizzato.

Ma ...

presumo che richiedono l'utilizzo di Scala. Per questo mi attenersi a Java in quanto ha il supporto migliore strumento come in IDEA o NetBeans. Ovviamente puoi mescolare Java e Scala. Quindi la tua GUI può essere eseguita in Java che chiama il backend di Scala. Dai un'occhiata a JGoodies hanno molte cose interessanti da fare per costruire l'interfaccia utente in Swing. Al momento non esiste un supporto per gli strumenti per le applicazioni GUI di Scala (e per i non GUI è ancora dietro Java).

+0

JGoodies Binding è un ottimo modo per descrivere funzionalmente un'interfaccia utente. Il suo concetto ValueModel è molto simile alle lenti. Vorrei che qualcuno scrivesse uno scala wrapper o un'implementazione. –

+1

Puoi chiamare .Net da Java? – vy32

+0

Okey ... ma in che modo questa è una risposta alla domanda? –

35

Scala ha una propria libreria Swing. Questo utilizzerà il libreria Swing di serie sotto il cofano, ma ha alcune aggiunte piacevoli e più in particolare, perché è fatto per la Scala, esso può essere utilizzato in un modo molto più conciso rispetto alla libreria Swing di serie:

import swing._ 

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

See quanto è bello e facile impostare le proprietà del widget?

Fatta eccezione per la sintassi più gradevole e le piccole aggiunte (come la classe SimpleSwingApplication), penso che i vantaggi e gli svantaggi siano più o meno gli stessi di vanilla Swing.

Ecco uno Overview of Scala Swing.

+0

Non sembra un sacco di indentazione? Qualcosa per evitare l'effetto boomerang? –

16

Io uso Java Swing. Ecco come impila alle tue esigenze:

  • maturo e ampiamente utilizzato: sì, una tonnellata.

  • set di widget ricco e rende bene: questo è discutibile. Se si considera la possibilità di integrare facilmente Java Swing con librerie aggiuntive (ad es. SwingX), è almeno meglio di Scala Swing in questo senso, anche se probabilmente non così bene come alcuni altri toolkit Java (anche se non posso parlarne) .

  • Scala idiomatica: non male come si potrebbe pensare. Poche le funzioni di supporto rendono meglio:

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

    Così che si può fare

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

    Ora, come per gli eventi e lo stato, questo è ancora, a mio parere, un filo grezzo in tutto gui quadri - gli ascoltatori hanno i loro problemi, i flussi di eventi hanno i loro problemi.Ho avuto un successo generale nell'aumentare gli eventi di Swing con reactive-core e redo-signals (il mio, non documentato) al fine di semplificare l'organizzazione dello stato.

    È possibile migliorare la verbosità di definire gli ascoltatori con un paio di funzioni di supporto come

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

    e

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

    Personalmente, vorrei Scala swing aveva preso questa strada. Scrivere i wrapper per le classi Java esistenti è O (n), ora del programmatore, e non ti dà nulla per le classi che gli autori non hanno scelto di scrivere per i wrapper. La creazione di zucchero sintattico generico ti porterà molto più velocemente.

  • Ottenuto un builder GUI flessibile ma WYSIWYG: utilizzo le forme IntelliJ IDEA, per creare una classe astratta e quindi sottoclassi con una classe Scala. Il costo organizzativo è solo un file extra e non scrivo codice Java.

  • Documentazione API standalone: ​​Sì.

20

ScalaFX è un wrapper matura intorno JavaFX 2. E 'superficialmente simile a Scala Oscillazione in alcuni aspetti, ma ha alcune caratteristiche che lo rendono spiccano:

  • Giunti a librerie grafiche native - Ciò significa accesso all'accelerazione hardware e altri accessori, ma richiede l'installazione del runtime JavaFX sul sistema. È incluso nella maggior parte delle principali distribuzioni di Java 8. Ciò significa anche che rende molto bene i sistemi con cui è compatibile.

  • Associazioni di proprietà - Questa è la caratteristica killer per me. Di 'che ho tre elementi: A, B e C. A e B sono ridimensionabili e si suppone che l'altezza C sia pari alla somma delle altezze di A e B in qualsiasi momento. In Swing, ciò comporterebbe la scrittura di una serie di listener di eventi personalizzati per eseguire questo lavoro. I collegamenti ScalaFX consentono di esprimere ciò semplicemente utilizzando l'operatore di binding della proprietà: C.height <== A.height + B.height. Questo, tra le altre caratteristiche, dà un tocco idiomatico alla Scala.

  • JavaFX Scene Builder (in fase beta di scrittura) è un editor GUI WYSIWYG (non l'ho ancora provato).

  • La documentazione è il suo punto debole. Essendo un wrapper, fa spesso riferimento alla documentazione JavaFX.

5

Ora che è trascorso un po 'di tempo, vale la pena notare che ScalaJS è anche un'opzione da considerare.

Contro le vostre esigenze:

  • matura e ampiamente utilizzato - HTML/CSS/JS sono, ScalaJS non è (ma è sorprendentemente buono considerando). Quindi, potresti imbatterti in hangup specifici di ScalaJS, ma la tecnologia sottostante è molto solida.
  • set di widget ricco che rende bene - Sì.
  • Scala idiomatica - No: finirai per usare un sacco di jQuery, che sarà tipicamente digitato in modo dinamico. ScalaTags fa molto per renderlo migliore però.
  • Ottenuto un generatore di GUI flessibile ma WYSIWYG - Sì, molti.
  • documentazione API standalone (se un wrapper, non dovrebbe farmi riferire il progetto genitore in un'altra lingua) - Sì.

Lo svantaggio è che la GUI viene rimossa dalla JVM e nel browser, quindi non è possibile utilizzare tutte quelle librerie Java.

+2

Se scegli di andare in questa direzione (che dovresti, scala.js è * fantastico *!), C'è un tutorial davvero bello qui: http://lihaoyi.github.io/hands-on-scala-js/ . Anche le librerie di lihaoyi sono solide come il rock, scalatag, autowire, upickle, utest. Dovresti controllarle. – kornfridge