Как вызвать и событие и прослушать его, используя класс без свинга - PullRequest
0 голосов
/ 18 января 2012

Я сейчас работаю над небольшим консольным приложением.Это приложение основано на архитектуре MVC.Мой контроллер добавляет свой собственный ActionListener к представлению, которым он управляет.Мой ConsoleView не расширяет Swing или Компонент, который позволяет ему иметь метод addActionListener.Это код моего ConsoleView, который должен быть запущен из командной оболочки и ожидает ввода пользователя.

public class ConsoleView implements InterfaceView {
    private Console c = null;

    public ConsoleView() {
        c = System.console();
        if (c == null) {
            System.err.println("No console.");
            System.exit(1);
        }
        String input;
        do {
            input = c.readLine();
        } while (!parse(input));
    }

    /**
     * Parse the input and returns true if the input has been successfully
     * parse;
     * 
     * @param input
     * @return
     */
    public static boolean parse(String input) {
        if (input == null || input.equals(""))
            return false;
        input = input.trim();
        int separator = input.indexOf(' ');
        String cmd, arguments;
        if (separator == -1) {
            cmd = input;
            arguments = null;
        } else {
            cmd = input.substring(0, separator);
            arguments = input.substring(separator + 1);
        }
        Commands command;
        try {
            command = Commands.valueOf(cmd);
        } catch (IllegalArgumentException ex) {
            command = Commands.help;
        }
        String print = "You used " + cmd + " with arguments :" + arguments;
        switch (command) {
        case startvm:
            break;
        case stopvm:
            break;
        case list:
            break;
        case help:
            break;
        case exit:
            return true;
        default:
            break;
        }
        System.out.println(print);
        return false;
    }

    public static enum Commands {
        stopvm, startvm, list, help, exit
    }
    //cal comes from my controller
    public void addCommandListener(ActionListener cal){
                //This is where i would do this.addActionListener(cal)
    }
}

Я также хотел бы иметь возможность инициировать эти события в методе parse, чтобыКонтроллер делает то, что должен делать, когда слушатель замечает, что событие было инициировано.

Большое спасибо.Если у вас есть альтернативный вариант, как это сделать, продолжайте, я буду слушать!

PS Мой босс хочет использовать эту командную строку, поэтому нет интерфейса Swing !!

1 Ответ

1 голос
/ 18 января 2012

Ничто не мешает вам реализовать шаблон Observer в любых классах!

Вы можете повторно использовать listener интерфейсы Swing, если хотите, или создать свой собственный,Затем вам нужно добавить метод регистрации и отмены регистрации в ваш наблюдаемый класс, который в основном добавляет и удаляет объект listener в список;и метод, который запускает события изменения (то есть вызывает методы на зарегистрированных слушателях с соответствующими параметрами).

Существует проблема с текущим кодом, и заключается в том, что метод parsestatic, вы должны сделать его нестатичным, чтобы он знал о списке слушателей консоли.

...