【问题标题】:Getting UI elements by type from Control array?从 Control 数组中按类型获取 UI 元素?
【发布时间】:2018-01-21 12:00:03
【问题描述】:

有没有办法循环遍历 Control 数组并只获取一种类型的 UI 元素,例如,TextFields?这是一个包含TextFields、DatePickers 和ChoiceBoxes 的数组:

Control[] allControls = new Control[] {
     name, surname, age, address, city,
     telephoneNum, email, deptBox, idNum, startDate,
     contractType, endDate, payFreq, accountNum, taxCoeficient,
     netSalary 
};

有没有办法将if 条件放在for 循环中并且只获取一种类型的UI 元素?

【问题讨论】:

    标签: java arrays for-loop if-statement javafx


    【解决方案1】:

    您可以应用Stream API 来过滤所有使用instanceof 的所需类的实例,最后将它们收集到一个新列表中:

    List<TextField> textFieldList = Arrays.asList(allControls).stream()
        .filter(c -> c instanceof TextField)
        .map (c -> (TextField) c)
        .collect(Collectors.toList());
    

    【讨论】:

      【解决方案2】:

      你可以使用instanceof 和这样的循环:

      List<Control> list = new ArrayList<>();
      for(Control item : allControls){
          if(item instanceof TextField){
              list.add(c);
          }
      }
      

      编辑

      你可以对新列表中的项目使用 getText() 方法吗?如何访问 控制项的值?

      是的,您可以将您的项目投射到TextField,然后您可以像这样使用getText()

      List<TextField> list = new ArrayList<>();
      for (Control item : list) {
          String text = ((TextField) item).getText();
          System.out.println(text);
      }
      

      为了避免这一切,您可以像这样从 begginig 创建一个TextField 列表:

      List<TextField> list = new ArrayList<>();
      for (Control item : allControls) {
          if (item instanceof TextField) {
              list.add((TextField) item);
          }
      }
      

      因此您可以轻松使用item.getText() 而无需强制转换。

      【讨论】:

      • 你可以对新列表中的项目使用 getText() 方法吗?如何访问控制项的值?
      • @Kvark900 您可以将您的项目投射到(TextField) item,这样您就可以使用getText(),例如((TextField) item).getText()
      猜你喜欢
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2018-07-20
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多