Как создать MigLayout для простой игры тральщика?

Я работаю над простой игрой в минный тральщик, в основном, чтобы немного выучить язык. "Основной движок игры" готов, и теперь я хотел бы добавить простой пользовательский интерфейс. Я посмотрел на качели, и до сих пор это работало довольно хорошо.

Единственное, с чем я борюсь - это миг-макет, который я бы хотел использовать. Моя идея состоит в том, чтобы иметь вид следующего макета:

 _______________________
[_________NORTH_________]
[   ][             ][   ]
[ W ][    FIXED    ][ E ]
[ E ][    SIZE     ][ A ]
[ S ][    BOARD    ][ S ]
[ T ][             ][ T ]
[___][_____________][___]
[_________SOUTH_________]

Север, запад, восток и юг должны расти в случае изменения размера окна. Основная панель должна иметь фиксированный размер со всеми кнопками, представляющими игровое поле.

Перед тем, как прочитать о макете mig, я подумал о том, чтобы использовать рамочную панель, содержащую панель сетки, но, как уже упоминалось на странице github seesaw:

Seesaw имеет элементарную поддержку GridBagLayout в функции seesaw.core/form-panel. Я не рекомендую использовать это, потому что он наполовину испечен и не такой мощный, как использование MigLayout (seesaw.mig) или JGoodies (seesaw.forms).

Я бы хотел попробовать MigLayout. Моя первая попытка:

(defn make-border-panel 
[]
(mig-panel 
 :constraints ["fill" "[grow][][grow]" "[grow][][grow]"]
 :items [ 
       ["X"                  "shrink 0"  ]
       ["X"                  "shrink 0"  ]
       ["X"                  "shrink 0"  ]
       ["X"                  "shrink 0"  ]
       ["X"                  "shrink 0"  ]
       ["X"                  "shrink 0"  ]
       ["X"                  "shrink 0"  ]
       ["X"                  "shrink 0"  ]
       ["X"                  "shrink 0"  ]
       ["Minesweeper North"  "dock north"]
       ["W"                  "dock west" ]
       ["E"                  "dock east" ]
       ["Minesweeper South"  "dock south"]
      ]))

ОБНОВЛЕНИЕ 1

Я пока проигнорирую север, юг, запад, восток и сделал следующее, чтобы получить хотя бы центральную доску:

(defn make-button [x y]
   (button :id (format "cell_%d_%d" x y)
           :icon (clojure.java.io/resource "minesweeper/icons/button.png")))


(defn make-board
  [w h]
  (mig-panel 
      :constraints [(str "wrap" w) "[]" "[]" ]
      :items (for [x (range w) y (range h)]  
          (vector (make-button x y) "w 24px!, h 24px!"))))

1 ответ

Решение

Я понял, что мне действительно не нужны панели WEST и EAST для моей игры тральщика. Мой окончательный макет выглядит так:

 _____________
[____NORTH____]
[             ]
[             ]
[   CENTER    ]
[             ]
[_____________]
[____SOUTH____]

Сам центр - другая панель миграции, которая содержит кнопки, представляющие мины. Код в clojure выглядит следующим образом:

(defn make-layout
  [rows cols level]
  (mig-panel
   :constraints ["wrap1" "[center]" "[][]" ]
   :items       [[(make-info-panel)]
                [(make-board-panel rows cols level)]]))


(defn make-board-panel
  [rows cols level]
  (let [bg (button-group)]
    (mig-panel
     :constraints [(str "gap 0, wrap" rows) "[]" "[]" ]
     :items       (for [row (range rows) col (range cols)]
                    (vector (make-button row col level bg) "w 24px!, h 24px!")))))
Другие вопросы по тегам