답변:
나는 시소 를 겸손히 제안 할 것이다 .
다음 은 Java 또는 Swing 지식이 없다고 가정 하는 REPL 기반 학습서 입니다.
시소는 @tomjen이 제안한 것과 매우 흡사합니다. "Hello, World"는 다음과 같습니다.
(use 'seesaw.core)
(-> (frame :title "Hello"
:content "Hello, Seesaw"
:on-close :exit)
pack!
show!)
그리고 여기 @Abhijith와 @dsm의 예가 있습니다.
(ns seesaw-test.core
(:use seesaw.core))
(defn handler
[event]
(alert event
(str "<html>Hello from <b>Clojure</b>. Button "
(.getActionCommand event) " clicked.")))
(-> (frame :title "Hello Swing" :on-close :exit
:content (button :text "Click Me" :listen [:action handler]))
pack!
show!)
스튜어트 시에라 (Stuart Sierra)는 최근 clojure (및 스윙)를 사용한 GUI 개발에 관한 일련의 블로그 게시물을 발표했습니다. 여기서 시작하십시오 : http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing
GUI 프로그래밍을하고 싶다면 온도 변환기 또는 개미 식민지를 가리 킵니다 .
특히 사용자 정의 구성 요소를 만드는 경우 하위 클래스를 통해 Swing의 많은 작업이 수행됩니다. 이를 위해 proxy 와 gen-class의 두 가지 필수 함수 / 매크로가 있습니다.
이제 나는 당신이 더 Lispy 방식으로 어디로 가고 있는지 이해합니다. 아직 그런 것이 없다고 생각합니다. 멋진 GUI 빌드 프레임 워크 a-la CLIM을 구축 하지 말 것을 강력히 권유하지만 Lispy를 더 많이 사용하려면 Swing 응용 프로그램 작성을 시작하고 일반적인 패턴을 매크로로 추상화하십시오. 그렇게 할 때, 당신은 일종의 GUI를 작성하는 언어로 끝날 수도 있고, 공유하고 성장할 수있는 매우 일반적인 것들 일 수도 있습니다.
Clojure에서 GUI를 작성할 때 잃어버린 한 가지는 Matisse와 같은 도구를 사용한다는 것입니다. 이것은 Java (GUI)의 일부와 Clojure (논리)의 일부를 작성하는 것을 강력하게 지적 할 수 있습니다. 실제로는 논리에서와 같이 매크로를 사용하여 종류의 논리에 대한 언어를 작성할 수 있으며 GUI보다 더 많은 이점이 있다고 생각합니다. 분명히 응용 프로그램에 따라 다릅니다.
아직 아무도 제안하지 않았으므로 브라우저는 UI 플랫폼입니다. HTTP 서버를 포함하여 Clojure에서 앱을 작성한 다음 HTML에서 딸꾹질 , ClojureScript 및 필요한 수십억 개의 JS 라이브러리에 이르기까지 UI를 사용하여 UI를 개발할 수 있습니다. 일관된 브라우저 동작과 "데스크톱 앱 룩앤필"을 원한다면 크롬을 앱과 번들로 묶을 수 있습니다 .
이 얼마나 될 것으로 보인다 라이트 테이블이 배포됩니다.
이 페이지에서 :
(import '(javax.swing JFrame JButton JOptionPane)) ;'
(import '(java.awt.event ActionListener)) ;'
(let [frame (JFrame. "Hello Swing")
button (JButton. "Click Me")]
(.addActionListener button
(proxy [ActionListener] []
(actionPerformed [evt]
(JOptionPane/showMessageDialog nil,
(str "<html>Hello from <b>Clojure</b>. Button "
(.getActionCommand evt) " clicked.")))))
(.. frame getContentPane (add button))
(doto frame
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
.pack
(.setVisible true)))
print("code sample");
물론 clojure 웹 사이트 의 상호 운용성 섹션을 살펴볼 가치가 있습니다 .
clojure contrib에는 MigLayout에 대한 래퍼가 있습니다. 이 요점을 볼 수도 있습니다 . 나는 기본적으로 스윙 / 마이 그 레이아웃을 배우면서 쓰고있는 코드를 넣습니다.
dsm의 예제는 contrib.swing-utils를 사용하여 lispy 방식으로 다시 작성되었습니다.
(ns test
(:import (javax.swing JButton JFrame))
(:use (clojure.contrib
[swing-utils :only (add-action-listener)])))
(defn handler
[event]
(JOptionPane/showMessageDialog nil,
(str "<html>Hello from <b>Clojure</b>. Button "
(.getActionCommand event) " clicked.")))
(let [ frame (JFrame. "Hello Swing")
button (JButton. "Click Me") ]
(add-action-listener button handler)
(doto frame
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.add button)
(.pack)
(.setVisible true)))
메일 링리스트 에서 몇몇 Cells (la Kenny Tilton 's Cells ) 구현에 대한 이야기 가있었습니다 . GUI 프로그래밍을하는 아주 깔끔한 방법입니다.
오히려 clojurefx에 가고 싶습니다. 약간 조기이지만 작동하고 시간을 절약합니다.
시소로 GUI를 시작한 다음 clojurefx에서 다른 구성 요소를 시도했습니다.
나는 두 가지 모두를 마쳤으며 시소 하나를 clojurefx로 리팩토링 할 것이라고 확신합니다.
결국, JavaFX는 앞으로 나아가는 길입니다.
시소보다 가볍습니다. 아니면 적어도 글을 씁니다 ..
바인딩 작업, 리스너 작업, 대부분의 구성 요소 작업, 그렇지 않으면 매크로 중 하나를 사용하여 해당 특정 사례 및 작업에 대한 생성자를 만듭니다. 또는 어려운 경우 Java로 일부 메소드를 작성하고 clojurefx 개선에 도움을 요청하십시오.
clojurefx를 작성한 사람은 현재 바쁘지만 프로젝트를 포크하고 수정을 할 수 있습니다.
다음은 매우 기본적인 스윙 래핑 예제입니다.
; time for some swing
(import '(javax.swing JFrame JTable JScrollPane))
(import '(javax.swing.table DefaultTableModel))
(let
[frame (JFrame. "Hello Swing")
dm (DefaultTableModel.)
table (JTable. dm)
scroll (JScrollPane. table)]
(doto dm
(.setNumRows 30)
(.setColumnCount 5))
(.. frame getContentPane (add scroll))
(doto frame
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.pack)
(.setVisible true)))
Java로 작성된 애플릿 코드를 제외하고 모든 것이 Clojure로 작성된 Java 애플릿을 개발 중입니다. 애플릿은 애플릿 모델에 의해 정의 된 메소드에 대해 Java의 후크에서 Clojure 코드의 init, paint 등의 콜백을 호출합니다. 따라서 코드는 99.999 % Clojure가되므로 작은 Java 부분에 대해서는 전혀 생각할 필요가 없습니다.
이 접근법에는 몇 가지 단점이 있습니다. Clojure Google 그룹에 대해 더 자세히 논의하고 싶습니다. Clojure 개발자는 응용 프로그램을 구축하는 기본 방법을 포함해야한다고 생각합니다. 현재는 REPL에서 원하는 GUI 작업을 수행 할 수 있지만 제공 가능한 GUI 애플리케이션을 원할 경우 Clojure 코드를 호출하기 위해 Java를 작성해야합니다. 또한 Java Applet 아키텍처가 Clojure의 관용적 모범 사례 외부에서 강제로 변경 가능하므로 변경 가능한 상태 등을 사용해야합니다.
또한 Clojure와 아직 멀지 않아서 가능할 수도 있으며 아직 올바르게 수행하는 방법을 찾지 못했습니다.
내가 선호하는 Clojure UI 환경은 IO.js (Node for ES6) + Electron (Container) + Quiescent (ReactJS 래퍼)를 사용 합니다.
그래서이 목록에서 Timothy Baldridge (halgiri)의 Fn-Fx를 보지 못했습니다. JavaFX에 대한 기능적 추상화를 제공하는 Clojure 라이브러리입니다.
https://github.com/halgari/fn-fx의 Github에서 찾을 수 있습니다 .
사용하려면 최신 버전의 Java (1.8 90+)를 사용하고 프로젝트에 다음을 추가하여 github 저장소에 종속성을 추가하십시오.
:plugins [[lein-git-deps "0.0.1-SNAPSHOT"]]
:git-dependencies [["https://github.com/halgari/fn-fx.git"]]
나는 그것을 시도했고, 그것은 즉시 작동합니다.
Clojure와 SWT는 GUI를 수행하는 가장 좋은 방법입니다. 기본적으로 SWT는 소프트웨어 개발을위한 플러그 앤 플레이 방식입니다.
나는 공식적인 언어는 없다고 생각하지만 개인적으로 나는 세계에서 가장 강력한 언어 중 하나를 사용하고 있으며 완벽한 GUI 코드가 어떻게 생겼는지 상상할 수 있습니다.
(form {:title :on-close dispose :x-size 500 :y-size 450}
[(button {:text "Close" :id 5 :on-click #(System/exit 0) :align :bottom})
(text-field {:text "" :on-change #(.println System/out (:value %)) :align :center})
(combo-box {:text "Chose background colour" :on-change background-update-function
:items valid-colours})])
당신의 아이디어는 다를 것이지만 이것은 위의 내용이 당신에게 아이디어를 줄 것입니다.