如何使用切换按钮构建字符串列表

时间:2016-03-07 18:22:42

标签: java javafx

我正在尝试为运行程序的ProcessBuilder创建一个命令列表,具体取决于在GUI上选择的内容。

我有10个按钮,我需要每个按钮返回并添加一个字符串到列表 切换时切换并在切换时将其移除。

我试图在.isSelected时向列表中添加值,并在禁用时将其删除。 但我认为这不是一个好方法。

有没有人有任何想法?

编辑:是否将所有按钮添加到ToggleGroup并使用Switch是一个有效的解决方案?

3 个答案:

答案 0 :(得分:2)

一个简单的实现是:

public class MyApplication extends Application {

    private final List<String> commands = new ArrayList<>();

    @Override
    public void start(Stage primaryStage) {
        VBox commandToggles = new VBox();
        commandToggles.getChildren().add(createCommandToggle("Command 1", "exec1"));
        commandToggles.getChildren().add(createCommandToggle("Command 2", "exec2"));
        commandToggles.getChildren().add(createCommandToggle("Command 3", "exec3"));
        // ...

        Button runButton = new Button("Run");
        runButton.setOnAction(e -> {
            ProcessBuilder pb = new ProcessBuilder(commands);
            // ...
        });

        // ...

    }

    private ToggleButton createCommandToggle(String text, String executable) {
        ToggleButton button = new ToggleButton(text);
        button.selectedProperty().addListener((obs, wasSelected, isSelected) -> {
            if (isSelected) { 
                commands.add(executable);
            } else {
                commands.remove(executable);
            }
        }
        return button ;
    }
}

正如@Valette_Renoux建议的那样,您可以通过在enum中封装按钮和可执行命令的文本来优化这一点,并将列表替换为EnumSet。这使得构建切换按钮的重复性稍差(尽管您可能需要在runButton处理程序中再多做一些工作来提取命令)。

答案 1 :(得分:0)

我会使用EnumSet。为每个Button定义一个枚举常量(使用要显示的name属性),然后让togglebutton添加或删除集合中的枚举。这样,按钮类只需要为构造函数提供枚举常量的参数和EnumSet。

通过迭代EnumSet,可以很容易地向命令行添加参数。

这个解决方案的优点是Button类可以很小而且通用(添加一个命令行选项只会添加一个new CommandOptionButton(Options.VERBOSE, optionsSet),并且该集合在算法上比添加和删除字符串更好。列表。

答案 2 :(得分:0)

谢谢你们,我选择了这样的事情:

public ToggleButton getBuildBtn() {

        final ToggleButton button = new ToggleButton("Build");

        button.setStyle("-fx-font: 15 verdana; -fx-base: " + buttonsColor + ";");
        button.setOnAction(event -> selectedhandler(button, "build"));
        return button;
}

private void selectedhandler(final ToggleButton button, String command) {
    if (button.isSelected()) {
        button.setStyle("-fx-base: #00ff0f;");
        commands.add(command);
    } else {
        button.setStyle("-fx-base: " + buttonsColor + ";");
        commands.remove(command);
    }
}

我会在重构时考虑enumSet。谢谢。