предложения для декларативного программирования GUI в Java

интересно, есть ли какие-либо предложения для декларативного программирования GUI на Java. (Я ненавижу визуальное программное обеспечение для создания/редактирования GUI, но я немного устал от ручного создания экземпляров JPanels и ящиков, JLabels и JLists и т. д.)

Это мой общий вопрос, но у меня есть два конкретных вопроса для подходов подумываю:

  1. JavaFX: есть ли пример где-то реалистичного отображения GUI (например, не круги и прямоугольники, но списки и кнопки, метки и тому подобное) в JavaFX, который может взаимодействовать с Java sourcefile, который обращается к различным элементам и обновляет их?

  2. простой старый Swing с чем-то для разбора XUL-ish XML: кто-нибудь изобрел декларативный синтаксис (например, XUL) для XML для использования С Java Swing? Я полагаю, что было бы нетрудно создать некоторый код на основе STaX, который читает XML-файл, создает экземпляр иерархии элементов Swing и делает иерархию доступной через какую-то объектную модель. Но я предпочел бы использовать что-то хорошо известное, документированное и проверенное, чем пытаться изобрести такую вещь сам.

  3. Формы JGoodies -- не совсем декларативно, но вроде бы близко, и мне повезло с привязкой JGoodies. Но их синтаксис для компоновки формы кажется немного загадочным.

