【问题标题】:Beginner to Swing摇摆初学者
【发布时间】:2011-01-21 04:56:14
【问题描述】:

我想创建一个简单的 Swing 应用程序。然而,我对 Swing 的经验非常、非常、非常少。我想创建一个单窗口应用程序,该应用程序每 5 分钟刷新一次,其中包含我所做的屏幕抓取内容。我正在使用 Clojure 编写代码。我认为 Swing 是解决这个问题的方法,但如果还有其他更好的选择,我也很想听到更多关于这些的信息。

使用 Swing 执行此操作需要什么代码? (我应该使用什么类等)

谢谢, 亚历克斯

【问题讨论】:

    标签: java swing clojure


    【解决方案1】:

    好吧,对于每五分钟,java.util.TimerTask 应该会有所帮助。对于一般的 Swing 信息,this link to the Java Tutorials 应该会有所帮助。

    拥有一个窗口,具体来说,JFrame 可能是你最好的选择。

    要显示单行或多行文本,您应该分别查看JLabelJTextArea

    要显示图像,ImageIcon 应该可以解决问题。

    对于其他需求,Java 教程应该是一个很大的帮助。

    正如trashgod 建议的那样,javax.swing.Timer 在 GUI 方面比 java.util.TimerTask 具有一些优势。 using timers in Swing applications 上的这篇文章应该可以帮助您决定使用哪个。

    【讨论】:

    • 良好的开端,但您完全错过了跷跷板 (github.com/daveray/seesaw),这看起来会让 Clojure 中的应用程序开发变得不那么痛苦。
    【解决方案2】:

    你是对的。 Swing 是要走的路,但如果您正在学习 Clojure 和 Swing,连接所有部分可能会有点困难。有一些简短的示例展示了如何在 Clojure 中创建简单的 Swing GUI。这是另一个结合了简单 GUI 和 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))
    

    运行时,这将创建一个带有每秒更新标签的小窗口。根据您的描述,您可以将计时器的频率从 1,000 毫秒更改为 300,000 毫秒,以每 5 分钟触发一次操作。除了更新标签之外,您还需要更改 timer-action 函数的内容。

    认为这是线程安全的,但尚未确定。更新 Swing 组件时也有关于线程安全的注意事项和教程。你可能也想检查一下。

    我希望这些信息足够丰富,可以为您提供一些线索,让您了解在哪里寻找更多信息。

    编辑:我想在这里指出一件更有趣的事情。请注意,'timer-action' 函数正在更改其参数之一的值。 'counter' 参数是在 'timer-fn' 中定义的原子,但是动作监听器能够改变它。这是您在 Java 中通常无法做到的。也许比我聪明的人可以评论这是否构成“关闭”。在我之前使用 Pascal 等语言的经验中,我会说参数传递是“按引用调用”,而不是 Java 严格的“按值调用”参数传递。这有什么不同吗?

    编辑 2:在用另一个问题检查了我的事实之后,这实际上是 Clojure 中的一个闭包示例。

    【讨论】:

      【解决方案3】:

      在 Swing 上下文中,javax.swing.Timer 有一些优势;有一个例子here。根据您要显示的内容,JEditorPane 可能比较合适。

      【讨论】:

      • 噢!我怎么能忘记摇摆计时器:-p
      【解决方案4】:

      除了@Zach L 提到的资源(特别是关于计时器),我会好好看看Seesaw,特别是因为你是用Clojure 编写的。

      我特别注意到seesaw.timer 用于触发刷新事件。使用 JTextPane(只读)或 JEditorPane(可编辑)可以很好地显示格式丰富的结果(如 HTML)。

      【讨论】:

        【解决方案5】:

        试试这个link 的 Swing。正如 Zach 所说,您将需要使用 JFrame,并且应该使用 TimerTask 来满足您的要求。

        您还可以尝试其他替代 Swing 框架。

        【讨论】:

          【解决方案6】:

          Clojure 的软件事务内存允许您对变量设置监视;每当变量更改(通过任何方式)时,都会执行您的回调。这非常适合 GUI 编程。只要有任何东西接触到变量,您的 GUI 就会自动更新。

          这是一个简短但不平凡的示例,说明如何执行此操作,并解释发生了什么:http://www.paullegato.com/blog/swing-clojure-gui-black-scholes/

          【讨论】:

            猜你喜欢
            • 2011-04-09
            • 2022-01-17
            • 2012-12-20
            • 2011-07-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多