簡體   English   中英

Cljfx:兩個相等的地圖鍵

[英]Cljfx: two equal map's keys

我想獲得這種行為:當用戶按下按鈕時,按鈕的文本和標簽的文本應該一起更改。 但問題是按鈕和 label 具有相同的文本屬性鍵名稱。 而且我不能在一個哈希映射中存儲相等的鍵。



;;I have two atoms keeps the state of button text and state of label text 
(def *button-text (atom 
                   {:text "click me"}))

(def *label-text (atom 
                   {:text "press the button"}))

;;I have the root function which should accepts arguments for button and label props.
But these props have equal names  - text - and I can't store two equal keys in one map.

{:fx/type root
 :text (:text *button-text)
 :text (:text *label-text)}

;;This will cause an error.

這就是我解決這個問題的方法。 但是代碼太多而且不正常。

(ns examp.core
  (:gen-class)
  (:require [cljfx.api :as fx])
  (:import [javafx.application Platform]))

(def *button-text (atom 
                   {:text "click me"}))

(def *label-text  (atom 
                   {:text "press the button"}))


(def renderer (fx/create-renderer))


(defn root [{:keys [one two]}]
  (let [button-text  (:text one)
        label-text (:text two)]
  {:fx/type :stage
   :showing true
   :title "Window"
   :width 250
   :height 150
   :scene {:fx/type :scene
           :root {:fx/type :v-box
                  :alignment :center
                  :spacing 10
                  :children [{:fx/type :label
                              :text label-text}
                             {:fx/type :button
                              :min-width 100
                              :min-height 50
                              :text button-text
                              :on-action (fn [_]
                                           (if (= button-text "click me")
                                             (do 
                                               (swap! *button-text assoc :text "clicked")
                                               (swap! *label-text assoc :text "button is pressed")
                                               (renderer
                                                 {:fx/type root
                                                  :one @*button-text
                                                  :two @*label-text}))
                                             (do 
                                               (swap! *button-text assoc :text "click me")
                                               (swap! *label-text assoc :text "presse the button")
                                               (renderer
                                                 {:fx/type root
                                                  :one @*button-text
                                                  :two @*label-text}))))}]}}}))
                                             



(defn -main [& args]
  (Platform/setImplicitExit true)
  (renderer {:fx/type root 
             :one @*button-text
             :two @*label-text}))








在我向您展示我的嘗試之前,這里是官方 Cljfx 示例存儲庫的鏈接。 這些示例應該對您有用,因為它們展示了管理應用程序 state、事件處理等的實踐。

對於這種情況,我建議研究e05_fn_fx_like_state.clj - 這也是我的代碼基於的示例:

(ns examp.core
  (:require [cljfx.api :as fx])
  (:gen-class))

(def *state
  (atom {:label-text  "Click the button."
         :button-text "Click me!"}))

(defn root [{:keys [label-text button-text]}]
  {:fx/type :stage
   :showing true
   :title   "Window"
   :width   250
   :height  150
   :scene   {:fx/type :scene
             :root    {:fx/type   :v-box
                       :alignment :center
                       :spacing   10
                       :children  [{:fx/type :label
                                    :text    label-text}
                                   {:fx/type    :button
                                    :text       button-text
                                    :min-width  100
                                    :min-height 50
                                    :on-action  {:key :button-action}}]}}})

(defn map-event-handler [event]
  (when (= (:key event) :button-action)
    (if (= (:button-text @*state) "Click me!")
      (reset! *state {:label-text  "The button was clicked!"
                      :button-text "Clicked!"})
      (reset! *state {:label-text  "Click the button."
                      :button-text "Click me!"}))))

(def renderer
  (fx/create-renderer
    :middleware (fx/wrap-map-desc root)
    :opts {:fx.opt/map-event-handler map-event-handler}))

(defn -main [& args]
  (fx/mount-renderer *state renderer))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM