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

<p>интересно, есть ли какие-либо предложения для декларативного программирования gui на java. (я ненавижу программное обеспечение для создания/редактирования графических интерфейсов, но немного устал от создания экземпляров jpanels и boxes, jlabels, jlists и т.д. вручную)</p><p>это мой общий вопрос, но у меня есть два конкретных вопроса о подходах, которые я собираюсь предпринять:</p><ol> <li> <p>javafx: есть ли где-нибудь пример реалистичного отображения графического интерфейса пользователя (например, не кружков и прямоугольников, а списков, кнопок, меток и т. п.) в javafx, который может взаимодействовать с исходным файлом java, который обращается к различным обновлениям и обновляет их? элементы?</p> </li> <li> <p>обычный старый swing с чем-то для анализа xul-иш xml: кто-нибудь изобрел декларативный синтаксис (например, xul) для xml для использования с java swing? я полагаю, что это было бы несложно: создать некоторый код на основе stax, который читает xml-файл, создает иерархию элементов swing и делает иерархию доступной с помощью некоторой объектной модели. но я бы предпочел использовать что-то, что хорошо известно, задокументировано и протестировано, чем пытаться самому изобрести такую вещь.</p> </li> <li> <p> <a href="http://www.jgoodies.com/freeware/forms/">jgoodies forms</a> - не совсем декларативно, но довольно близко, и мне повезло с jgoodies binding. но их синтаксис для form layout выглядит довольно загадочно.</p> </li> </ol><p><strong> изменить: </strong> много хороших ответов здесь! (и я добавил № 3 выше) я был бы особенно благодарен за то, что вы слышали о любом опыте использования вами одной из этих платформ для реальных приложений.</p><p>постскриптум я попробовал несколько поисков в google ("декларативный java-интерфейс"), но просто не знал, что искать.</p>

<p>вы могли бы взглянуть на <a href="http://code.google.com/p/javabuilders/">javabuilders</a> ; он использует <a href="http://en.wikipedia.org/wiki/yaml">yaml</a> для создания пользовательского интерфейса swing.</p><p>простой пример из <a href="http://github.com/jacek99/javabuilders/raw/39a2f1854c1bd53162e53e845f5ce663d7214d22/org.javabuilders.docs/javabuilders/out/pdf/swing.javabuilder.pdf">руководство</a> [pdf]:</p><pre><code>jframe: name: myframe title: my frame content: - jlabel: name: mylabel2 text: my first label - jlabel: name: mylabel2 text: my second label </code></pre><p>в качестве альтернативы:</p><pre><code>jframe: name: myframe title: my frame content: - jlabel: {name: mylabel2, text: my first label} - jlabel: {name: mylabel2, text: my second label} </code></pre><p>или даже:</p><pre><code>jframe(name=myframe,title=my frame): - jlabel(name=mylabel2, text=my first label) - jlabel(name=mylabel2, text=my second label) </code></pre>

