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 を配置することです。あなたの指示に従って、さまざまな方法でコーディングを試みましたが、これまでのところ成功していません。
お世話になりました皆様に改めて感謝申し上げます。

更新:申し訳ありません。このすべての混乱で、私は別の定義を実行していました。はい、あなたとクガササンが言ったように機能します。私は最終的に次のようにコーディングしました:

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

Clojure で Java にアクセスする方法については、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")
    

    これらの最後の 2 つの形式は完全に同等です。したがって、ご覧のとおり、構築は次の形式になります。

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

もちろん、通常のメソッドを使用するには、新しく作成されたオブジェクトをシンボルにバインドする必要があります。たとえば、次のようになります。

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

body内でオブジェクトとしてlet使用できるようになりました:label

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

Kugathasan Abimaran の回答に対するコメントのコードから次のように、複数の場所で同じ JPanel を使用しようとしています。(JPanel. ...)(上記の #3 を参照)は構築フォームであるため、使用するたびに新しいオブジェクトが返されるため、間違っています。新しいオブジェクトを何らかの変数にバインドし、その上でメソッドを呼び出してから、必要なものをコンテナーに配置する必要があります。

更新: あなたのコードは問題ありません。Kugathasan Abimaran が提案したようにする必要があります。(doto frame ...行の直前に彼のコードを追加し、(JPanel.)そこをpanel_0. 必要に応じて機能します。

于 2011-12-08T09:18:57.627 に答える
0

再現しようとしている Java コードは何ですか? が必要なように見えますがBorderFactory/createTitledBorder、誰が知っていますか?

于 2011-12-08T01:32:40.933 に答える