将简单的ltk应用程序转换为Clojure跷跷板/秋千



我正试图为即将到来的项目在Clojure和CL之间做出决定。为了获得经验,我尝试了一些简单的GUI内容。

下面是我在CL/Ltk中的内容:

(ql:quickload "ltk")
(defpackage :myed
  (:use :ltk :cl))
(in-package :myed)
(defun ed-label (fr)
  (make-instance 'label :master fr :font "Sans-Serif" :text "Editor"))
(defparameter *text-field*
  (make-instance 'text
         :font "monospaced" :takefocus :t))
(defparameter *a-tale*
  "It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light")
(defun make-frame ()
  (with-ltk ()
    (let* ((f (make-instance 'frame))
       (scroll (make-instance 'scrolled-text :master f))
       (outtext (textbox scroll)))
      (pack f)
      (configure outtext :font "monospaced" :background "#aea79f" :wrap :word)
      (pack (ed-label f) :anchor :nw :side :top)
      (pack scroll :anchor :nw :expand t :fill :both)
      (pack *text-field* :anchor :sw :fill :x :ipady 10)
      (setf (text outtext) *a-tale*)
      (bind *text-field* "<KeyPress-Return>"
        (lambda (event) (format-output outtext)))
      (configure f :borderwidth 2))))
(defun format-output (target)
  "Print inputstring with newlines and > ."
  (append-text target (format nil "~%~%> ~A~%~%" (text *text-field*)))
  (clear-text *text-field*))

两个文本字段,当我在底部窗口输入文本并按回车键时,会添加换行符和">",并将文本附加在顶部文本字段中。

在Clojure中,我尝试了Seesaw和这个:

(ns myedclj.core
  (:use [seesaw core keymap])
  (:require [seesaw.bind :as bind]))
(def outtext
    ( text
    :multi-line? true :wrap-lines? true  :editable? false))
(def ed-label (label :text "Editor"))
(def intext
  (text :multi-line? false :editable? true))
(def a-tale
  "It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light")
(defn format-output
  [target]
  (.append target (str "nn" "> " (text intext))))
(map-key intext "ENTER" (fn [_] (format-output outtext)))
(text! outtext a-tale)
(defn make-frame []
  (frame :content (vertical-panel
                   :border 2
                   :items [ed-label
                           (scrollable outtext)
                           intext])))
(defn -main [& args]
  (-> (make-frame)
      pack!
      show!))

不幸的是,这不起作用。窗口内容的尺寸与我想要的相反,我没有看到任何滚动条。我的Swing知识几乎没有。

(更新为更接近CL版本的工作方式。

查看版本历史记录,查看带有可拖动分隔符的90/10拆分版本。

当文本不再适合输出文本区域时,滚动条将立即出现。

大小也可以配置为(config! in-text :size [400 :by 20]), out-scrollable类似。

(ns myedclj.core
  (:require [seesaw.core :refer :all]
            [seesaw.keymap :refer :all]
            [seesaw.bind :as bind]))
(def in-text
  (text :editable? true :multi-line? false
        :size [400 :by 20]))
(def out-text
  (text :editable? false :multi-line? true :wrap-lines? true))
(def out-scrollable
  (scrollable out-text
              :size [400 :by 180]))
(def a-tale
  "It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light")
(defn format-output! [source target]
  (value! target (str (value target) "nn> " (value source)))
  (value! source ""))
(defn attach-listeners! []
  (map-key in-text "ENTER"
           (fn [_] (format-output! in-text out-text))
           :scope :self))
(defn make-frame []
  (frame
   :title    "Seesaw example"
   :content  (vertical-panel
              :border 2
              :items  [out-scrollable
                       in-text])
   :on-close :exit))
(defn -main [& args]
  (native!)
  (value! out-text a-tale)
  (attach-listeners!)
  (let [f (make-frame)]
    (pack! f)
    (show! f)))

相关内容

  • 没有找到相关文章

最新更新