предложения для декларативного программирования GUI на Java - PullRequest
54 голосов
/ 17 апреля 2009

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

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

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

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

  3. JGoodies Forms - не совсем декларативно, но довольно близко, и мне повезло с JGoodies Binding. Но их синтаксис для Form Layout выглядит довольно загадочно.

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

p.s. Я попробовал несколько поисков в Google («декларативный java gui»), но просто не знал, что искать.

Ответы [ 14 ]

23 голосов
/ 17 апреля 2009

Вы можете взглянуть на javabuilders ; он использует YAML для создания пользовательского интерфейса Swing.

Простой пример из руководства [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)
20 голосов
/ 28 мая 2009

Как автор 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) заключается в том, что вы можете просто переключиться на другую форму графического интерфейса для конкретной локали и все. Если вы пишете код на Java или любом другом императивном языке, это не так просто.
  9. Проверка ошибок / допуск. Первоначальные проекты часто будут содержать ошибки здесь и там. Иногда ошибка может быть связана с тем, что соответствующий код Java еще не разработан. Или значок ресурса отсутствует. Работа с ошибками с императивным кодированием чрезвычайно утомительна. Таким образом, желательно иметь возможность обнаруживать ошибки, но в то же время быть устойчивыми к ошибкам, поэтому предварительный просмотр макета GUI может быть сделан как можно раньше.
  10. Замена компонентов графического интерфейса. То есть замените текстовое поле, в котором раньше был JTextField, на более причудливую версию компонентов. Замените значение диалога на некоторые модные диалоги пользовательского интерфейса (например, JIDE) вместо JDialog. Эта функция может сэкономить значительное количество усилий. Сам XML также полезен благодаря XSLT и другим инструментам преобразования.
  11. Beyond Swing. Потому что рано или поздно вы обнаружите, что многие конфигурации компонентов используют типы объектов, такие как массивы, значки, изображения, векторы и т. Д.
13 голосов
/ 17 апреля 2009

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

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

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

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

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

11 голосов
/ 18 апреля 2009

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

7 голосов
/ 17 апреля 2009

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

2 голосов
/ 08 июня 2010

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

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

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

2 голосов
/ 17 апреля 2009

попробуй Свиби: http://swiby.codehaus.org/

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

1 голос
/ 03 июля 2013

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

1 голос
/ 27 апреля 2010

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

1 голос
/ 27 мая 2009

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

...