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