Clojure에서 GUI를 수행하는 가장 좋은 방법은 무엇입니까?


150

Clojure 에서 GUI를 수행하는 가장 좋은 방법은 무엇입니까 ?

기능적인 Swing 또는 SWT 래퍼 의 예가 있습니까? 또는 일부 매크로를 사용하여 s- 표현식 으로 쉽게 래핑 될 수있는 JavaFX 선언적 GUI 설명 과 일부 통합 됩니까?

튜토리얼이 있습니까?

답변:


121

나는 시소 를 겸손히 제안 할 것이다 .

다음 은 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!)

2
스윙 재미 있나요? 그들은 불가능하다고 말했다!
Michael Bylstra

9
겸손 할 필요는 없습니다.이 점을 매우 자랑스럽게 생각할 수 있습니다! +1!
mydoghasworms

7
-1 : 코드에 버그가 있습니다. "Hello, World"대신 "Hello, Seesaw"라고 표시되어 있습니다. </ Joke>
Thomas Eding

1
정말? 그네? 이것이 개발자가 Swing에서 제공하는 기능, 더 높은 수준의 추상화로 제한되지 않습니까? Clojure는 어떻게 든 응용 프로그램의 구식이 덜 보이게 만들거나 Swing이 약한 모든 영역을 어떻게 개선합니까? 나는 바인딩과 MVC 그리고 Swing이 자체적으로 제공하는 모든 "새로운"것들에 대해 이야기하고있다. Clojure의 언어 기능으로 인해 어떻게 고정됩니까?
Zelphir Kaltstahl

1
그는 특히 Swing에 대해 집중적 인 추상화를 선택했습니다. 아무것도 잘못이 없습니다 ...
Kenogu Labz


16

GUI 프로그래밍을하고 싶다면 온도 변환기 또는 개미 식민지를 가리 킵니다 .

특히 사용자 정의 구성 요소를 만드는 경우 하위 클래스를 통해 Swing의 많은 작업이 수행됩니다. 이를 위해 proxygen-class의 두 가지 필수 함수 / 매크로가 있습니다.

이제 나는 당신이 더 Lispy 방식으로 어디로 가고 있는지 이해합니다. 아직 그런 것이 없다고 생각합니다. 멋진 GUI 빌드 프레임 워크 a-la CLIM을 구축 하지 말 것을 강력히 권유하지만 Lispy를 더 많이 사용하려면 Swing 응용 프로그램 작성을 시작하고 일반적인 패턴을 매크로로 추상화하십시오. 그렇게 할 때, 당신은 일종의 GUI를 작성하는 언어로 끝날 수도 있고, 공유하고 성장할 수있는 매우 일반적인 것들 일 수도 있습니다.

Clojure에서 GUI를 작성할 때 잃어버린 한 가지는 Matisse와 같은 도구를 사용한다는 것입니다. 이것은 Java (GUI)의 일부와 Clojure (논리)의 일부를 작성하는 것을 강력하게 지적 할 수 있습니다. 실제로는 논리에서와 같이 매크로를 사용하여 종류의 논리에 대한 언어를 작성할 수 있으며 GUI보다 더 많은 이점이 있다고 생각합니다. 분명히 응용 프로그램에 따라 다릅니다.


2
Mattisse를 잃어 버릴 염려가 없습니다. miglayout.com을 사용하면 손으로 레이아웃을 수행 할 수있을만큼 강력합니다.
tomjen

생성 된 코드는 Clojure에서 원활하게 액세스 할 수있는 Java 코드이므로 Matju를 Clojure와 함께 사용할 수 있습니다. 실제로 어딘가에 대한 자습서가 있습니다 ...
Rayne

3
Clojure 출력 GUI 디자이너를 처음으로 구할 때 궁금합니다. 동질성으로 인해 생성 된 코드가 나쁘지 않아야합니다!
nperson325681

15

아직 아무도 제안하지 않았으므로 브라우저는 UI 플랫폼입니다. HTTP 서버를 포함하여 Clojure에서 앱을 작성한 다음 HTML에서 딸꾹질 , ClojureScript 및 필요한 수십억 개의 JS 라이브러리에 이르기까지 UI를 사용하여 UI를 개발할 수 있습니다. 일관된 브라우저 동작과 "데스크톱 앱 룩앤필"을 원한다면 크롬을 앱과 번들로 묶을 수 있습니다 .

이 얼마나 될 것으로 보인다 라이트 테이블이 배포됩니다.


이것은 훌륭하지만, 모든 클라이언트 시스템에서 올바른 포트를 결정하는 것은 까다로울 수 있습니다
scape

14

페이지에서 :

