2

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

4

0 回答 0