<p>как автор cookswing, инструмента, который делает то, что вам нужно, я тщательно изучил эту тему, прежде чем приступить к реальной реализации. я зарабатывал на жизнь написанием java swing gui приложений.</p><p>imo, если вы собираетесь использовать какой-либо императивный язык программирования для описания java компонента swing, вы также можете просто использовать java. groovy и т.д. только добавляет осложнений без особого упрощения.</p><p>декларативные языки намного лучше, потому что даже непрограммисты могут иметь смысл из этого, особенно когда вам нужно делегировать задачу точной настройки определенных макетов художникам. xml идеально подходит для декларативных языков (по сравнению с другими вариантами) из-за простоты, удобочитаемости и множества доступных редакторов/инструментов преобразования и т.д.</p><p>вот проблемы, с которыми сталкиваются в декларативном программировании gui, а не в каком-то определенном порядке. эти проблемы были решены в cookswing.</p><ol> <li>читаемость и простота. (javafx не проще, чем xml. закрытие тегов xml очень помогает при чтении и не добавляет дополнительной типизации, поскольку редакторы xml обычно делают это за вас)</li> <li>расширяемость. очень важно, потому что пользовательские компоненты swing подойдут для любых нетривиальных проектов.</li> <li>макеты gui. также очень важно. возможность работы с borderlayout, gridbaglayout, jgoodies formslayout и т.д. практически необходима.</li> <li>простота копирования/вставки. при разработке макета необходимо опробовать разные. так что нужно уметь копировать/вставлять и перемещать вещи. xml лучше, потому что иерархию компонентов и макетов легко увидеть. javafx несколько проблематичен из-за многострочных атрибутов и проблем с отступами. наличие хорошего редактора является обязательным, и есть много хороших редакторов xml.</li> <li>шаблоны (т. е. возможность включать другой файл макета) очень полезны для согласованного вида. например, может потребоваться согласованный вид диалогов, панелей кнопок и т.д.</li> <li>взаимодействие с кодом java. это очень важно. некоторые компоненты gui могут быть созданы только с помощью кода java (по любой причине). таким образом, необходимо иметь возможность загружать эти объекты. также обязательно должна быть возможность напрямую подключать слушателей и другие java объекты/компоненты в xml-коде. использование идентификаторов для их последующего подключения не будет работать хорошо, так как это очень утомительно.</li> <li>интернационализация (i18n). возможность загрузки текста/строки из пакета ресурсов, а не из жестко закодированного текста. эта функция может иметь решающее значение для некоторых приложений.</li> <li>локализация (l10n). преимущество декларативного программирования (особенно с xml) заключается в том, что вы можете просто переключиться на другую форму графического интерфейса для конкретной локали и все. если вы кодируете с помощью java или любых других обязательных языков, это не так просто.</li> <li>проверка ошибок/допуск. первоначальные проекты часто будут содержать ошибки здесь и там. иногда ошибка может быть связана с тем, что соответствующий код java еще не разработан. или значок ресурса отсутствует. работа с ошибками с императивным кодированием чрезвычайно утомительна. таким образом, желательно иметь возможность обнаруживать ошибки, но в то же время быть устойчивыми к ошибкам, поэтому предварительный просмотр макета gui может быть сделан как можно раньше.</li> <li>замена компонентов графического интерфейса. то есть замените текстовое поле, в котором раньше был jtextfield, на более причудливую версию компонентов. замените значение диалога на некоторые модные диалоги пользовательского интерфейса (например, jide) вместо jdialog. эта функция может сэкономить значительное количество усилий. сам xml также полезен благодаря xslt и другим инструментам преобразования.</li> <li>вне свинга. потому что рано или поздно вы обнаружите, что многие конфигурации компонентов используют типы объектов, такие как массивы, значки, изображения, векторы и т.д.</li> </ol>

