Java 如何使用非swing类触发和事件并监听它

Java 如何使用非swing类触发和事件并监听它,java,events,actionlistener,Java,Events,Actionlistener,我目前正在开发一个小型控制台应用程序。此应用程序基于MVC体系结构。我的控制器将自己的ActionListener添加到它管理的视图中。我的ConsoleView不扩展任何Swing或组件,使其可以使用方法addActionListener。这是我的ConsoleView的代码,必须从命令shell运行,并等待用户输入 public class ConsoleView implements InterfaceView { private Console c = null; pu

我目前正在开发一个小型控制台应用程序。此应用程序基于MVC体系结构。我的控制器将自己的ActionListener添加到它管理的视图中。我的ConsoleView不扩展任何Swing或组件,使其可以使用方法
addActionListener
。这是我的ConsoleView的代码,必须从命令shell运行,并等待用户输入

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
方法中触发这些事件,以便控制器在侦听器注意到已触发事件时执行它必须执行的操作

非常感谢。如果你有其他选择,我会听你的


另外,我的老板想使用这个命令提示符,这就是为什么没有Swing界面

没有什么可以阻止您在任何类型的类中实现观察者模式

如果需要,可以重用Swing的侦听器接口,或者创建自己的接口。然后,您必须向您的可观察类添加register和unregister方法,该方法基本上将侦听器对象添加和删除到列表中;以及触发更改事件的方法(即,使用相关参数调用已注册侦听器上的方法)


但是当前代码存在一个问题,
parse
方法是
static
,您应该将其设置为非静态,以便它了解console视图的侦听器列表。

我看到一些发布的代码,但与您正在侦听的内容无关。这就引出了一个问题——到底在听什么?什么会“触发”听众开火?哪里是将事件通知侦听器的代码?我猜如果你正在监听对绑定类属性的更改,你会使用PropertyChangeListener,但是再一次,根据你所发布的内容,我就是说不出来。我们误解了他所说的MVC,它更像是他想要使用的层架构。虽然您的答案在其他具有类似需求的项目中非常有用。谢谢