2

JFrame ウィンドウの形状を楕円に設定しようとしていますが、代わりに次のエラーがスローされます。

java.lang.IllegalArgumentException: wrong number of arguments
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at Splash.setShape(Splash.java:48)
    at Splash.<init>(Splash.java:25)
    at BackOffice.init(BackOffice.java:40)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

問題は、2 つのパラメーターを送信しているのに、メソッドが 2 つのパラメーターしか受け入れないため、このエラーがどこから発生しているのかがわからないことです。エラーが指している行は、mSetWindowShape.invoke(this, shape);ここに関連するメソッドがあるという行です。

private void setShape() {
    Class<?> awtUtilitiesClass;
    try {
        awtUtilitiesClass = Class.forName("com.sun.awt.AWTUtilities");
        Method mSetWindowShape = awtUtilitiesClass.getMethod("setWindowShape", Window.class, Shape.class);
        Shape shape = (Shape) new Ellipse2D.Double(0, 0, getWidth(), getHeight());
        mSetWindowShape.invoke(this, shape);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }

}

編集: 1 つのパラメーターを削除すると、同じエラーが発生しました (引数の数が間違っています)。次に、3 つのパラメーター (window、shape、0) を入力すると、「引数の型の不一致」が発生しました。次に、3番目のパラメーターとしてブール値と文字列を試しましたが、それらも「引数の型の不一致」を引き起こしました。チュートリアルでは2つのパラメーターしか表示されないため、これはわかりません。どうやら3人いるらしい?

4

2 に答える 2

3

君の:

mSetWindowShape.invoke(this, shape);

次のようにする必要があります。

mSetWindowShape.invoke(null, this, shape);

Method.invoke ()メソッドは、メソッドが呼び出されるオブジェクトを最初の引数として受け取ります。AWTUtilities.setWindowShape() は静的メソッドであるため、最初の引数は null にする必要があります。

また、Java 7 をターゲットにできる場合は、代わりにFrame.setShape()を使用してください。これは現在、正式に API の一部になっているためです。com.sun.* クラスが将来なくなる可能性があります。

于 2011-12-22T21:56:38.647 に答える
1

frameObject.setShape(shape); 私は、これがあなたのコードがホープのために呼び出す正しい方法であることを願っています。よろしく。

于 2011-12-22T21:48:47.380 に答える