Каков наилучший способ сделать GUI в Clojure?

Оберните свой ZipOutputStream в персонализированный OutputStream, названный здесь YourOutputStream.

  • Конструктор YourOutputStream создаст еще один ZipOutputStream (zos2), который обертывает новый ByteArrayOutputStream (baos) public YourOutputStream(ZipOutputStream zos, int maxSizeInBytes)
  • Если вы хотите записать файл с YourOutputStream, он сначала напишет его на zos2 public void writeFile(File file) throws ZipFileFullException public void writeFile(String path) throws ZipFileFullException и т. д. .
  • , если baos.size() находится под maxSizeInBytes Записать файл в zos1
  • else закрыть zos1, baos, zos2 сделать исключение. Для исключения я не могу думать о уже существовавшем, если есть, использовать его, иначе создать собственное исключение IOException ZipFileFullException.

Вам нужно два ZipOutputStream, один из которых должен быть записан на вашем диске, чтобы проверить, превышает ли ваше содержимое более 5 МБ.

EDIT: Фактически я проверил, вы не можете легко удалить ZipEntry .

http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html# размер ()

145
задан Peter Mortensen 30 January 2010 в 21:47
поделиться

10 ответов

От этого страница :

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

14
ответ дан dsm 30 January 2010 в 21:47
поделиться
  • 1
    Спасибо, это работает отлично! Вы возражаете объяснять логику позади него? I' m новичок так I' m пытающийся изучить столько, сколько я могу! – Shankar Kumar 26 July 2012 в 00:33

Если бы Вы хотите сделать программирование GUI, я указал бы на Температурный Преобразователь или колония муравьев .

Много вещей в Swing сделаны путем разделения на подклассы, особенно при создании пользовательских компонентов. Для этого существует две существенных функции/макросов: прокси и класс генерала .

Теперь я понимаю, куда Вы идете с большим количеством Lispy путем. Я не думаю, что существует что-либо как этот все же. Я категорически не рекомендовал бы попытку создать грандиозное создающее GUI крыло платформы CLIM, но сделать что-то больше Lispy: начните писать Вашему приложению Swing и краткому обзору свои общие шаблоны с макросами. При выполнении этого можно закончить с языком для записи вида графический интерфейсов пользователя, или возможно некоторого очень универсального материала, который может быть совместно использован и вырасти.

Одна вещь Вы проигрываете, когда запись графический интерфейсов пользователя в Clojure является использованием инструментов как Matisse. Это может быть сильным указанием для записи некоторых частей в Java (GUI) и некоторых частей в Clojure (логика). Который на самом деле имеет смысл как в логике, Вы будете в состоянии создать язык для своего вида логики с помощью макросов, и я думаю, что существует больше для получения там, чем с GUI. Очевидно, это зависит от Вашего приложения.

16
ответ дан Carl Smotricz 30 January 2010 в 21:47
поделиться
  • 1
    Я don' t имеют знание в jQuery, дайте еще некоторую демонстрацию expl., показывают, что я мог использовать jQuery, и мог способный заменить мой код.. – Rocky 1 February 2012 в 06:56

Clojure и SWT являются лучшим подходом для того, чтобы сделать GUI. По существу SWT является подходом стиля Plug and Play для разработки программного обеспечения.

1
ответ дан Berlin Brown 30 January 2010 в 21:47
поделиться

Я разрабатывал апплет Java, в котором все записано в Clojure кроме кода апплета, который написан в Java. Апплет вызывает обратные вызовы кода Clojure init, краски, и т.д. от рычагов Java для тех методов, которые определяются моделью апплета. Таким образом, код заканчивает тем, что был Clojure на 99,999 процентов, и Вы не должны думать о крошечной части Java вообще по большей части.

существуют некоторые недостатки к этому подходу, который я надеюсь обсудить более подробно на Clojure Google Group. Я думаю, что разработчики Clojure должны включать собственный способ создать приложения. В настоящее время можно сделать, любой GUI наполняет Вас как от REPL, но если Вы хотите поставляемое приложение GUI, необходимо записать некоторый Java для вызова кода Clojure. Кроме того, это походит на архитектуру вида Апплета Java сил Вы за пределами большего количества идиоматических лучших практик Clojure, требуя, чтобы Вы использовали изменяемое состояние, и т.д.

, Но также и, я еще не очень далек наряду с Clojure, и могло бы иметь место, что это возможно, и я просто не обнаружил, как сделать это правильно все же.

2
ответ дан 30 January 2010 в 21:47
поделиться
  • 1
    Это - очень плохая практика, с тех пор you' ре и кодирование его и затем декодирование его. Это приведет к тому же самому результату: $data = (array) $data; – Niklas Modess 7 December 2012 в 02:44

Был разговор о списке рассылки о нескольких Ячейках (а-ля Ячейки Kenny Tilton ) реализации. Это - крутой способ сделать программирование GUI.

6
ответ дан Joe W. 30 January 2010 в 21:47
поделиться
  • 1
    это успешно удаляет заголовок, какая-либо идея, как также удалить ячейки под ним? – daniel langer 13 June 2012 в 15:01

Я не думаю, что есть официальная , но лично я хотел бы воспользоваться тем фактом, что я использую один из самых мощных языков в мире, и просто представьте, как будет выглядеть идеальный графический интерфейс:

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

Ваша идея будет отличаться, но, надеюсь, это даст вам какая-то идея.

1
ответ дан 23 November 2019 в 22:44
поделиться

Вот еще один очень простой пример свинга:

; 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)))
4
ответ дан 23 November 2019 в 22:44
поделиться

В contrib clojure есть оболочка для MigLayout. Вы также можете взглянуть на эту суть . По сути, я добавляю любой код, который пишу, когда изучаю swing / miglayout.

Пример dsm переписан шепелявым образом с использованием 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)))
8
ответ дан 23 November 2019 в 22:44
поделиться

Я знаю, что вы намекаете на классические десктопные решения, но Веб довольно хорошо сочетается с клоуром. Я написал полное аудио приложение, где все подключено так, что если вы добавляете музыку в аудио папку, она отражается в web интерфейсе. Просто говорю, что приложение для рабочего стола - это не единственный способ :)

.
1
ответ дан 23 November 2019 в 22:44
поделиться

Стюарт Сьерра недавно опубликовал серию постов в блоге о GUI-разработке с клоуром (и качелями). Начните с этого: http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing

32
ответ дан 23 November 2019 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: