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


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

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

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

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

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

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

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

14 53

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 и т. д. только добавляет сложностей без особого упрощения.

декларативные языки намного лучше, потому что даже не-программисты могут сделать из этого смысл, особенно когда вам нужно делегировать задачу тонкой настройки конкретных макетов художникам. 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-коде. Использование идентификаторов для подключения их позже не будет работать хорошо, так как это очень утомительный.
  7. интернационализации (i18n). Возможность загружать текст / строку из пакета ресурсов, а не жестко закодированный текст. Эта функция может иметь решающее значение для некоторых приложений.
  8. локализации виджетов (l10n). Преимущество декларативного программирования (особенно с XML) заключается в том, что вы можете просто переключиться на другую форму GUI для определенной локали, и все. Если вы кодируете с помощью Java или любых других императивных языков, это не так просто.
  9. проверяем ошибки / толерантность. Первоначальные проекты часто будут содержать ошибки здесь и там. Иногда ошибка может быть вызвана тем, что соответствующий код Java еще не был разработан. Или отсутствует ресурс значка. Работа с ошибками при императивном кодировании крайне утомительна. Таким образом, желательно иметь возможность находить ошибки, но в то же время быть терпимым к ошибкам, поэтому предварительный просмотр макета GUI может быть выполнен как можно раньше.
  10. замена компонентов GUI. То есть, заменить текстовое поле которые раньше имели ли некоторые навороченные версии компонентов. Замените значение диалогового окна некоторыми причудливыми диалоговыми окнами пользовательского интерфейса (например, 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 довольно долго, и концепция строителя Карстена работает хорошо, но она немного загадочна... MiG легче подобрать, и в результате получается удивительно лаконичный код.

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

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

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

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 лучшее быстрое решение, основанный на XML инструмент GUI. вы хотели бы, как 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 что позволяет программно определять макеты качания в очень сжатом виде (это с открытым исходным кодом).

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

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

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

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