2012-04-17 75 views
3

我設置了Clojure中擺動UI中調用,並有塊這樣的:普通實例方法的Clojure多託

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

但現在我想打電話給

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

之前,我設置框架可見,是否有更好的方法來做到這一點比結束doto和使用(.instanceMember實例參數*)語法?

+0

爲什麼不能調用''(.setBackground ...)''只是去之前''(doto)''? – sw1nn 2012-04-17 10:23:41

+0

它可以,但總是強制一個總是有一個def的JFrame,而不是能夠使用構造函數作爲doto的第一個參數,如:'(doto(JFrame。)(.setVisible true))' – Baxter 2012-04-17 10:56:03

回答

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

Thanks ,'set-background-on-content-pane'選項似乎最乾淨。 – Baxter 2012-04-17 11:06:51

+0

@Baxter在示例中重命名爲set-bg-on-frame。函數命名是一種藝術:-) – 2012-04-17 11:10:25

+1

哈,更方便手指,這是一個恥辱,沒有一個更普遍的構造彈出或嵌套'(doto)'哦,實際上:'(.. getContentPane(setBackground Color/BLACK))'似乎對doto參數插入效果很好。 – Baxter 2012-04-17 11:44:31