【问题标题】:Checking If ListView<String> contains a String - JavaFX检查 ListView<String> 是否包含字符串 - JavaFX
【发布时间】:2021-03-05 20:21:53
【问题描述】:

我正在制作一个 JavaFX 应用程序,其中有一个 ComboBox&lt;String&gt;,所以当我单击 ComboBox 中的任何项目时,我将该项目添加到 String course,然后将我的 ListView&lt;String&gt; 附加到课程字符串.

但同时,我不想向 ListView 添加任何重复项。

那么有什么可能的方法来做到这一点? 有没有办法检查 ListView 是否包含它? 我试过了,但我不能使用包含 ListView 和 String course

    @FXML
    private ComboBox<String> select_subject;

    @FXML
    private ListView<String> course_list;

    public void diplaysubjects() {
            String course = select_subject.getSelectionModel().getSelectedItem();
                   course_list.getItems().add(course.toString());
    }

【问题讨论】:

  • 我不能使用 contains 为什么不呢,一个 observableList 是一个列表;)顺便说一句:a)使用适当的自定义单元格添加课程到组合和列表视图( vs a String) b) 坚持 java 命名约定

标签: java string listview javafx contains


【解决方案1】:

您可以使用ObservableList.contains 方法快速检查是否出现类似项目:

public void diplaysubjects() {
    String item = select_subject.getSelectionModel().getSelectedItem();
    ObservableList<String> courses = course_list.getItems(); // Only here to clarify the code

    if (!courses.contains(item))
        courses.add(item);
}

我不知道您的代码使用了哪种模式,但如果它是类似 MVC 的,我建议您直接使用模型的可观察列表而不是调用 course_list.getItems()

【讨论】:

    【解决方案2】:

    我建议您将可观察列表与 ListView 一起使用。 这样做

    public class Controller implements Initializable {
    
    @FXML
    private ComboBox<String> select_subject;
    
    @FXML
    private ListView<String> course_list;
    
    private ObservableList<String> list = FXCollections.observableArrayList();
    
    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        course_list.setItems(list);
    }
    
    public void diplaysubjects() {
        String course = select_subject.getSelectionModel().getSelectedItem();
        //Instead of adding directly to listview add to observablelist
        //course_list.getItems().add(course.toString());
        list.add(course);
    }
    
    //To check the list contains the item
    private boolean doesExists(String element){
        return list.contains(element);
    }
    }
    

    【讨论】:

    • 没有理由 a) 为 listView 的项目保留别名 b) 通过包含的方法使代码膨胀(只要它什么都不做)
    【解决方案3】:

    您可以添加一个 arrayList(),如果它不包含它,则添加 String,然后将其添加到 ListView。

    @FXML
        private ComboBox<String> select_subject;
    
        @FXML
        private ListView<String> course_list;
    
        public void diplaysubjects() {
                ArrayList<String> s = new ArrayList<>();
          
                String course = select_subject.getSelectionModel().getSelectedItem();
                 if (!s.contains(course)){
                     s.add(course);
                     course_list.getItems().add(course.toString());
                 }
        }
    

    【讨论】:

    • 嗯..那是完全错误的:a) if-block 将始终被执行(因为 s 是一个空数组) b) 即使它不是(在重新组织代码之后),为什么你想保留 listView 项目的副本吗 c) string.toString 充其量是多余的
    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2011-09-19
    • 2011-11-09
    • 2013-05-18
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多