Статьи

MigLayout: неизбежный выбор для пользователей Griffon?

Мне кажется, точно так же, как Griffon сделает Groovy еще более жизнеспособным вариантом для разработчиков Swing, так что это сделает MigLayout все более неизбежным. Это не будет новостью для тех, кто знаком с Groovy или MigLayout. Тем не менее, давайте отложим слова в сторону и взглянем просто на код, на любые задержки, а также на новичков в MigLayout.

Во-первых, прочитайте приложение My First Griffon , написанное вчера Джошем Ридом (также, чтобы узнать, как Гриффон справляется с арктическими условиями), где он утверждает:

«Я провел большую часть своего времени за пользовательским интерфейсом. Это был, казалось бы, бесконечный цикл настройки кода и тестирования, griffon run-appчтобы он выглядел так, как я хотел. просто отстой. После слишком долгой попытки заставить стандартные Java-менеджеры делать то, что я хочу, я сделал себе одолжение и скачал MigLayout ».

Это был именно мой опыт в портировании на Griffon . Единственная болевая точка, с которой Groovy уходит, это дизайн пользовательских интерфейсов. Возможно, может помочь GUI Builder в среде IDE NetBeans для Swing, но в этом нет необходимости, и я не считаю, что это действительно необходимо. Во-первых, я хотел бы указать на Metawidget, автоматический генератор пользовательского интерфейса, который подробно описал некоторое время назад здесь на Javalobby Ричард Кеннард , его создатель, сам. Во-вторых, есть MigLayout. Как указывалось выше (посмотрите на код в записи блога Джоша Рида) и ниже, мы переписываем MigLayout Грегга Болинджера (строка с 9 по 24 ниже) моего ужасно запутанного GridBagLayout из Porting to Griffon :

application(title:'Anagrams', minimumSize:[297, 200], location:[50,50],
    pack:true, locationByPlatform:true) {
    menuBar( id: 'menuBar') {
        menu(text: 'File', mnemonic: 'F') {
            menuItem(aboutAction)
            menuItem(exitAction)
        }
    }
    panel(border:emptyBorder(12), layout:new MigLayout('fill')) {
        label(text: 'Scrambled Word:')
        textField(id: 'scrambledWord', text: bind {model.scrambledWord},
            columns: 20, editable: false,
            constraints: "wrap")
        label(text: 'Your Guess:')
        textField(id: 'guessedWord',
            columns: 20,
            constraints: "wrap")
        label(id:'feedbackLabel', text: bind {model.feedback}, constraints: "wrap")
        panel(name:'buttonPanel', layout:new FlowLayout(FlowLayout.RIGHT),
constraints: "growx, span") {
          button(action: guessWordAction)
          button(action: nextWordAction)
        }
        bean( model, guessedWord: bind {guessedWord.text} )
    }
}

Для контраста рассмотрим оригинальный GridBagLayout, который, помимо его сложности, примерно вдвое длиннее:

application(title:'Anagrams', minimumSize:[297, 200], location:[50,50],
pack:true, locationByPlatform:true) {
menuBar( id: 'menuBar') {
menu(text: 'File', mnemonic: 'F') {
menuItem(aboutAction)
menuItem(exitAction)
}
}
panel(border:emptyBorder(12)) {
gridBagLayout()
label(text: 'Scrambled Word:',
constraints: gridBagConstraints(
gridwidth: 1, gridheight: 1,
fill: HORIZONTAL, anchor: WEST,
weightx: 0.0, weighty: 0.0,
insets: [0,0,12,6]))
textField(id: 'scrambledWord', text: bind {model.scrambledWord},
columns: 20, editable: false,
constraints: gridBagConstraints(
gridwidth: REMAINDER, gridheight: 1,
fill: HORIZONTAL, anchor: CENTER,
weightx: 1.0, weighty: 0.0,
insets: [0,0,12,0]))
label(text: 'Your Guess:',
constraints: gridBagConstraints(
gridwidth: 1, gridheight: 1,
fill: HORIZONTAL, anchor: WEST,
weightx: 0.0, weighty: 0.0,
insets: [0,0,20,6]))
textField(id: 'guessedWord',
columns: 20,
constraints: gridBagConstraints(
gridwidth: REMAINDER, gridheight: 1,
fill: HORIZONTAL, anchor: CENTER,
weightx: 1.0, weighty: 0.0,
insets: [0,0,20,0]))
label(id:'feedbackLabel', text: bind {model.feedback},
constraints: gridBagConstraints(
gridx: 1, gridy: RELATIVE,
gridwidth: REMAINDER, gridheight: 1,
fill: HORIZONTAL, anchor: CENTER,
weightx: 1.0, weighty: 0.0,
insets: [0,0,20,0]))
button(action: guessWordAction, constraints: gridBagConstraints(
gridx: 1, gridy: RELATIVE,
gridwidth: 1, gridheight: REMAINDER,
fill: NONE, anchor: SOUTHEAST,
weightx: 1.0, weighty: 1.0,
insets: [0,0,0,6]))
button(action: nextWordAction, constraints: gridBagConstraints(
gridwidth: REMAINDER, gridheight: REMAINDER,
fill: NONE, anchor: SOUTHEAST,
weightx: 0.0, weighty: 1.0,
insets: [0,0,0,0]))
bean( model, guessedWord: bind {guessedWord.text} )
}
}

Мало того, что вышеупомянутое было почти невозможно написать, но только вообразите необходимость поддержать все это. И результат такой же, как переписывание Грегга в MigLayout. Я считаю, что структура, подобная Grails, которую Griffon предлагает пользователям Groovy, сделает ее все более привлекательной, что, в свою очередь, сделает MigLayout неизбежным первым выбором, когда речь заходит о разработке представления приложений Griffon. И поэтому, короче говоря, если вы тоже обратились в MiGLayout, пожалуйста, покажите свою признательность и свою потребность, проголосовав за добавление MiGLayout в JDK !