2012-04-17 2 views
3

Я настраиваю свинг пользовательского интерфейс в Clojure и есть блок как:Нормальный метод экземпляра вызывает в Clojure DOTO

(doto main-frame 
    (.setUndecorated true) 
    (.setExtendedState Frame/MAXIMIZED_BOTH) 
    (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE) 
    (.setVisible true) 
    ) 

Но теперь я хочу назвать

(.setBackground (.getContentPane main-frame) Color/BLACK) 

перед тем, как установить видимый кадр, есть ли лучший способ сделать это, чем завершение doto и использование синтаксиса (.instanceMember instance args *)?

+0

почему не призыв к '' (.setBackground ...) '' просто идти до '' (doto) ''? – sw1nn

+0

Это может, но это всегда заставляет всегда иметь def для JFrame, а не использовать конструктор в качестве первого аргумента для doto: '(doto (JFrame.) (.setVisible true))' – Baxter

ответ

5

Если вы действительно хотите один doto, то, возможно, это будет делать:

(doto main-frame 
    (.setUndecorated true) 
    (.setExtendedState Frame/MAXIMIZED_BOTH) 
    (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE) 
    (-> (.getContentPane) (.setBackground Color/BLACK)) 
    (.setVisible true)) 

выше опирается на тот факт, что doto не ограничивается методами Java, он просто вставляет свой первый аргумент (оценивается), как первый аргумент каждой следующей формы.

Я бы пошел с окончанием doto, хотя вышеизложенное не очень читаемо. С другой стороны, может быть, просто определить set-background-on-content-pane функцию (что, очевидно, принимает main-frame) и использовать его в doto:

(defn set-bg-on-frame [fr color] (.setBackground (.getContentPane fr) color)) 

(doto main-frame 
    . 
    . 
    . 
    (set-bg-on-frame Color/BLACK) 
    (.setVisible true)) 
+0

Спасибо , параметр 'set-background-on-content-pane' кажется самым чистым. – Baxter

+0

@Baxter Переименован в примере для установки-bg-on-frame. Функциональное именование - это искусство :-) –

+1

Ха, гораздо более дружелюбный к пальцам. Жаль, что нет более общей конструкции для всплытия или вложения '(doto)' ooh, на самом деле: '(.. getContentPane (setBackground Цвет/ЧЕРНЫЙ)). Кажется, что игра хороша с вставкой аргумента doto. – Baxter

Смежные вопросы