Установка формы окна в Java (shape JFrame) - PullRequest
2 голосов
/ 23 декабря 2011

Я пытаюсь установить форму моего окна 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 параметра (window, shape, 0) и получил «несоответствие типов аргументов». Затем я попробовал логическое значение и строку в качестве третьего параметра, но они также дали «несоответствие типов аргументов». Я не понимаю этого, потому что в учебнике показаны только 2 параметра. Теперь, видимо, есть три?

Ответы [ 2 ]

3 голосов
/ 23 декабря 2011

Ваш

mSetWindowShape.invoke(this, shape);

должно быть:

mSetWindowShape.invoke(null, this, shape);

Метод Method.invoke () принимает объект, для которого вызывается метод, в качестве первого аргумента. Поскольку AWTUtilities.setWindowShape () является статическим методом, первый аргумент должен быть нулевым.

Кроме того, если вы можете настроить таргетинг на Java 7, используйте Frame.setShape () , поскольку теперь он официально является частью API. Классы com.sun. * Могут исчезнуть в будущем.

1 голос
/ 23 декабря 2011

Надеюсь, это правильный метод, для которого ваш код вызывает frameObject.setShape(shape); Надеюсь, это поможет.Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...