Определение массива методов - PullRequest
0 голосов
/ 22 февраля 2020

Я работаю над небольшой программой обработки изображений. Он имеет GUI, и я хотел бы привязать каждую кнопку к своему методу. Для этого я решил создать массив методов, но пока не могу заставить его работать. Я пытался использовать анонимный класс, но у меня это не сработало. Мой код:

public class ImageProcessor {
    void blur(){
        System.out.println("blurring");
    }
    void sharpen(){
        System.out.println("sharpening");
    }
}

public class GUI {
    private ImageProcessor imager = new ImageProcessor();
    private ImageProcessor[] LAMBDAS = new ImageProcessor[]{
            public void blur(){imager.blur();}} // one of my failed attempts
    }

Например, после нажатия кнопки размытия я бы хотел привязать к ней первый элемент массива, в данном случае - метод размытия. Любые указатели будут с благодарностью!

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Вы создаете массив, но вам также нужно создать новые ImageProcessor объекты во внешних скобках, используя ключевое слово new:

class GUI {
    private ImageProcessor imager = new ImageProcessor();
    private ImageProcessor[] LAMBDAS = new ImageProcessor[] {
            //LAMBDAS[0]
            new ImageProcessor() {
                public void blur() {
                    imager.blur();
                }
            },

            //LAMBDAS[1]
            new ImageProcessor() {
                public void blur() {
                    imager.blur();
                }
            } };
}

Вы также можете опустить часть new ImageProcessor[] синтаксис инициализации массива, если он предпочтителен, и просто используйте фигурные скобки.


Выше приведен только синтаксический код ошибки, вызывающий ошибки компилятора. Как примечание, это не то, как обработчики событий обычно связаны даже с источниками. Массив не поможет вам в этом случае. Если бы у вас было (например) несколько кнопок, выполняющих похожие события с разными аргументами , то, возможно, вам понадобился бы массив. В вашем случае, однако, должно быть достаточно зарегистрировать события, добавив прослушиватель без компиляции массива ImageProcessor объектов, при этом каждый ImageProcessor выполняет только одно и то же (например, один из blur(), sharpen() и др. c.).

1 голос
/ 22 февраля 2020

Я не думаю, что это может работать.

То, что вы можете сделать, это использовать отражение, см. Этот урок из Oracle: https://www.oracle.com/technical-resources/articles/java/javareflection.html

Однако я бы сделал это только в случае крайней необходимости, потому что это позволит избежать много проверок во время компиляции и выполняется медленнее, чем обычные вызовы методов.

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