从命令行打开时不要打开Java GUI

时间:2018-02-13 10:09:39

标签: java swing user-interface command-line command-line-interface

我正在尝试使用相同的jar文件(如果可能)实现以下目标:

  1. 在CLI中显示使用情况信息,如果没有/无效的CLI参数,则退出程序,而不打开GUI。
  2. 当用户从桌面/资源管理器启动程序或通常在CLI环境之外启动程序时,应显示GUI。
  3. 我非常清楚我可以检查args数组的长度,但是,我还没有看到满足上述两个条件的方法。

    因此,简单的args.length > 0检查无法满足上述第一个要求。

    有没有办法实现所描述的行为,我可能需要寻找父流程,还是这样的事情根本不可行/不可能?

2 个答案:

答案 0 :(得分:4)

你可能想要这样的东西:

public static void main(String[] args) {
    if (args.length > 0) {
        //use as command line tool
    } else {
        //start GUI
    }
}

你只需要检查是否有命令行参数。

答案 1 :(得分:0)

OOP,Architechture,SOLID Principles等等......

在SOLID原则中,第一个原则是Single Responsibility Principle,其中必须将自己对象中的每个责任分开,每个对象只有一个责任。因此,例如,不能将应用程序逻辑放在同一个UI对象中。

您的解决方案是将应用程序逻辑与UI分开,然后创建另一个作为命令行界面的界面。

例如:你想制作一些可以添加两个数字的东西。

一个人JFrame,两个JTextField和一个按钮。然后你添加 按钮上的单击侦听器,添加两个数字并将其打印在JLabel上。但是,如果它是这样的,那怎么能做一个CLI?

在这种情况下,您应该制作类似的东西,它处理Swing和CLI(应用程序逻辑)之间的通用逻辑:

interface NumberAdditionResultAsString {
    void postResult(String result);
    void postError(Exception ex);
}

class NumberAdderFromStrings {
    void executeTheAddition(String num1, String num2, NumberAdditionResultAsString listener) {
        try {
            double n1 = Double.parseDouble(num1);
            double n2 = Double.parseDouble(num2);
            listener.postResult(Double.toString(n1 + n2));
        } catch(Exception ex) {
            listener.postError(ex);
        }
    }
}

现在可以轻松地从Swing和CLI调用此应用程序逻辑。 还使用了“回调”,它更适合处理在其他线程上发生的冗长操作。

此外,如果您想要更复杂的东西,可以使用command设计模式。所有那些“应用程序逻辑”,实现单个接口。然后你的UI和CLI都会调用它们。

interface ApplicationCommand {
    Object execute(Object... parameters);
}

然后在主要的Application类中创建类似的东西:

Map<String, ApplicationCommand> commandMap = new HashMap<>();

然后填充它:

commandMap.put("add", new ApplicationCommand() {
    @Override
    public Object execute(Object... parameters) {
        double sum = 0;
        for (Object one: parameters) {
            sum += Double.parseDouble(one.toString());
        }
        return sum;
    }
});

嗯,这不是最好的设计。更好的方法是将每个String与创建命令的Factory对象相关联,而不是与命令对象本身相关联。但这是为了简单起见。

建议:了解

Command design pattern

Strategy design pattern

Abstract factory design pattern

Flyweight design pattern(可以帮助正确创建命令图)

SOLID Principles(主要阅读:单一责任和依赖性倒置)