(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 웹 사이트 의 상호 운용성 섹션을 살펴볼 가치가 있습니다 .


3
그래, 나는 당신이 Swing을 직접 사용할 수 있다는 것을 알고 있지만, 더 잘하는 방법이 있는지 묻습니다.
Marko

또한 최신 버전의 클로저에는을 추가해야합니다. todo 블록에서 멤버 함수 호출 앞에.
Jeroen Dirks

8

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)))


6

오히려 clojurefx에 가고 싶습니다. 약간 조기이지만 작동하고 시간을 절약합니다.

시소로 GUI를 시작한 다음 clojurefx에서 다른 구성 요소를 시도했습니다.

나는 두 가지 모두를 마쳤으며 시소 하나를 clojurefx로 리팩토링 할 것이라고 확신합니다.

결국, JavaFX는 앞으로 나아가는 길입니다.

시소보다 가볍습니다. 아니면 적어도 글을 씁니다 ..

바인딩 작업, 리스너 작업, 대부분의 구성 요소 작업, 그렇지 않으면 매크로 중 하나를 사용하여 해당 특정 사례 및 작업에 대한 생성자를 만듭니다. 또는 어려운 경우 Java로 일부 메소드를 작성하고 clojurefx 개선에 도움을 요청하십시오.

clojurefx를 작성한 사람은 현재 바쁘지만 프로젝트를 포크하고 수정을 할 수 있습니다.


JavaFX는 아직 고유하지 않은 문제를 해결 했습니까? 심각한 질문은 처음 체크 아웃했을 때 오래 전이고 스윙보다 덜 정확 해 보였기 때문입니다.
Trejkaz

4

다음은 매우 기본적인 스윙 래핑 예제입니다.

; 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)))

3

Clojure에서 Swing으로 GUI를 작성하는 것과 같은 질문을하고 라이브러리 signe를 생각해 냈습니다.

그것은 당신의 원자 모델을 원자 안에 싸인 단일 Clojure 데이터 구조로 표현할 수있게 해줍니다.

여기 의 예를 참조 하십시오 .


2

Java로 작성된 애플릿 코드를 제외하고 모든 것이 Clojure로 작성된 Java 애플릿을 개발 중입니다. 애플릿은 애플릿 모델에 의해 정의 된 메소드에 대해 Java의 후크에서 Clojure 코드의 init, paint 등의 콜백을 호출합니다. 따라서 코드는 99.999 % Clojure가되므로 작은 Java 부분에 대해서는 전혀 생각할 필요가 없습니다.

이 접근법에는 몇 가지 단점이 있습니다. Clojure Google 그룹에 대해 더 자세히 논의하고 싶습니다. Clojure 개발자는 응용 프로그램을 구축하는 기본 방법을 포함해야한다고 생각합니다. 현재는 REPL에서 원하는 GUI 작업을 수행 할 수 있지만 제공 가능한 GUI 애플리케이션을 원할 경우 Clojure 코드를 호출하기 위해 Java를 작성해야합니다. 또한 Java Applet 아키텍처가 Clojure의 관용적 모범 사례 외부에서 강제로 변경 가능하므로 변경 가능한 상태 등을 사용해야합니다.

또한 Clojure와 아직 멀지 않아서 가능할 수도 있으며 아직 올바르게 수행하는 방법을 찾지 못했습니다.



2

그래서이 목록에서 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"]]

나는 그것을 시도했고, 그것은 즉시 작동합니다.


1

Clojure와 SWT는 GUI를 수행하는 가장 좋은 방법입니다. 기본적으로 SWT는 소프트웨어 개발을위한 플러그 앤 플레이 방식입니다.


1
당신은 링크 또는 예를 제공 할 수 있습니까? 관심이 있지만 시작하는 방법을 모릅니다.
Carl Smotricz 2009

1
칼, 두 번째 clojure를 사용하여 Eclipse 플러그인을 작성하는 방법에 대한 좋은 자습서가 좋습니다.
Egon Willighagen

1

나는 공식적인 언어는 없다고 생각하지만 개인적으로 나는 세계에서 가장 강력한 언어 중 하나를 사용하고 있으며 완벽한 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})])

당신의 아이디어는 다를 것이지만 이것은 위의 내용이 당신에게 아이디어를 줄 것입니다.


groovy SwingBuilder dsl이 Clojure로 번역 된 것 같습니다.
Marko

@ dev-er-dev 그것은 가능합니다. 저는 그루비를 사용한 적이 없었지만, 좋은 마음은 똑같이합니다 :)
tomjen

1

고전적인 데스크탑 솔루션을 암시하고 있지만 웹은 클로저와 잘 어울립니다. 오디오 폴더에 음악을 추가하면 웹 UI에 반영되도록 모든 것이 연결된 완벽한 오디오 응용 프로그램을 작성했습니다. 데스크톱 응용 프로그램이 유일한 방법은 아닙니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.