我正在编写GUI,需要能够用另一个窗格替换border-pane
的{{1}}部分。问题是,处理程序中对: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
替换:content
,那么它会按照我的预期运作。
为什么config!
不在这里工作?是否有必要使用config!
?
更新
事实证明按钮 有效,但它只是在因某种原因调整窗口大小后才进行更改。
当它添加新面板时,它会将其覆盖在前一个面板上而不是替换它。它看起来需要重新绘制,所以我尝试运行replace!
,但它没有任何区别。
此时我意识到我可能只需要使用(sc/repaint! (sc/select base-pane [:*]))
,但后来遇到了如何获得前一个孩子的问题。 sc/replace!
不起作用。我想我必须给每个孩子上课,然后使用(config base-pane :center)
。