0

来自 LISP 的我在访问 java 对象时遇到了最具挑战性的时刻。我正在尝试在 JPanel 上放置一个带标题的边框。这是我的代码和异常:

user=> (import '(javax.swing JComponent JPanel BorderFactory))
javax.swing.BorderFactory
user=> (JPanel. (.setBorder (.createTitledBorder "Title")))
#<CompilerException java.lang.IllegalArgumentException: No matching field found: createTitledBorder for class java.lang.String (NO_SOURCE_FILE:785)>

我在哪里可以找到处理这种情况的规则?一如既往,您的帮助将不胜感激。

我感谢大家的回答和澄清。我正在发布该功能的基础知识,以便我们都知道要参考什么:

(import '(javax.swing JComponent JButton JFrame JLabel JPanel BorderFactory))
(use '(clojure.contrib [miglayout :only (miglayout)]))

(defn cm_dlg []
  (let
    [
     panel_0
     (miglayout
       (JPanel.)
       :layout  [:wrap 2]
       (JLabel. "Some Text:") [:align "right"]
       (JLabel. "More Text:") [:align "left"]
       (JLabel. "Some Text:") [:align "right"]
       (JLabel. "More Text:") [:align "left"]
       (JLabel. "Some Text:") [:align "right"]
       (JLabel. "More Text:") [:align "left"]
       (JLabel. "Some Text:") [:align "right"]
       (JLabel. "More Text:") [:align "left"]
       )
     panel_1
     (miglayout 
       (JPanel.)
       :layout  [:wrap]
       (JButton. "Button0") [:align "center"]
       (JButton. "Button1") [:align "center"]
       (JButton. "Button2") [:align "center"]
       (JButton. "Button3") [:align "center"]
       )
     frame (JFrame. "Frame")
     ]
    (doto frame
      (.setDefaultCloseOperation JFrame/DISPOSE_ON_CLOSE)
      (-> .getContentPane
        (.add (miglayout (JPanel.)
                :layout [:flowy]
                panel_0 [:align "center"]
                panel_1 [:align "center"]
                )))
      (.pack)
      (.setVisible true)))) 

像这样,该功能没有问题,但我想做的是在 panel_0 上放置一个 TitledBorder。按照您的指示,我尝试以不同的方式进行编码,但到目前为止还没有成功。
再次感谢大家的帮助。

更新:对不起gogloplex。由于所有这些混乱,我正在运行不同的定义。是的,正如你和 Kugathasan 所说的那样。我最终编码为:

....
   (JButton. "Button3") [:align "center"]
   )
     tb (BorderFactory/createTitledBorder "Title")
     frame (JFrame. "Frame")
     ]
    (.setBorder panel_0 tb)
    (doto frame
....

它成功了!感谢大家为此付出时间。

4

3 回答 3

3

你可以这样试试,你在 Clojure 中访问 Java 的方式是错误的。

(.setBorder (JPanel.) (BorderFactory/createTitledBorder "Title"))

您可以阅读java 互操作参考以了解如何在 Clojure 中访问 Java。

于 2011-12-08T02:35:47.130 回答
2

此处的Clojure 语言参考很好地提供了 java 互操作性规则。以下是要点:

  1. 静态方法的调用就像使用类名作为命名空间的普通函数一样:

    (System/getProperty "java.class.path")
    

    这将被解析为 java 调用System.getProperty("java.class.path")

  2. 常规方法是在类的特定对象上调用的,因此它们的调用语法略有不同:

    (.setText label "Some text")
    

    这将被解析为 java call label.setText("Some text")。也就是说,常规方法调用采用以下形式:

    (.methodName object arg1 arg2 arg3 ...)
    
  3. 对象是使用特殊形式构造的new

    (new JLabel "Initial text")
    

    使用点阅读器宏有一个简写:

    (JLabel. "Initial text")
    

    最后两种形式是完全等价的。因此,如您所见,构造采用以下形式:

    (new Classname arg1 arg2 ...)
    ; or
    (Classname. arg1 arg2 ...)
    

当然,要使用常规方法,您必须将新创建的对象绑定到某个符号,例如:

(let [label (JLabel. "Initial text")]
  ...)

let您现在可以将内部主体label用作对象:

(let [label (JLabel. "Initial text")]
  (.setText label "New text")
  (.setIconTextGap label 10))

从评论中的代码到 Kugathasan Abimaran 的答案,您正尝试在多个地方使用相同的 JPanel。您做错了,因为(参见上面的#3)(JPanel. ...)是一种构造形式,每次使用它时都会返回新对象。您必须将新对象绑定到某个变量,然后对其调用方法,然后将其放入容器/您需要的任何东西中。

更新:您的代码很好,您应该像 Kugathasan Abimaran 建议的那样做。(doto frame ...在你的行之前添加他的代码,(JPanel.)用你的panel_0. 它将根据需要工作。

于 2011-12-08T09:18:57.627 回答
0

您要重现什么 Java 代码?看起来你可能想要BorderFactory/createTitledBorder,但谁知道呢?

于 2011-12-08T01:32:40.933 回答