programing

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

yoursource 2022. 8. 29. 23:27
반응형

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

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

기능하는 Swing 또는 SWT 래퍼의 예가 있습니까?또는 JavaFX 선언형 GUI 설명과의 통합은 몇 가지 매크로로지를 사용하여 s-표현식으로 쉽게 정리할 수 있습니다.

튜토리얼이 있나요?

나는 겸허히 시소를 추천한다.

Java 또는 Swing 지식이 없다고 가정한 REP 기반 튜토리얼을 소개합니다.


시소는 @tomjen이 제안하는 것과 매우 유사합니다.'안녕하세요, 세상'은 다음과 같습니다.

(use 'seesaw.core)

(-> (frame :title "Hello"
       :content "Hello, Seesaw"
       :on-close :exit)
  pack!
  show!)

다음으로 @Abhiith와 @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는 최근 클로저(및 스윙)를 사용한 GUI 개발에 관한 일련의 블로그 투고를 발표했습니다.시작은 http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing 입니다.

GUI 프로그래밍을 원하시면 Temperature Converter나 개미 군락을 가리킵니다.

특히 커스텀 컴포넌트를 작성하는 경우에는 Swing의 많은 작업이 서브클래싱으로 이루어집니다.그러기 위해서는 프록시와 gen-class라는 두 가지 필수 기능/매크로스가 있습니다.

이제 리스피 방식으로 네가 어디로 가는지 알겠어.아직 그런 건 없는 것 같아요.거창한 GUI 구축 프레임워크 a-la CLIM을 구축하지 말고 좀 더 Lispy를 하는 것이 좋습니다.Swing 어플리케이션을 작성하고 매크로를 사용하여 일반적인 패턴을 추출하는 것입니다.이 경우 GUI를 작성할 수 있는 언어가 생성되거나 공유 및 확장할 수 있는 범용적인 내용이 생성될 수 있습니다.

Clojure에서 GUI를 작성할 때 잃는 것 중 하나는 Matisse와 같은 툴을 사용하는 것입니다.Java(GUI)와 Clojure(논리)로 쓸 수 있는 부분이 있습니다.논리적으로는 매크로를 사용하여 자신의 논리에 맞는 언어를 구축할 수 있습니다.GUI를 사용하는 것보다 더 많은 것을 얻을 수 있다고 생각합니다.분명히 어플리케이션에 따라 달라집니다.

아직 아무도 제안하지 않았기 때문에 UI 플랫폼으로서의 브라우저로 하겠습니다.HTTP 서버를 포함한 Clojure에서 앱을 작성한 후 HTML에서 딸꾹질, ClojureScript 및 필요한 수십억 개의 JS 라이브러리를 사용하여 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 contribute에는 MigLayout용 래퍼가 있습니다.또한 이 요지를 볼 수 있습니다.swing/miglayout을 배우고 있기 때문에 기본적으로 어떤 코드라도 붙이고 있습니다.

dsm의 예에서는 contribute.timeouts를 사용하여 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)))

저는 clojurefx로 하겠습니다.조금 이르지만 효과가 있고 시간도 절약됩니다.

GUI를 시소부터 시작하여 clojurefx의 다른 컴포넌트를 시도했습니다.

저는 둘 다 끝냈고, 시소 하나를 clojurefx에 리팩터링할 것을 확신합니다.

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

시소보다 가벼워요.아니면 적어도 쓰는 건..

바인딩은 동작하고 리스너는 동작합니다.대부분의 컴포넌트는 동작합니다.그렇지 않으면 매크로 중 하나를 사용하여 특정 케이스와 완료된 작업의 컨스트럭터를 만듭니다.또는 어려운 경우 Java로 몇 가지 방법을 작성하여 clojurefx를 개선하기 위해 도움을 요청하십시오.

clojurefx를 쓴 사람은 지금 바쁘지만 프로젝트를 중단하고 몇 가지 수정을 할 수 있습니다.

