Clojure 使用配置!在处理器中';行不通

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

我正在编写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 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