Pergunta

Qual é a melhor maneira de fazer GUIs em Clojure ?

Existe um exemplo de algumas balanço ou SWT invólucro? Ou alguma integração com JavaFX declarativa GUI descrição que poderia ser facilmente ajustada para s-expressões usando algum macrology?

Qualquer tutoriais?

Foi útil?

Solução

Vou humildemente sugerir Gangorra .

Aqui está uma baseada em REPL tutorial que não assume qualquer Java ou balanço conhecimento.


gangorra é muito parecido com o que @tomjen sugere. Aqui está "Olá, mundo":

(use 'seesaw.core)

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

e aqui está @Abhijith e de @ dsm exemplo, traduzido bastante literalmente:

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

Outras dicas

Stuart Sierra recentemente publicou uma série de posts sobre GUI-desenvolvimento com clojure (e balanço). Comece aqui: http://stuartsierra.com/2010/ 01/02 / primeiros passos-com-clojure-swing

Se você quer fazer GUI programação eu apontam para Temperature Converter ou o formigas colônia .

Muitas coisas no balanço são feitas por sub-classing, especialmente se você está a criação de componentes personalizados. Por que existem duas funções essenciais / macros: proxy e gen-classe .

Agora eu entendo de onde você está indo com a maneira mais lispy. Eu não acho que haja algo como isso ainda. Eu recomendo fortemente contra a tentar construir uma estrutura de construção de GUI grandiosa a-la CLIM , mas para fazer algo mais lispy: começar a escrever seu aplicativo swing e abstrata para fora seus padrões comuns com macros. Ao fazer isso, você pode acabar com uma linguagem para escrever o seu tipo de GUIs, ou talvez coisas alguns muito genérico que pode ser compartilhado e crescer.

Uma coisa que você perde ao escrever as GUIs em Clojure é o uso de ferramentas como o Matisse. Isso pode ser um forte apontando para escrever algumas partes em Java (GUI) e algumas partes em Clojure (lógica). O que realmente faz sentido como na lógica de que você vai ser capaz de construir uma linguagem para o seu tipo de lógica usando macros e eu acho que há mais a ganhar lá do que com a GUI. Obviamente, isso depende de sua aplicação.

A partir deste página :

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

E, é claro, que valeria a pena olhar para a seção interoperabilidade do site do Clojure.

Ninguém ainda sugeriu que, por isso vou: Navegador como plataforma de interface do usuário. Você poderia escrever seu aplicativo em Clojure, incluindo um servidor HTTP e, em seguida, desenvolver a interface do usuário usando qualquer coisa de HTML para soluço , ClojureScript e qualquer um dos os bilhões de libaries JS que você precisa. Se você queria o comportamento do navegador consistente e "app look'n'feel desktop" você poderia pacote chrome com seu aplicativo .

Esta parece ser como Luz Tabela é distribuído.

Há um wrapper para MigLayout em contrib Clojure. Você também pode dar uma olhada em esta essência . Estou basicamente colocar qualquer código que estou escrevendo como eu estou aprendendo swing / MigLayout.

O dsm exemplo re-escrito de uma forma lispy usando contrib.swing-utils

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

Houve palestra sobre a lista de discussão sobre algumas células ( a la células de Kenny Tilton ) implementações. É uma maneira muito arrumado para fazer a programação GUI.

Eu preferia ir para clojurefx, é um pouco prematuro, mas ele faz o trabalho e economiza tempo.

Eu comecei minha GUI com gangorra e, em seguida, tentou outro componente no clojurefx.

Eu terminei ambos, e estou convencido de que vou refazer a gangorra para clojurefx.

Afinal, JavaFX é o caminho a percorrer para a frente.

Ela se sente mais leve que gangorra. Ou, pelo menos, escrevê-lo ..

trabalho Ligações, ouvintes trabalho, a maioria do trabalho componente, caso contrário, basta usar uma das macros para criar um construtor para esse caso particular e trabalho feito. Ou, se você achar que é difícil, escrever alguns métodos em Java e pedir ajuda para melhorar clojurefx.

O cara que escreveu clojurefx é ocupado no momento, mas você pode fork do projeto e fazer algumas correções.

Aqui está outro exemplo muito básico balanço embalagem:

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

Perguntei-me a mesma pergunta de escrever um GUI em Clojure com Swing e veio com a biblioteca signe

Ele permite que você use representar o seu modelo de domínio como uma única estrutura de dados Clojure acondicionada dentro de um átomo.

Veja os exemplos aqui .

Eu tenho vindo a desenvolver um applet Java em que tudo é escrito em Clojure exceto o código applet, que é escrito em Java. As chamadas de retorno de applet invoca o código de Clojure de inicialização, pintura, etc. a partir de ganchos de Java para aqueles métodos que são definidas pelo modelo applet. Assim, as extremidades de código sendo 99,999 por cento Clojure e você não tem que pensar sobre o pequeno pedaço Java em tudo para a maior parte.

Existem algumas desvantagens para esta abordagem, que eu espero para discutir com mais detalhes sobre o Google Grupo Clojure. Eu acho que os desenvolvedores Clojure deve incluir uma maneira natural de construção de aplicações. Atualmente, você pode fazer o material que você como do REPL GUI, mas se você quiser um aplicativo de GUI entrega, é necessário escrever algum Java para chamar o código Clojure. Além disso, parece que a arquitetura de um Java Applet tipo de forças que você fora de melhores práticas mais idiomáticas do Clojure, exigindo-lhe para usar o estado mutável, etc.

Mas também, não estou muito longe juntamente com Clojure ainda e que poderia ser o caso de que é possível e eu simplesmente não descobriram como fazê-lo ainda corretamente.

Então, eu não vi Fn-Fx nesta lista, de Timothy Baldridge (halgiri). Esta é uma biblioteca Clojure fornecendo uma abstração funcional ao longo do JavaFX.

Ele pode ser encontrado no Github em https://github.com/halgari/fn-fx .

Para usar, certifique-se que você está usando uma versão recente do Java (1,8 90+) e adicionar uma dependência para o repo github, adicionando o seguinte ao seu project.clj:

:plugins [[lein-git-deps "0.0.1-SNAPSHOT"]]
:git-dependencies [["https://github.com/halgari/fn-fx.git"]]

Eu tentei, e trabalha fora da caixa.

Clojure e SWT é a melhor abordagem para fazer GUI (s). Essencialmente, SWT é uma abordagem plug and play estilo para o desenvolvimento de software.

Eu não acho que há um oficial, mas pessoalmente eu iria tirar proveito do fato de que eu estou usando uma das línguas mais poderosa do mundo e apenas imaginar o que o código gui perfeito seria algo como:

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

A sua ideia seria diferente, mas isso deve espero que o acima dá uma idéia.

Eu sei que você está insinuando para soluções de desktop clássico, mas se encaixa web muito bem com Clojure. Eu escrevi um aplicativo de áudio completo, onde tudo está conectado de modo que se você adicionar música para a pasta de áudio que se reflete na interface web. Basta dizer que a aplicação Desktop não é a única maneira:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top