2011-12-22 63 views
2

我試圖把我的JFrame窗口爲橢圓的形狀,而是它拋出以下錯誤:設置在爪哇(形的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(); 
    } 

} 

編輯:我摘下一個放慢參數,並得到了同樣的錯誤(錯誤的參數個數)。然後我輸入3個參數(窗口,形狀,0)並得到'參數類型不匹配'。然後我嘗試了一個布爾值和一個字符串作爲第三個參數,但那些也給出了「參數類型不匹配」。我不明白這一點,因爲在教程中它只顯示2個參數。現在顯然有三個?

回答

3

你:

mSetWindowShape.invoke(this, shape); 

應該是:

Method.invoke()方法採用所述方法被調用上作爲第一個參數的對象。由於AWTUtilities.setWindowShape()是一個靜態方法,因此第一個參數應該爲空。另外,如果您可以定位Java 7,請改爲使用Frame.setShape(),因爲它現在是API的正式組成部分。 com.sun。*課程有可能在未來消失。

+0

哇頭疼。感謝一堆! – Ozzy 2011-12-22 21:59:23

1

我希望,這是您的代碼要求的正確方法frameObject.setShape(shape); 希望有所幫助。問候。

+0

這可能是正確的Java 1.7 +(如其他答案中所述),但我仍然在1.6。 – Ozzy 2011-12-22 22:00:23