Подтвердить что ты не робот

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Вы можете посмотреть 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)

Ответ 2

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

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

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

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

  • Считываемость и простота. (JavaFX не проще, чем XML). Закрытие тегов XML помогает прочитать немного, и не добавляет лишнюю типизацию, поскольку XML-редакторы обычно делают это за вас)
  • расширяемость. Очень важно, потому что пользовательские компоненты Swing подходят для любых нетривиальных проектов.
  • Макеты GUI. Также очень важно. Возможность управлять BorderLayout, GridBagLayout, JGoodies FormsLayout и т.д. Практически обязательна.
  • Простота копирования/вставки. В процессе проектирования макета необходимо попробовать разные. Поэтому нужно иметь возможность копировать/вставлять и перемещать вещи. XML лучше, потому что иерархию компонентов и макетов легко увидеть. JavaFX несколько проблематичен из-за многострочных атрибутов и проблем с отступом. Наличие хорошего редактора является обязательным, и есть много хороших редакторов XML.
  • Шаблоны (т.е. возможность добавления другого файла макета) очень полезны для последовательного просмотра. Например, может потребоваться постоянный вид диалоговых окон, панелей кнопок и т.д.
  • Взаимодействие с Java-кодом. Это важно. Некоторые компоненты GUI могут быть созданы только с помощью Java-кода (по какой-либо причине). Таким образом, необходимо иметь возможность загружать эти объекты. Это также обязательно возможность напрямую подключать слушателей и другие объекты/компоненты Java в XML-коде. С помощью ids для их подключения позже WILL не будет работать, так как это очень утомительно.
  • Интернационализация (i18n). Возможность загрузки текста/строки из набора ресурсов, а не жестко закодированного текста. Эта функция может иметь решающее значение для некоторых приложений.
  • Локализация (l10n). Преимущество декларативного программирования (в частности, XML) заключается в том, что вы можете просто переключиться на другую форму GUI для определенной локали и ее. Если вы кодируете Java или любые другие императивные языки, это не так просто.
  • Проверка ошибок/допуски. Первоначальные проекты часто содержат ошибки здесь и там. Иногда ошибка может быть вызвана тем, что соответствующий Java-код еще не разработан. Или отсутствует ресурс значка. Работа с ошибками с императивным кодированием крайне утомительна. Таким образом, желательно иметь возможность находить ошибки, но в то же время быть толерантными к ошибкам, поэтому предварительный просмотр макета GUI можно сделать как можно раньше.
  • Замена компонента GUI. То есть, замените текстовое поле, которое использовало JTextField с некоторой более удобной версией компонентов. Замените значение диалога с помощью некоторых причудливых диалоговых окон пользовательского интерфейса (например, JIDE) вместо JDialog. Эта функция может сэкономить значительные усилия. Сам XML также полезен благодаря XSLT и другим инструментам преобразования.
  • Вне качелей. Поскольку рано или поздно вы найдете много конфигураций компонентов, используйте типы объектов, такие как массивы, значки, изображения, векторы и т.д.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

Недавно я встретил SDL/Swing.

Ответ 12

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

Ответ 13

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

Ответ 14

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