предложения по декларативному программированию графического интерфейса на Java

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

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

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

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

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

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

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


person Jason S    schedule 17.04.2009    source источник
comment
LOL - Ни одного ответа по поводу JavaFX   -  person willcodejavaforfood    schedule 21.04.2009
comment
да, я заметил. Не вызывает у меня чувства тепла и нечеткости. Хотя я попробовал некоторые из их примеров кода, и это было довольно аккуратно.   -  person Jason S    schedule 21.04.2009
comment
Я сам задавался вопросом об отсутствии комментария JavaFX. В любом случае для всего следующего и JavaFX (и осмелимся мы включить XAML, XUL и wxWidgets ...) - Все эти вещи нуждаются в таком средстве, как Ant, которое позволяет вам расширять инструменты в классе (widget). Некоторая информация о мета-виджетах и ​​"поддержка инструментов"   -  person will    schedule 12.05.2013
comment
Вторая вещь, и я удивился, как я это забыл. Макет должен быть отделен от «дизайна» и содержания.   -  person will    schedule 12.05.2013


Ответы (14)


Вы можете ознакомиться с 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)
person Michael Myers    schedule 17.04.2009
comment
Я, вероятно, выберу javabuilders, он, кажется, хорошо оценивается по моим некоторым из моих неявных критериев: достойная документация / учебник, полнофункциональный (с привязками, хуками менеджера компоновки и т. Д.). - person Jason S; 17.04.2009

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

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

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

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

  1. Читаемость и простота. (JavaFX не проще, чем XML. Закрывающие теги XML немного помогают при чтении и не добавляют особого набора текста, поскольку редакторы XML обычно делают это за вас)
  2. Расширяемость. Очень важно, потому что кастомные компоненты Swing пригодятся для любых нетривиальных проектов.
  3. Макеты графического интерфейса. Также очень важно. Возможность обрабатывать BorderLayout, GridBagLayout, JGoodies FormsLayout и т. Д. Практически обязательна.
  4. Простота копирования / вставки. В процессе разработки макета необходимо опробовать разные. Таким образом, нужно иметь возможность копировать / вставлять и перемещать вещи. XML лучше, потому что иерархию компонентов и макетов легко увидеть. JavaFX несколько проблематичен из-за многострочных атрибутов и проблем с отступами. Обязательно наличие хорошего редактора, и существует множество хороших редакторов XML.
  5. Шаблоны (то есть возможность включать другой файл макета) очень полезны для единообразного внешнего вида. Например, может потребоваться единообразный вид диалогов, панелей кнопок и т. Д.
  6. Взаимодействие с Java-кодом. Это очень важно. Некоторые компоненты графического интерфейса могут быть созданы только с помощью кода Java (по любой причине). Таким образом, необходимо иметь возможность загружать эти объекты. Также необходимо иметь возможность напрямую подключать слушателей и другие объекты / компоненты Java в коде XML. Использование идентификаторов для их последующего подключения НЕ БУДЕТ работать, так как это очень утомительно.
  7. Интернационализация (i18n). Возможность загружать текст / строку из пакета ресурсов, а не жестко закодированный текст. Эта функция может иметь решающее значение для некоторых приложений.
  8. Локализация (l10n). Преимущество декларативного программирования (особенно с XML) состоит в том, что вы можете просто переключиться на другую форму графического интерфейса пользователя для конкретной локали и все. Если вы пишете код на Java или любых других императивных языках, это не так просто.
  9. Проверка ошибок / допуск. Первоначальные проекты часто содержат ошибки здесь и там. Иногда ошибка может быть связана с тем, что соответствующий код Java еще не разработан. Или ресурс значка отсутствует. Устранение ошибок с помощью императивного кодирования чрезвычайно утомительно. Таким образом, желательно иметь возможность обнаруживать ошибки, но в то же время быть устойчивыми к ошибкам, чтобы предварительный просмотр макета графического интерфейса пользователя мог быть выполнен как можно раньше.
  10. Замена компонентов графического интерфейса. То есть замените текстовое поле, в котором раньше был JTextField, на более интересную версию компонентов. Замените смысл диалога некоторыми причудливыми диалогами пользовательского интерфейса (такими как JIDE) вместо JDialog. Эта функция может сэкономить значительное количество усилий. Сам XML также полезен благодаря XSLT и другим инструментам преобразования.
  11. Помимо свинга. Потому что рано или поздно вы обнаружите, что многие конфигурации компонентов используют типы объектов, такие как массивы, значки, изображения, векторы и т. Д.