메일링 리스트에서는, 몇개의 Cells(Kenny Tilton's Cells)의 실장에 대해 이야기되고 있습니다.이것은 GUI 프로그래밍을 꽤 깔끔하게 할 수 있는 방법입니다.

다음으로 매우 기본적인 스윙랩의 예를 제시하겠습니다.

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

Swing과 함께 Clojure에서 GUI를 작성하는 것과 같은 질문을 스스로에게 던지고 도서관 사인을 생각해냈다.

도메인 모델을 사용하여 atom 안에 랩된 단일 Clojure 데이터 구조로 나타낼 수 있습니다.

예시를 참조하십시오.

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

이 접근법에는 몇 가지 단점이 있는데, Clojure Google Group에서 좀 더 자세히 논의하고자 합니다.Clojure 개발자는 애플리케이션을 구축하는 네이티브 방식을 포함해야 한다고 생각합니다.현재 REP에서 원하는 GUI 작업을 수행할 수 있지만 성과물을 제공하는 GUI 애플리케이션을 사용하려면 Java를 작성하여 Clojure 코드를 호출해야 합니다.또한 Java 애플릿의 아키텍처는 Clojure의 보다 관용적인 베스트 프랙티스를 벗어나도록 강요하는 것 같습니다.변환 가능한 상태를 사용해야 합니다.

하지만 저는 아직 Clojure와 많이 친해지지 않았고, 그럴 수도 있고, 아직 제대로 할 수 있는 방법을 찾지 못했을 뿐입니다.

제가 선호하는 Clojure UI 환경은 IO.js(ES6용 노드) + 전자(컨테이너) + 대기(ReactJS 래퍼)사용합니다.

Timothy Baldridge(할기리)의 Fn-Fx는 이 리스트에서 찾을 수 없었습니다.JavaFX를 통한 기능 추상화를 제공하는 Clojure 라이브러리입니다.

Github(https://github.com/halgari/fn-fx)에서 찾을 수 있습니다.

사용하려면 Java의 최신 버전(1.8 90+)을 사용하고 있는지 확인하고 다음 항목을 프로젝트에 추가하여 github repo에 의존성을 추가합니다.clj:

: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})])

당신의 생각은 다르겠지만, 이것이 당신에게 어떤 아이디어를 줄 수 있기를 바랍니다.

클래식한 데스크탑 솔루션을 제안하고 있는 것은 알고 있습니다만, Web은 클로저에 매우 적합합니다.오디오 폴더에 음악을 추가하면 웹 UI에 반영될 수 있도록 모든 것이 연결되어 있는 완전한 오디오 어플리케이션을 작성했습니다.데스크톱 어플리케이션만이 유일한 방법은 아닙니다.

cljfx는 다음과 같이 기술됩니다.

반응 및 재프레임의 더 나은 부분에서 영감을 얻은 JavaFX의 선언적이고 기능적이며 확장 가능한 래퍼

JavaFx 로서

자바 기반의 데스크톱, 모바일 및 임베디드 시스템용 오픈 소스 차세대 클라이언트 애플리케이션 플랫폼.풍부한 클라이언트 애플리케이션 개발을 위한 최신, 효율적이며 완전한 기능을 갖춘 툴킷을 제작하는 것을 목표로 하는 많은 개인과 기업의 공동 작업입니다.

제작자는 이를 사용하여 공개 및 해커뉴스 데모를 구축합니다.이 데모에서는 jpackage를 통해 여러 OS를 위한 다양한 기능과 번들링 기능을 갖추고 있습니다.

이를 통해 JavaFX를 활용하여 데스크톱, 모바일 및 웹용 UI를 구축함으로써 Clojure REP 기반 개발을 수행할 수 있습니다.

언급URL : https://stackoverflow.com/questions/233171/what-is-the-best-way-to-do-guis-in-clojure

반응형