【问题标题】:Is there a way to shorten code that is duplicated because of similiar properties of objects?有没有办法缩短由于对象的相似属性而重复的代码?
【发布时间】:2019-09-13 10:42:40
【问题描述】:

我有许多复选框,所有这些复选框都依赖于某个未被选中的框,但如果它确实被选中,则必须选中并隐藏这些框。我知道人们一直在说 ArrayList,但我不知道如何编辑 ArrayList 中项目的某些属性的语法。

我的代码可以工作,我只需要更短的代码,因为我相信如果它继续像这样运行,最终会减慢进程,我想了解这对我拥有的其他对象是如何工作的做同样的事情。

 public void cbxSalesSelectA() {
    boolean t = cbx_SALES_Select_All.getText().equals("Select All");
    cbx_SALESQtySold.setSelected(t);
    cbx_SALESDateSold.setSelected(t);
    cbx_SALESCustomer.setSelected(t);
    cbx_SALESDiscount.setSelected(t);
    cbx_SALESLineNumber.setSelected(t);
    cbx_SALESConsultant.setSelected(t);
    cbx_SALES_Header_Row.setSelected(t);
    if (t) {
        cbx_SALES_Select_All.setText("Deselect All");
    } else {
        cbx_SALES_Select_All.setText("Select All");
    }
}
 public void cbxLOCSelectA() {
    boolean t = cbx_LOC_Select_All.getText().equals("Select All");
    cbx_LOCHeight.setSelected(t);
    cbx_LOCWidth.setSelected(t);
    cbx_LOCDepth.setSelected(t);
    cbx_LOCWeightCap.setSelected(t);
    cbx_LOCAccessibility.setSelected(t);
    cbx_LOC_Header_Row.setSelected(t);
    if (t) {
        cbx_LOC_Select_All.setText("Deselect All");
    } else {
        cbx_LOC_Select_All.setText("Select All");
    }
}

【问题讨论】:

  • 您不太可能改变性能。但是,您也许可以使解决方案更具可读性。

标签: java arraylist javafx-8 code-duplication


【解决方案1】:

我不认为您真的可以提高代码的性能,但为了便于阅读,您可以在单独的方法中更改 selected。比如

static void allSetSelected(boolean isSelected, CheckBox... boxes ) {
    Arrays.stream(boxes).forEach(b -> b.setSelected(isSelected));
}

并像这样在您的代码中使用它

public void cbxSalesSelectA() {
    boolean t = cbx_SALES_Select_All.getText().equals("Select All");
    allSetSelected(t, cbx_SALESQtySold,
                      cbx_SALESDateSold,
                      cbx_SALESCustomer,
                      cbx_SALESDiscount,
                      cbx_SALESLineNumber,
                      cbx_SALESConsultant,
                      cbx_SALES_Header_Row)
    if (t) {
        cbx_SALES_Select_All.setText("Deselect All");
    } else {
        cbx_SALES_Select_All.setText("Select All");
    }
}

public void cbxLOCSelectA() {
    boolean t = cbx_LOC_Select_All.getText().equals("Select All");
    allSetSelected(t, cbx_LOCHeight, cbx_LOCWidth, cbx_LOCDepth, cbx_LOCWeightCap, cbx_LOCAccessibility, cbx_LOC_Header_Row);
    if (t) {
        cbx_LOC_Select_All.setText("Deselect All");
    } else {
        cbx_LOC_Select_All.setText("Select All");
    }
}

【讨论】:

    【解决方案2】:

    如果您使用 ArrayList 或复选框对象数组,您可以使用循环遍历所有复选框并根据需要选中或取消选中它们。

    例如,

    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.scene.Scene;
    import javafx.scene.control.CheckBox;
    import javafx.scene.control.ComboBox;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Example  extends Application {
    
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            // Creating an ArrayList here and adding all the checkboxes required. In your
            // case you'd add your existing checkboxes
            List<CheckBox> list = new ArrayList<>();
            list.add(new CheckBox());
            list.add(new CheckBox());
            list.add(new CheckBox());
            list.add(new CheckBox());
    
            // this combobox controls whether or not all checkboxes are selected
            ComboBox<String> comboBox = new ComboBox<>();
    
            // two options to either select all or deselect all checkboxes
            comboBox.setItems(FXCollections.observableArrayList("Select All", "Deselect All"));
    
            // container to hold all the controls
            VBox vBox = new VBox();
            vBox.getChildren().add(comboBox);
            vBox.getChildren().addAll(list);
    
            // this is the important bit
            // if the combobox selection is changed, then this fires
            comboBox.setOnAction(event -> {
                // if the selected option is select all, then a for-each loop is used to make all the 
                // checkboxes in the arraylist checked and vice versa if the deselect option is selected
                if (comboBox.getSelectionModel().getSelectedItem().equalsIgnoreCase("Select All")) {
                    for (CheckBox checkBox : list) checkBox.setSelected(true);
                } else {
                    for (CheckBox checkBox : list) checkBox.setSelected(false);
                }
            });
    
            primaryStage.setScene(new Scene(vBox));
            primaryStage.setTitle("Example");
            primaryStage.setWidth(600);
            primaryStage.setHeight(400);
            primaryStage.show();
        }
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多