edit: много хороших ответов здесь! (И я добавил #3 выше) я был бы особенно благодарен услышав любой опыт, который любой из вас имел с использованием одного из этих фреймворков для реальных приложений.

p.s. Я попробовал несколько поисков google ("Java gui declarative"), просто не знал, что искать.

14 ответов


вы могли бы взглянуть на javabuilders; он использует в YAML построить качели UIs.

простой пример из руководство [PDF]:

JFrame:
    name: myFrame
    title: My Frame
    content:
        - JLabel:
            name: myLabel2
            text: My First Label
        - JLabel:
            name: myLabel2
            text: My Second Label

кроме того:

JFrame:
    name: myFrame
    title: My Frame
    content:
        - JLabel: {name: myLabel2, text: My First Label}
        - JLabel: {name: myLabel2, text: My Second Label}

или еще:

JFrame(name=myFrame,title=My Frame):
    - JLabel(name=myLabel2, text=My First Label)
    - JLabel(name=myLabel2, text=My Second Label)

Как автор CookSwing, инструмент, который делает то, что вам нужно, я дал этой теме долгий жесткий взгляд, прежде чем делать фактическую реализацию. Я зарабатывал на жизнь написанием приложений Java Swing GUI.

IMO, если вы собираетесь использовать какие-либо императивные языки программирования для описания компонента Java Swing, вы можете просто использовать Java. Groovy etc только добавляет осложнения без особого упрощения.

декларативные языки намного лучше, потому что даже не-программисты могут понять это, особенно когда вам нужно делегировать задачу тонкой настройки конкретных макетов художникам. XML идеально подходит для декларативных языков (по сравнению с другими вариантами) из-за простоты, удобочитаемости и множества редакторов/инструментов преобразования и т. д.

вот проблемы, с которыми сталкиваются в декларативном программировании GUI, а не в каком-либо определенном порядке. Эти вопросы были рассмотрены в CookSwing.

  1. читабельность и простота. (JavaFX не проще, чем XML. Закрытие тегов XML помогает читать совсем немного и не добавляет дополнительного ввода, так как XML-Редакторы обычно делают это за вас)
  2. расширяемость. Очень важно, потому что пользовательские компоненты Swing придумают для любых нетривиальных проектов.
  3. макеты GUI. Также весьма важный. Возможность обрабатывать BorderLayout, GridBagLayout, Jgoodies FormsLayout и т. д. практически обязательна.
  4. простота копирования/вставки. В в процессе проектирования макета, необходимо опробовать различные из них. Поэтому нужно иметь возможность копировать/вставлять и перемещать вещи. XML лучше, потому что иерархия компонентов и макетов легко увидеть. JavaFX несколько проблематичен из-за многострочных атрибутов и проблем с отступами. Наличие хорошего редактора является обязательным, и есть много хороших редакторов XML.
  5. Шаблоны (т. е. возможность включения другого файла макета) очень полезны для согласованного смотреть. Например, может потребоваться согласованный вид диалоговых окон, панелей кнопок и т. д.
  6. взаимодействие с Java-кодом. Это очень важно. Некоторые компоненты GUI могут быть созданы только с кодом Java (по какой-либо причине). Таким образом, необходимо иметь возможность загружать эти объекты. Он также обязательно может напрямую подключать прослушиватели и другие объекты/компоненты Java в XML-коде. Использование ids для подключения их позже не будет работать хорошо, так как это очень утомительный.
  7. интернационализации (i18n). Возможность загрузки текста / строки из пакета ресурсов, а не жестко закодированного текста. Эта функция может иметь решающее значение для некоторых приложений.
  8. локализации виджетов (l10n). Преимущество декларативного программирования (особенно с XML) заключается в том, что вы можете просто переключиться на другую форму GUI для определенной локали, и все. Если вы кодируете с Java или любыми другими императивными языками, это не так просто.
  9. проверяем ошибки / толерантность. Первоначальные проекты часто будут содержать ошибки здесь и там. Иногда ошибка может быть вызвана тем, что соответствующий код Java еще не разработан. Или отсутствует ресурс значка. Работа с ошибками с императивным кодированием чрезвычайно утомительна. Таким образом, желательно иметь возможность находить ошибки, но в то же время быть терпимым к ошибкам, поэтому предварительный просмотр макета GUI может быть сделан как можно раньше.
  10. замена компонента GUI. То есть, заменить текстовое поле который раньше имел JTextField с более причудливой версией компонентов. Замените значение диалога некоторыми причудливыми диалогами пользовательского интерфейса (например, Jide) вместо JDialog. Эта функция может сэкономить значительное количество усилий. Сам XML также полезен благодаря XSLT и другим инструментам преобразования.
  11. За Пределами Качели. Потому что рано или поздно вы обнаружите, что многие конфигурации компонентов используют типы объектов, такие как массивы, значки, изображения, векторы и т. д.

Если краткость важна, вы можете рассмотреть идиому двойной скобки:

new JFrame("My Frame") {{
    setName("myFrame");
    add(new JLabel("My First Label") {{
         setName("myLabel2");
    }};
    add(new JLabel("My Second Label") {{
         setName("myLabel2");
    }};
}}

тогда вы не потеряете силу хорошо известного языка программирования общего назначения (вы знаете, что вам это понадобится, и JellyTags сосать). Все, что вам нужно, это одна маленькая дополнительная идиома.

он не используется очень много, потому что на самом деле люди, писающие вокруг с XML, не решали реальные болевые точки.

В общем случае вы можете использовать слои builder для абстракции повторный код. Графический код не должен быть плохо написан, просто почти все это (в том числе в учебниках).


Я настоятельно рекомендую Макет Миг - требуется несколько дней, чтобы привыкнуть к синтаксису, но как только вы его получили, он творит чудеса. Я использовал формы JGoodies довольно долго, и концепция строителя Карстена работает хорошо, но это немного загадочно... Миг легче подобрать, и в результате получается удивительно лаконичный код.


Если вы готовы немного выйти за пределы обычного Java, в Groovyконцепция "строителя" работает довольно хорошо с GUIs. Конечно, вы можете взаимодействовать между Groovy и Java довольно легко. Вижу Качели Builder страница для получения дополнительной информации.


дайте Swiby попробовать:http://swiby.codehaus.org/

"Swiby-это смесь Swing и Ruby для действительно богатых распределенных приложений." Другими словами, Swiby-это доменный язык, смешивающий swing и ruby.


SDL / Swing делает именно то, что вам нужно. Его крошечный (283k), ненавязчивый, простой в освоении декларативный свинг-фреймворк.

menus {
    "File" {
        "Open" do="open" // calls "open()" in the controller
        "---"
        "Exit" do="exit"
    }
}

SDL / Swing является открытым исходным кодом, но пользуется коммерческой поддержкой. Мы (Ikayzo.com) разработал его в течение нескольких лет и развернул его в производственных системах для многих клиентов, начиная от компаний науки о жизни до банков.


Я могу найти следующие примеры того, что вы просите:


Я недавно наткнулся SDL / Swing.


что-то новое...XWT, будет включен в eclipse e4


Я пробовал много решений, таких как SWIXML, Javabuilders, MigLayout, Cookswing. Я, наконец, нашел javaFX и javaFX-Scenebuilder лучшее быстрое решение, инструмент GUI на основе XML. вам понравится, как scenebuilder создает GUI (с элементами перетаскивания!). кроме того, он использует CSS (Каскадные Таблицы Стилей) для темы GUI. Jsut доверяет Oracle, это лучший инструмент GUI для приложений java. взять тур для создания JavaFX с приложениями с scenebuilder, здесь: http://docs.oracle.com/javafx/scenebuilder/1/get_started/prepare-for-tutorial.htm#CEGJBHHA


хотя он не является декларативным и ограничивается исключительно макетами, вы можете взглянуть на DesignGridLayout что позволяет программно определять макеты Swing в очень сжатом виде (это с открытым исходным кодом).

основные преимущества:

  • легко и быстро учиться.
  • краткий код (1 строка кода в строке компонентов в форме), что также включить простое обслуживание
  • проверка времени компиляции (которая декларативный UI не может иметь)
  • уважение платформы look & feel (выравнивание базовой линии, промежутки между комплектующие...) без каких-либо жестко значение длины

Как часто, это всегда хорошая идея, чтобы выполнить поиск, когда вы ищете что-то. этой является первой ссылкой в google при поиске "Java xml gui"


WindowBuilder, это очень хороший плагин, который включал GWT, XWT, SWT, Swing и т. д.