使用配置!在处理程序中不起作用

时间:2017-10-05 00:21:04

标签: clojure seesaw

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

0 个答案:

没有答案