Cadru GUI potrivit pentru Scala? (Programare, Java, Scala, Interfață Utilizator)

Jesvin Jose a intrebat.

Prin adecvat, vreau să spun:

  • matur și utilizat pe scară largă
  • set bogat de widget-uri care se redă bine
  • Scala idiomatic
  • are un constructor de GUI WYSIWYG-ish, dar flexibil
  • documentație API de sine stătătoare (dacă este un wrapper, nu ar trebui să mă facă să fac trimitere la proiectul părinte în altă limbă)

În nicio ordine anume.

Ce toolkit-uri GUI îndeplinesc ce condiții?

Comentarii

  • Faptul că nu vă uitați la cadrele bazate pe Java nu este de ajutor. Există Scala Swing, care înfășoară parțial Swing și vine cu Scala. Probabil că există proiecte mai mici care încearcă să construiască învelișuri Scala în jurul unor lucruri precum JavaFX 2.0 sau SWT. Cred că alte cadre (chiar și) Java nu vor satisface cerințele dumneavoastră. –  > Por ziggystar.
  • Nu cred că există un constructor de GUI pentru Scala. Puteți tăia și lipi codul Java generat de NetBeans etc. în IntelliJ pentru traducerea automată în Scala, dar este o pacoste dacă doriți ulterior să schimbați aspectul, și veți folosi doar Java Swing, deci nu este idiomatic, dar, din păcate, nu există o alternativă în prezent. –  > Por Luigi Plinge.
  • Ceea ce vă voi sugera este ceea ce fac în prezent pentru GUI. Dezvoltă-ți GUI în HTML(5) și JavaScript (AngularJS este bun) și apoi poți dezvolta un server foarte mic în aplicația ta pentru a expune niște servicii de tip REST pentru GUI-ul tău. Puteți deschide pagina aplicației (localhost:your-server-port) în browserul implicit al sistemului sau puteți încorpora o componentă de browser într-un JFrame. Justificarea mea în spatele acestei soluții este că HTML este cea mai independentă de platformă și cea mai bogată bibliotecă GUI de pe pământ. Chiar și Oracle a declarat oficial că Swing nu va fi întreținut prea mult timp. –  > Por ehsun7b.
5 răspunsuri
rolve

Scala are propria sa bibliotecă Swing. Aceasta va folosi biblioteca Swing standard sub capotă, dar are câteva adăugiri frumoase și, mai ales, deoarece este făcută pentru Scala, poate fi folosită într-un mod mult mai concis decât biblioteca Swing standard:

import swing._

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

Vedeți cât de bine și de ușor este să setați proprietățile widget-urilor?

Cu excepția unei sintaxe mai frumoase și a micilor adăugiri (cum ar fi SimpleSwingApplication clasa), cred că avantajele și dezavantajele sunt cam aceleași ca în cazul lui Swing clasic.

Iată un exemplu Prezentare generală a Scala Swing.

Comentarii

  • Nu-i așa că arată ca o mulțime de indentare? Ceva pentru a evita efectul de bumerang? –  > Por Chetan Bhasin.
evilcandybag

ScalaFX este un înveliș matur în jurul JavaFX 2. Este superficial asemănător cu Scala Swing în unele privințe, dar are câteva caracteristici care îl fac să iasă în evidență:

  • Cuplaje la bibliotecile grafice native – Aceasta înseamnă acces la accelerarea hardware și alte bunătăți, dar necesită ca JavaFX runtime să fie instalat pe sistem. Acesta este inclus în majoritatea distribuțiilor majore ale Java 8. Acest lucru înseamnă, de asemenea, că redă foarte bine pe sistemele cu care este compatibil.

  • Legături de proprietăți – Aceasta este caracteristica care mă ucide. Să spunem că am trei elemente: A, B, și C. A și B sunt redimensionabile, iar C se presupune că are o înălțime care este suma înălțimilor lui A și B în orice moment. În Swing, acest lucru ar implica scrierea unui set de ascultători de evenimente personalizați pentru a efectua această operațiune. ScalaFX bindings vă permite să exprimați acest lucru pur și simplu prin utilizarea operatorului property bind: C.height <== A.height + B.height. Acest lucru, printre alte caracteristici, oferă o senzație foarte Scala-idiomatică.

  • JavaFX Scene Builder (în versiune beta în momentul redactării acestui articol) este un editor WYSIWYG GUI (nu l-am încercat, totuși).

  • Documentația este punctul său slab. Fiind un wrapper, face adesea trimitere la documentația JavaFX.

Owen