<p>если важна краткость, вы можете рассмотреть идиому двойной скобки:</p><pre><code>new jframe("my frame") {{ setname("myframe"); add(new jlabel("my first label") {{ setname("mylabel2"); }}; add(new jlabel("my second label") {{ setname("mylabel2"); }}; }} </code></pre><p>тогда вы не теряете мощь хорошо известного языка программирования общего назначения (вы знаете, что он вам понадобится, а jellytags - отстой). все, что вам нужно, это одна маленькая дополнительная идиома.</p><p>он не очень часто используется, потому что на самом деле люди, писающие с xml, не решали реальных проблем.</p><p>в общем случае вы можете использовать слои компоновщика для абстрагирования повторяющегося кода. код gui не должен быть плохо написан, просто он почти весь (в том числе в учебниках).</p>

<p>я настоятельно рекомендую <a href="http://www.miglayout.com/">mig layout</a> - потребуется несколько дней, чтобы привыкнуть к синтаксису, но как только вы его получите, он творит чудеса. я использовал jgoodies forms довольно давно, и концепция компоновки karsten работает хорошо, но она немного загадочна ... mig легче подобрать, и в результате получается удивительно лаконичный код.</p>

<p>если вы хотите немного выйти за рамки простой java, концепция "builder" <a href="http://groovy.codehaus.org">groovy</a> хорошо работает с gui. конечно, вы можете легко взаимодействовать между groovy и java. см. страницу <a href="http://groovy.codehaus.org/swing+builder">swing builder</a> для получения дополнительной информации.</p>

<p> <a href="http://www.ikayzo.org/confluence/display/ssw/home">sdl/swing</a> делает именно то, что вам нужно. это крошечная (283 кб), ненавязчивая, простая в освоении декларативная среда swing.</p><pre><code>menus { "file" { "open" do="open" // calls "open()" in the controller "---" "exit" do="exit" } } </code></pre><p>sdl/swing является открытым исходным кодом, но пользуется коммерческой поддержкой. мы (ikayzo.com) разработали его в течение нескольких лет и внедрили его в производственные системы для многих клиентов, от компаний, занимающихся наукой о жизни, до банков.</p>

<p>попробуйте swiby: <a href="http://swiby.codehaus.org/">http://swiby.codehaus.org/</a> </p><p>"swiby представляет собой смесь swing и ruby для действительно богатых распределенных приложений". другими словами, swiby является языком, специфичным для смешения доменов, и ruby.</p>

<p>хотя он не декларативный и ограничен исключительно макетами, вы можете взглянуть на <a href="https://designgridlayout.dev.java.net/">designgridlayout</a> , который позволяет программно определять макеты swing в очень сжатой форме (это открытый исходный код).</p><p>основные преимущества:</p><ul> <li>легко и быстро учиться.</li> <li>краткий код (1 строка кода на строку компонентов в форме), которая также облегчает обслуживание</li> <li>проверка во время компиляции (которую не может иметь декларативный интерфейс)</li> <li>соблюдение внешнего вида платформы (выравнивание базовой линии, зазоры между компонентами ...) без какого-либо жестко заданного значения длины</li> </ul>

<p>что-то новое ... <a href="http://www.xwt.org/">xwt</a> , будет включено в eclipse e4</p>

<p>я пробовал много решений, таких как swixml, javabuilders, miglayout, cookswing. наконец-то я нашел javafx и javafx-scenebuilder - лучшее и самое быстрое решение, инструмент на основе xml-интерфейса. вы хотели бы, чтобы сценостроитель создавал gui (с элементами перетаскивания!). кроме того, он использует css (каскадные таблицы стилей) для темы gui. просто доверяйте oracle, это лучший инструмент с графическим интерфейсом для java приложений. ознакомьтесь с созданием приложений javafx с помощью scenebuilder, здесь: <a href="http://docs.oracle.com/javafx/scenebuilder/1/get\_started/prepare-for-tutorial.htm#cegjbhha">http://docs.oracle.com/javafx/scenebuilder/1/get\_started/prepare-for-tutorial.htm#cegjbhha</a> </p>

<p>я могу найти следующие примеры того, что вы просите:</p><ul> <li> <a href="http://www.swixml.org/">swixml</a> </li> <li> <a href="http://swixat.sourceforge.net/index.htm">swixat the swing-xml authoring tool</a> (на основе swixml)</li> <li> <a href="http://cookxml.yuanheng.org/cookswing/">cookswing: xml в swing gui</a> </li> <li> <a href="http://jfcml.sourceforge.net/">jfcml - язык разметки jfc/swing xml</a> </li> <li>возможно <a href="http://www.jeasy.de/">jeasy</a> , я не уверен</li> </ul>

<p>я недавно сталкивался <a href="http://www.ikayzo.org/confluence/display/ssw/home">sdl/swing</a> .</p>

<p>как часто, это всегда хорошая идея, чтобы выполнить поиск, когда вы ищете что-то. <a href="http://java-source.net/open-source/xml-user-interface-toolkits">this</a> это первая ссылка в google при поиске "java xml gui"</p>

<p> <a href="http://code.google.com/javadevtools/download-wbpro.html">windowbuilder</a> , это очень хороший плагин, который включает в себя gwt, xwt, swt, swing и т.д.</p>