2011-01-21 16 views
8

Me gustaría crear una aplicación Swing simple. Sin embargo, tengo muy, muy, muy poca experiencia con Swing. Quiero crear una aplicación de una ventana que se renueve cada 5 minutos con el contenido de un raspado de pantalla que hago. Estoy usando Clojure para escribir el código. Supongo que Swing es el camino a seguir con esto, pero si hay otras opciones mejores, me encantaría saber más sobre ellas también.Principiante a Swing

¿Qué código necesitaría para hacer esto con Swing? (Qué clases debo usar, etc)

Gracias, Alex

Respuesta

8

Bueno, para el bit cada cinco minutos, java.util.TimerTask debería ser de ayuda. Para información general de Swing, this link to the Java Tutorials debe ayudar.

Para tener una ventana, específicamente, JFrame es probablemente su mejor opción.

Para mostrar texto simple o multilínea, debe consultar JLabel o JTextArea, respectivamente.

Para mostrar imágenes, ImageIcon debería hacer el truco.

Para otras necesidades, el tutorial de Java debería ser de gran ayuda.

Como se sugirió trashgod, javax.swing.Timer tiene algunas ventajas cuando se trata de GUI sobre java.util.TimerTask. Este artículo en using timers in Swing applications debería ayudarle a decidir cuál usar.

+1

+1 para sugerir alternativas. – trashgod

+1

Buen comienzo, pero te perdiste por completo el sube y baja (https://github.com/daveray/seesaw), que parece que hará que el desarrollo de la aplicación sea mucho menos doloroso en Clojure. – deterb

2

En un contexto Swing, javax.swing.Timer tiene algunas ventajas; hay un ejemplo here. Dependiendo de lo que desea mostrar, JEditorPane puede ser apropiado.

+1

Doh! Cómo podría olvidarme del temporizador de oscilación :-p –

0

Pruebe esto link para Swing. Como Zach dijo que necesitarás usar JFrame y TimerTask debería ser utilizado para tus requerimientos.

También puede probar otros marcos alternativos para Swing.

4

Tienes razón. Swing es el camino a seguir, pero conectar todas las piezas puede ser un poco difícil si estás aprendiendo Clojure y Swing. Hay algunos ejemplos cortos que muestran cómo crear GUI simples de Swing en Clojure. Aquí hay otro pequeño ejemplo que combina una GUI simple con un objeto Timer.

(ns net.dneclark.JFrameAndTimerDemo 
    (:import (javax.swing JLabel JButton JPanel JFrame Timer)) 
    (:gen-class)) 

(defn timer-action [label counter] 
(proxy [java.awt.event.ActionListener] [] 
    (actionPerformed 
    [e] 
     (.setText label (str "Counter: " (swap! counter inc)))))) 

(defn timer-fn [] 
    (let [counter (atom 0) 
    label (JLabel. "Counter: 0") 
    timer (Timer. 1000 (timer-action label counter)) 
    panel (doto (JPanel.) 
      (.add label))] 
    (.start timer) 
    (doto (JFrame. "Timer App") 
    (.setContentPane panel) 
    (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE) 
    (.setLocation 300 300) 
    (.setSize 200 200) 
    (.setVisible true)))) 

(defn -main [] 
    (timer-fn)) 

Cuando se ejecuta, se creará una pequeña ventana con una etiqueta que se actualiza cada segundo. Según su descripción, cambiaría la frecuencia del temporizador de 1,000 ms a 300,000 ms para activar una acción cada 5 minutos. Para hacer algo más que actualizar una etiqueta, cambiaría el contenido de la función timer-action.

I think esto es seguro para subprocesos, pero no lo he comprobado con certeza. Hay precauciones y tutoriales sobre la seguridad de los hilos cuando también se actualizan los componentes Swing. Probablemente también quieras verificarlos.

Espero que esto sea lo suficientemente informativo como para darle algunas pistas sobre dónde buscar más información.

EDIT: Quería señalar una cosa más interesante aquí.Tenga en cuenta que la función 'timer-action' está cambiando el valor de uno de sus argumentos. El argumento 'contador' es un átomo definido en 'timer-fn', sin embargo, el oyente de acción puede cambiarlo. Esto es algo que generalmente no puedes hacer en Java. Tal vez alguien más inteligente que yo pueda comentar si esto constituye un "cierre". En mi experiencia previa con lenguajes como Pascal, yo diría que el argumento que pasa es "llamada por referencia" en oposición al estricto argumento de "call-by-value" de Java. ¿Es esto algo diferente?

EDIT 2: Después de comprobar mis hechos con otra pregunta, esto es, de hecho, un ejemplo de un cierre en Clojure.

0

La memoria transaccional del software Clojure le permite configurar relojes en variables; su devolución de llamada se ejecuta cada vez que se cambia la variable (por cualquier cosa). Esto se presta muy bien a la programación de GUI. Su GUI puede actualizarse automáticamente cada vez que algo toca la variable.

Aquí es una breve pero no trivial ejemplo de cómo hacer esto, la explicación de lo que está pasando: http://www.paullegato.com/blog/swing-clojure-gui-black-scholes/

1

Además de los recursos mencionados por @Zach L (particularmente en relación con los contadores de tiempo), yo echaría un buen vistazo a Seesaw, especialmente porque estás escribiendo esto en Clojure.

En particular, observo el seesaw.timer para activar los eventos de actualización. Usar un JTextPane (solo lectura) o un JEditorPane (editable) funcionaría bien para mostrar resultados ricamente formateados (como HTML).