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

Для эффективности сначала создаем set из имен в b, затем фильтруем список a:

from operator import itemgetter

def returnOnlyOne(a, b):
    b_names = set(map(itemgetter('name'), b))
    only_in_a = list(filter(lambda item: item['name'] not in b_names, a))
    return only_in_a

Пример вывода:

a = [
       {'name': 'joseph', 'age': 33}, 
       {'name': 'Emma', 'age': 11}, 
       {'name': 'apple', 'age': 44}
    ]
b = [ 
       {'name': 'apple', 'age': 44}, 
       {'name': 'Emma', 'age': 22}
    ]

print(returnOnlyOne(a, b))
# [{'name': 'joseph', 'age': 33}]

Если вам не нравятся itemgetter, filter и т. П., Вы можете написать то же самое, используя понимание:

def returnOnlyOne(a, b):
    b_names = set(item['name'] for item in b)
    return [ item for item in a if item['name'] not in b_names]

55
задан Jonas 13 December 2011 в 14:03
поделиться

12 ответов

Вы можете взглянуть на 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)
23
ответ дан 7 November 2019 в 07:25
поделиться

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

0
ответ дан 7 November 2019 в 07:25
поделиться

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

1
ответ дан 7 November 2019 в 07:25
поделиться

попробовать Свиби: http://swiby.codehaus.org/

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

2
ответ дан 7 November 2019 в 07:25
поделиться

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

7
ответ дан 7 November 2019 в 07:25
поделиться

I strongly recommend MiG Layout - it takes a few days to get used to the syntax, but once you've got it, it works wonders. I used JGoodies Forms for quite awhile, and Karsten's builder concept works well, but it is a bit cryptic... MiG is easier to pick up, and results in wonderfully concise code.

11
ответ дан 7 November 2019 в 07:25
поделиться

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

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

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

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

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

13
ответ дан 7 November 2019 в 07:25
поделиться

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

1
ответ дан 7 November 2019 в 07:25
поделиться

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

ИМО, если вы собираетесь использовать какие-либо императивные языки программирования для описания компонента 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. Beyond Swing. Потому что рано или поздно вы обнаружите, что во многих конфигурациях компонентов используются такие типы объектов, как массивы, значки, изображения, векторы и т. Д.
20
ответ дан 7 November 2019 в 07:25
поделиться

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

1
ответ дан 7 November 2019 в 07:25
поделиться

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

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

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

2
ответ дан 7 November 2019 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: