我正在尝试为运行程序的ProcessBuilder创建一个命令列表,具体取决于在GUI上选择的内容。
我有10个按钮,我需要每个按钮返回并添加一个字符串到列表 切换时切换并在切换时将其移除。
我试图在.isSelected时向列表中添加值,并在禁用时将其删除。 但我认为这不是一个好方法。
有没有人有任何想法?
编辑:是否将所有按钮添加到ToggleGroup并使用Switch是一个有效的解决方案?
答案 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。谢谢。