JOptionPane.showInputDialog
がオーバーロードされています。
showInputDialog(Object message, Object initialSelectionValue)
...
showInputDialog(Component parentComp, Object message)
あなたが(javax.swing.JOptionPane/showInputDialog parent-frame "Hello?")
を実行すると、ClojureのはshowInputDialog(Object message, Object initialSelectionValue)
を呼び出すようです。
あなたのREPLでこれを確認することができます。
user=> (javax.swing.JOptionPane/showInputDialog parent-frame "hello")
IllegalArgumentException adding a window to a container java.awt.Container.checkNotAWindow (Container.java:490)
user=> *e
#error {
:cause "adding a window to a container"
:via
[{:type java.lang.IllegalArgumentException
:message "adding a window to a container"
:at [java.awt.Container checkNotAWindow "Container.java" 490]}]
:trace
[[java.awt.Container checkNotAWindow "Container.java" 490]
[java.awt.Container addImpl "Container.java" 1091]
[java.awt.Container add "Container.java" 973]
[javax.swing.plaf.basic.BasicOptionPaneUI addMessageComponents "BasicOptionPaneUI.java" 358]
[com.apple.laf.AquaOptionPaneUI createMessageArea "AquaOptionPaneUI.java" 92]
[javax.swing.plaf.basic.BasicOptionPaneUI installComponents "BasicOptionPaneUI.java" 172]
[javax.swing.plaf.basic.BasicOptionPaneUI installUI "BasicOptionPaneUI.java" 141]
[javax.swing.JComponent setUI "JComponent.java" 666]
[javax.swing.JOptionPane setUI "JOptionPane.java" 1860]
[javax.swing.JOptionPane updateUI "JOptionPane.java" 1882]
[javax.swing.JOptionPane <init> "JOptionPane.java" 1845]
[javax.swing.JOptionPane showInputDialog "JOptionPane.java" 568]
[javax.swing.JOptionPane showInputDialog "JOptionPane.java" 494]
[javax.swing.JOptionPane showInputDialog "JOptionPane.java" 455]
[user$eval10619 invokeStatic "form-init4926112649336753943.clj" 1]
[user$eval10619 invoke "form-init4926112649336753943.clj" 1]
...
をあなたはJOptionPane
のソースコードをチェックして、ライン455をチェックすると、
public static String showInputDialog(Object message, Object initialSelectionValue) {
return showInputDialog(null, message, initialSelectionValue); // <= Line 455
}
あなたが見ることができるように、JOptionPane
が通過することを可能にしますObject
をメッセージとして送信します。 Component
をメッセージとして渡すと、メッセージコンポーネントとして使用されます。この場合
は、parent-frame
メッセージとして渡され、後でそれがIllegalArgumentException
を引き起こしContainer
に(Window
である)このparent-frame
を追加しようとしました。
ターゲットメソッドがオーバーロードされたときにどのメソッドを呼び出すかをclojureがどのように決定するのか分かりません。 Clojureは間違ったものを選んだ。私はあなたがこの問題を避けるために他の方法を使うべきだと思います。
(javax.swing.JOptionPane/showInputDialog parent-frame "Hello?" "")
これはClojureのはshowInputDialog(Component parent, Object mess, String initialSelectionValue)
を呼び出し引き起こし、正しくJOptionPane
が表示されます。あなたはまた、Clojureのは、彼の答えで述べたよう@James正しい方法を選ぶことができると引数の型ヒントを提供することができます
EDIT 。これは良い方法でしょう。既に述べたよう
(javax.swing.JOptionPane/showInputDialog #^java.awt.Component parent-frame "Hello?")
右:
ここでより多くの情報があります。ClojureとJavaの違いは、Javaがオーバーロードされたメソッドとパラメータの数を区別することですが、Clojureはパラメータの数だけを区別します。良いキャッチ。 –