2016-03-07 39 views
0

我想创建一个命令列表,用于运行程序的ProcessBuilder,具体取决于在GUI上选择的内容。如何使用切换按钮建立字符串列表

我有10个按钮,我需要每个按钮来返回并添加一个字符串列表 当切换和删除它,而没有切换。

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

有没有人有任何想法?

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

+0

如果将所有按钮添加到切换组中,一次只能选择一个按钮,这可能不是您想要的... –

回答

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而重构。谢谢。

0

我会使用EnumSet。为每个Button定义一个枚举常量(带有要显示的名称属性),然后让togglebutton添加或删除集合中的枚举。通过这种方式,按钮类只需要具有作为它的常量枚举集的构造函数的参数。

通过迭代EnumSet,可以轻松地将参数添加到命令行中。

这个方案的好处是,Button类可以是小的和通用(增加一个命令行选项将只需添加一个new CommandOptionButton(Options.VERBOSE, optionsSet),而集比添加和从列表中删除字符串算法好得多。

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处理程序中稍微多做一点工作才能提取命令)。