Clojure 使用配置!在处理器中';行不通
我正在编写GUI,需要能够用另一个窗格替换Clojure 使用配置!在处理器中';行不通,clojure,seesaw,Clojure,Seesaw,我正在编写GUI,需要能够用另一个窗格替换边框窗格的: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
边框窗格的:center
部分。问题是,调用config处理程序中的code>没有更改窗格的效果。所有其他几乎相同的呼叫都在别处工作
问题可以总结为:
(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
替换:居中
部分,但它没有。点击处理程序正在启动,config代码>似乎什么都没做
调用config代码>在底部工作,即使最后一次调用是相同的
在四处搜索之后,我找到了一个解决方案,但这有点让我感到困惑。如果我将处理程序更改为
(fn [_]
(sc/replace! base-pane child1 child2)
它起作用了。但我不喜欢这样,有几个原因:
- 我需要知道目前的内容是什么。如果我不知道,我需要做一个查找,这似乎是浪费
- 如果我给它一个要替换的子对象,它可能需要搜索父对象以找到子对象。同样,这似乎是不必要的浪费
如果基本窗格
是一个框架
,我想用配置替换它的:内容
s代码>,它会像我期望的那样工作
为什么不config代码>在这里工作?是否需要使用replace代码>
更新:
- 原来按钮有效果,但由于某种原因,它只是在调整窗口大小后才进行更改
- 添加新面板时,它会将其覆盖在上一个面板上,而不是替换它。它看起来需要重新绘制,所以我试着运行
(sc/repaint!(sc/select base pane[:*])
,但没有什么不同
- 这时我意识到我可能不得不使用
sc/replace代码>,但随后遇到了如何获取上一个子项的问题<代码>(配置基本窗格:中间)
不起作用。我想我必须给每个孩子上一节课,然后使用sc/select