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

StackOverflow https://stackoverflow.com/questions/761237

Вопрос

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

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

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

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

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

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

п.с.Я попробовал несколько поисковых запросов в Google («декларативный Java-интерфейс»), но не совсем знал, что искать.

Это было полезно?

Решение

Вы могли бы взглянуть на разработчики Java;оно использует ЯМЛ для создания пользовательских интерфейсов 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)

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Недавно я столкнулся СДЛ/Свинг.

что-то новое...XWT, будет включен в затмение e4

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top