Eu folosesc Java Swing. Iată cum se potrivește cu cerințele tale:

  • matură și utilizată pe scară largă: da, o tonă.

  • set bogat de widgeturi și redă bine: acest lucru este discutabil. Dacă luați în considerare capacitatea de a completa cu ușurință Java Swing cu biblioteci suplimentare (de exemplu, SwingX), se descurcă cel puțin mai bine decât Scala Swing în această privință, deși probabil nu la fel de bine ca alte seturi de instrumente Java (deși nu pot vorbi despre acestea).

  • Scala idiomatic: nu este atât de rău pe cât ați putea crede. Câteva funcții de ajutor îl fac mai bun:

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

    Astfel încât să puteți face

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

    Acum, în ceea ce privește evenimentele și starea, aceasta este încă, după părerea mea, o margine dură în toate cadrele gui – ascultătorii au problemele lor, fluxurile de evenimente au problemele lor. Am avut un succes general în a spori evenimentele Swing cu reactive-core și redo-signals (propriile mele, nedocumentate) pentru a face mai ușoară organizarea stării.

    Puteți îmbunătăți verbozitatea definirii ascultătorilor cu câteva funcții ajutătoare suplimentare, cum ar fi

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

    și

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

    Personal, mi-aș fi dorit ca Scala Swing să fi luat această cale. Scrierea de wrappers pentru clasele Java existente este un timp de programare O(n) și nu vă aduce nimic pentru clasele pentru care autorii nu au ales să scrie wrappers. Crearea de zahăr sintactic generic vă va duce mult mai departe și mai repede.

  • Are un constructor de GUI WYSIWYG-ish, dar flexibil: Folosesc formularele IntelliJ IDEA, pentru a crea o clasă abstractă, apoi o subclasă cu o clasă Scala. Costul de organizare este de doar 1 fișier suplimentar și nu scriu niciun cod Java.

  • Documentație API de sine stătătoare: Da.

Owen

Acum, că a trecut ceva timp, merită menționat faptul că ScalaJS este, de asemenea, o opțiune de luat în considerare.

Față de cerințele dumneavoastră:

  • matură și utilizată pe scară largă — HTML/CSS/JS sunt, ScalaJS nu este (dar este surprinzător de bună având în vedere). Așadar, este posibil să vă confruntați cu piedici specifice ScalaJS, dar tehnologia de bază este foarte robustă.
  • un set bogat de widget-uri care se afișează bine — Da.
  • Scala idiomatic — Nu: veți ajunge să folosiți o mulțime de jquery, care va fi în mare parte tipizat dinamic. ScalaTags face multe pentru a face acest lucru mai bine totuși.
  • Ai un constructor de GUI WYSIWYG-ish dar flexibil — Da, multe.
  • documentație API de sine stătătoare (dacă este un wrapper, nu ar trebui să mă facă să fac referire la proiectul părinte în altă limbă) — Da.

Dezavantajul este că îți scoate GUI-ul din JVM și îl duce în browser, deci nu poți folosi toate acele biblioteci Java.

Comentarii

  • Dacă alegeți să mergeți în această direcție (ceea ce ar trebui să faceți, scala.js este minunat!), există un tutorial foarte bun aici: lihaoyi.github.io/hands-on-scala-js . Bibliotecile lui lihaoyi sunt, de asemenea, solide ca piatra – scalatags, autowire, upickle, utest – ar trebui să le verificați. –  > Por kornfridge.
Lukasz

Aș spune să folosiți .Net, este un sistem matur și este utilizat pe scară largă.

Dar …

Presupun că aveți nevoie să folosiți Scala. Pentru asta aș rămâne la Java, deoarece are un suport mai bun pentru instrumente, cum ar fi în IDEA sau NetBeans. Desigur, puteți amesteca Java și Scala. Astfel, interfața grafică poate fi realizată în Java care apelează backend-ul Scala. De asemenea, aruncați o privire la JGoodies, care are o mulțime de lucruri bune pentru a construi interfețe în Swing. În acest moment nu există niciun instrument de suport pentru aplicațiile Scala GUI (iar pentru aplicațiile care nu sunt GUI este încă în urma Java).

Comentarii

  • JGoodies Binding este un mod foarte bun de a descrie funcțional o interfață de utilizator. Conceptul său ValueModel este foarte asemănător cu Lenses. Mi-aș dori ca cineva să scrie un wrapper sau o implementare scala. –  > Por Felix Leipold.
  • Puteți apela .Net din Java? –  > Por vy32.
  • Okey… dar prin ce mod este acesta un răspuns la întrebare? –  > Por Emrys Myrooin.