person Community    schedule 28.05.2009
comment
У меня есть инструмент, который может это сделать, и вот вещи, о которых я должен был подумать, гораздо более полезны, чем у меня есть инструмент, который может это сделать, вы должны использовать его, потому что это здорово. +1 - person MatrixFrog; 03.07.2010
comment
он размещен исключительно на SourceForge? нет репозитория Maven? - person Display Name; 04.06.2014

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

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

person Tom Hawtin - tackline    schedule 17.04.2009
comment
да - на самом деле довольно гладко. Хороший. - person Kevin Day; 18.04.2009
comment
Есть тонкая грань между ловким и неприятным. :) - person Tom Hawtin - tackline; 18.04.2009
comment
Eclipse переформатирует это во что-то, что требует МНОГО строк :( - person Thorbjørn Ravn Andersen; 27.04.2010
comment
@Tom, у нас есть Format Source в качестве действия сохранения по умолчанию в Eclipse, поэтому исходный код всегда нормализован. Это сделано для того, чтобы создать наилучшие условия для сопровождающих, которым необходимо заглядывать в историю репозитория. - person Thorbjørn Ravn Andersen; 27.04.2010
comment
Выглядит неплохо, но есть ли у вас какая-либо информация о возможном влиянии на производительность определения нового класса везде, где вы его используете? - person Bart van Heukelom; 15.01.2011
comment
@Bart van Heukelom Он добавляет около 2 КБ (0,000002 ГБ) на файл класса. Это в некоторой степени повлияет на время запуска, но не имеет значения для последующего времени выполнения. - person Tom Hawtin - tackline; 15.01.2011
comment
@Tom [at] formatter: off [at] formatter: on Да, это требует дополнительных настроек, но эй - для людей, читающих это, это хороший способ обхода тех случаев, когда это форматирование никому не помогает. - person Daniel B. Chapman; 23.12.2011

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

person Kevin Day    schedule 18.04.2009
comment
спасибо - рекомендации mmyers для Javabuilders также привели меня к MiG Layout. - person Jason S; 18.04.2009
comment
Я просто отказался от использования конструкторов графического интерфейса (VisualBuilder) из-за MigLayout :) - person jb.; 10.05.2009
comment
выглядит очень аккуратно, и кто-то даже написал модуль clojure, чтобы обернуть его. спасибо за указатель. - person Martin DeMello; 28.05.2009
comment
Коллега не может перестать хвалить MIG Layout. - person Thorbjørn Ravn Andersen; 03.07.2010
comment
С тех пор, как я это обнаружил, весь мой код графического интерфейса написан с использованием MiG Layout. Он очень мощный, а код по-прежнему очень удобен для чтения и сопровождения. Единственным недостатком является то, что к нему нужно немного привыкнуть (шпаргалка по макету MiG очень помогает в этом процессе ^^). - person brimborium; 29.08.2015

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

person Jon Skeet    schedule 17.04.2009

попробуйте Swiby: http://swiby.codehaus.org/

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

person paweloque    schedule 17.04.2009

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

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

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

person Daniel Leuck    schedule 08.06.2010

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

person Eddie    schedule 17.04.2009

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

person Jonas    schedule 26.04.2010

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

person Community    schedule 26.05.2009

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

person Shayan_Aryan    schedule 03.07.2013

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

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

  • легко и быстро учиться.
  • краткий код (1 строка кода на строку компонентов в форме), который также упрощает обслуживание
  • проверка во время компиляции (чего не может быть в декларативном пользовательском интерфейсе)
  • соблюдение внешнего вида платформы (выравнивание базовой линии, промежутки между компонентами ...) без какого-либо жестко заданного значения длины
person jfpoilpret    schedule 20.04.2009
comment
@ Mahmoud-Aziz, возможно, вы не поверите, что не можете использовать его за один час, но вы действительно пробовали? Я не могу поверить, что вы пытались использовать его за один час :-) Лично я подтверждаю, что любой разработчик Swing может начать использовать его всего через час (прочтите документацию, используйте автозавершение кода, выполните некоторые начальные проверки, и все готово) . Обратите внимание, что я не упоминал, что вы можете делать ВСЕ, ЧТО захотите, через час, для более сложных форм может потребоваться еще несколько часов ... - person jfpoilpret; 29.08.2015

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

person gizmo    schedule 17.04.2009
comment
хорошая точка зрения. Однако вы должны знать, что искать. Я погуглил декларативный графический интерфейс Java, не знаю, почему я не подумал об использовании xml в качестве поискового запроса. - person Jason S; 17.04.2009
comment
@Jason S: +1, я думаю, что указание на поисковые запросы Google, которые, похоже, не работают для вас, - это хорошая идея для того, какую информацию добавить, задавая вопрос. - person Arnold Spence; 17.04.2009

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

person HeyJoy    schedule 11.01.2012