Подходящая инфраструктура графического интерфейса для Scala?

Под подходящим я имею в виду:

  • зрелый и широко используемый
  • богатый набор виджета, который хорошо отображает
  • idiomatic Scala
  • Получил WYSIWYG-ish, но гибкий построитель графического интерфейса.
  • автономная документация API (если это оболочка, она не должна заставлять меня ссылаться на родительский проект на другом языке)

В определенном порядке.

Какие графические инструменты GUI удовлетворяют тем условиям?

Ответ 1

Scala имеет собственную библиотеку Swing. Это будет использовать стандартную библиотеку Swing под капотом, но у нее есть некоторые приятные дополнения и, что особенно важно, потому что она сделана для Scala, ее можно использовать гораздо более кратким способом, чем стандартная библиотека Swing:

import swing._

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

Посмотрите, как легко и просто установить свойства виджета?

За исключением более сильного синтаксиса и небольших дополнений (например, класса SimpleSwingApplication), я думаю, что преимущества и недостатки в значительной степени такие же, как и с ванильным Swing.

Здесь Обзор Scala Swing.

Ответ 2

ScalaFX - зрелая оболочка вокруг JavaFX 2. Она внешне похожа на Scala Swing в некоторых отношениях, но имеет некоторые функции, которые выделяют ее:

  • Связывание с родными графическими библиотеками. Это означает доступ к аппаратным ускорениям и другим положительным героям, но требует, чтобы среда исполнения JavaFX была установлена ​​в системе. Он включен в большинство основных дистрибутивов Java 8. Это также означает, что он очень хорошо относится к системам, с которыми он совместим.

  • Связи свойств - это функция убийцы для меня. Скажем, что у меня есть три элемента: A, B и C. A и B изменяются по размеру, а C должна иметь высоту, которая всегда является суммой высот A и B. В Swing это потребует написания набора пользовательских прослушивателей событий для выполнения этой работы. Связи ScalaFX позволяют выразить это просто, используя оператор связывания свойств: C.height <== A.height + B.height. Это, помимо прочего, делает очень Scala -идиоматическое чувство.

  • JavaFX Scene Builder (в бета-версии от записи) является редактором WYSIWYG GUI (хотя я его еще не пробовал).

  • Документация - ее слабое место. Являясь оберткой, она часто ссылается на документацию по JavaFX.

Ответ 3

Я использую Java Swing. Вот как это укладывается в соответствие с вашими требованиями:

  • зрелый и широко используется: да, тонна.

  • богатый набор и виджет делает хорошо: это спорно. Когда вы рассматриваете возможность легко дополнить Java Swing дополнительными библиотеками (например, SwingX), она по крайней мере лучше, чем Scala Swing в этом отношении, хотя, вероятно, не так хорошо, как некоторые другие инструментальные средства Java (хотя я не могу говорить с те).

  • idiomatic Scala: не так плохо, как вы могли бы подумать. Несколько вспомогательных функций делают его лучше:

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

    Чтобы вы могли сделать

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

    Теперь, что касается событий и состояний, это все еще, на мой взгляд, грубое преимущество во всех графических интерфейсах - у слушателей есть свои проблемы, у потоков событий есть свои проблемы. У меня был общий успех в увеличении событий Swing с reactive-core и redo-signals (мой собственный, недокументированный), чтобы упростить организацию состояния.

    Вы можете улучшить многословность определения слушателей с помощью нескольких дополнительных вспомогательных функций, таких как

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

    и

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

    Лично я желаю Scala Свинд взял этот маршрут. Написание оболочек для существующих классов Java - это время программирования O (n) и не дает вам ничего для классов, которые авторы не выбрали для написания оберток. Создание общего синтаксического сахара приведет вас намного дальше.

  • Получил WYSIWYG-ish, но гибкий построитель GUI: я использую формы IntelliJ IDEA, чтобы создать абстрактный класс, а затем подклассифицировать его классом Scala. Стоимость организации - всего один дополнительный файл, и я не пишу Java-код.

  • Документация по автономному API: Да.

Ответ 4

Теперь, когда прошло некоторое время, стоит отметить, что ScalaJS также является возможностью рассмотреть.

Против ваших требований:

  • зрелые и широко используемые - HTML/CSS/JS, ScalaJS нет (но это удивительно хорошо). Таким образом, вы можете столкнуться с зависящими от ScalaJS зависаниями, но основная технология очень надежная.
  • богатый набор виджета, который хорошо отображает - Да.
  • idiomatic Scala - Нет: вы в конечном итоге используете много jquery, которые будут в основном динамически напечатаны. ScalaTags многое делает для улучшения.
  • Получил WYSIWYG-ish, но гибкий построитель GUI. Да, многие.
  • автономная документация API (если оболочка, она не должна заставлять меня ссылаться на родительский проект на другом языке) - Да.

Недостатком является то, что он отключает ваш графический интерфейс от JVM и в браузере, поэтому вы не можете использовать все эти библиотеки Java.

Ответ 5

Я бы сказал, используй .Net, его зрелый и широко используемый.

Но...

Я предполагаю, что вам нужно использовать Scala. Для этого я буду придерживаться Java, поскольку у него есть лучшая поддержка инструмента, например, в IDEA или NetBeans. Вы можете, конечно, смешивать Java и Scala. Таким образом, ваш графический интерфейс можно сделать на Java, который вызывает Scala backend. Также взгляните на JGoodies, у них есть много приятных вещей для создания пользовательского интерфейса в Swing. В настоящий момент нет поддержки инструментов для приложений Scala GUI (а для не GUI он по-прежнему находится за Java).