border-paneGUI を作成していて、の:centerセクションを別のペインに置き換える必要があります。問題は、ハンドラーでの呼び出しがconfig!ペインを変更する効果がないことです。他のすべてのほぼ同一の呼び出しは、他の場所で機能します。
問題は次のように要約できます。
(ns live-math-pet.gui.mcve
(:require [seesaw.core :as sc]))
(defn -main []
(let [; The starting contents
child1 (sc/label :text "Hello!")
; What I want to change to at the click of a button
child2 (sc/label :text "World!")
base-pane (sc/border-panel :center child1)
change-btn (sc/button :listen [:action
(fn [_]
; This doesn't change the :center area
(sc/config! base-pane :center child2))])
frame (sc/frame :content base-pane)]
(sc/config! base-pane :south change-btn)
; These work, but the call to config! in the handler doesn't
(sc/config! base-pane :center (sc/label "Test1"))
(sc/config! base-pane :center child1)
(-> frame
(sc/pack!)
(sc/show!))))
問題は、ボタンをクリックしても何も起こらないことです。config!セクションを置き換えることを期待し:centerていますが、そうではありません。クリック ハンドラーが起動config!していますが、何もしていないようです。
最後の呼び出しconfig!は同じですが、一番下の呼び出しは機能します。
いろいろと調べてみると解決策が見つかりましたが、ちょっと面倒です。ハンドラを次のように変更すると
(fn [_]
(sc/replace! base-pane child1 child2)
できます。ただし、いくつかの理由でこれは好きではありません。
現在のコンテンツが何であるかを知る必要があります。わからない場合は、ルックアップを行う必要がありますが、これは無駄に思えます。
置き換える子を与えている場合、おそらく子を見つけるために親を検索する必要があります。繰り返しますが、これは不必要に無駄に思えます。
base-paneが で、を使用しframeて を置き換えたい場合、期待どおりに動作します。:contentconfig!
config!ここで機能しないのはなぜですか?を使用する必要がありますreplace!か?
アップデート:
ボタンに効果があることがわかりましたが、何らかの理由でウィンドウのサイズを変更した後にのみ変更されます。
新しいパネルを追加すると、それを置き換えるのではなく、前のパネルの上に重ねます。塗り直しが必要なようだったので を走らせてみ
(sc/repaint! (sc/select base-pane [:*]))ましたが変わりませんでした。この時点で
sc/replace!、 を使用する必要があるかもしれないことに気付きましたが、前の子を取得する方法の問題に遭遇しました。(config base-pane :center)動作しません。私は、各子供にクラスを与えてから、 を使用する必要があると思いますsc/select。