创建具有相似结构的`MenuItem`

时间:2017-05-25 00:54:34

标签: java javafx

我创建了几个结构相似的MenuItem,注意Topicenum类的位置。

结构如下:

    CheckBox business = new CheckBox("Business");
    // add Topic to filteredTopics set when box is selcted
    business.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            if(((CheckBox)event.getSource()).isSelected()) {
                filteredTopics.add(Topic.BUSINESS);
            } else {
                filteredTopics.remove(Topic.BUSINESS);
            }
        }
    });

    CheckBox international = new CheckBox("International");
    // add Topic to filteredTopics set when box is selcted
    international.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            if(((CheckBox)event.getSource()).isSelected()) {
                filteredTopics.add(Topic.INTERNATIONAL);
            } else {
                filteredTopics.remove(Topic.INTERNATIONAL);
            }
        }
    }); 

    //etc like Sport, Domestic...

是否有一种非常紧凑的方式来编码这些MenuItem,我是否对主题进行了硬编码?正如要求所说主题控件应该编程,而不是硬编码(也就是说,程序本身应该从Topic枚举类型中确定所有控件的数量和名称)。

如果需要进一步澄清,请告诉我。

1 个答案:

答案 0 :(得分:0)

为枚举中的每个主题创建一个数组中的复选框。

像这样。

List<CheckBox> checkboxes = new ArrayList<CheckBox>();
for(Topic t : Topic.values()) {
   Checkbox c = new Checkbox(t.toString());
   c.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent event) {
          if((CheckBox)event.getSource()).isSelected()) {
              filteredTopics.add(t);
          }
          else {
             filteredTopics.remove(t);
          }
      }
   });
   checkboxes.add(c);
}

为复选框创建一个小扩展类也是有意义的,它允许您存储主题,以便以后更容易访问,但您可以使用值的顺序来解决这个问题。设置。