【问题标题】:How to properly implement observable list to populate a combobox如何正确实现可观察列表以填充组合框
【发布时间】:2019-06-28 18:32:25
【问题描述】:

我目前正在制作一个将用作日历的项目。目前我正在尝试实现一个组合框,允许用户选择他们想要跳到的月份。我在实现可观察列表时遇到了麻烦。我看过其他教程,但似乎我仍然在让组合框获取列表中的内容时遇到问题。我的 observableArrayList 函数参数不正确吗? https://github.com/zhadjah9559/Side_Proj_Calendar.git

public class FXMLDocumentController implements Initializable {


@FXML
private Pane top, bottom, leftPane;

@FXML
private GridPane CalendarPane;

@FXML
private Label monthTitle, eventsListLabel, createEventsLabel, createdEventsLabels;

@FXML 
private TextArea bottomTextArea;

@FXML
private DatePicker datePicker;



//Creating an observable list to populate comboBox
private ObservableList<String> list = FXCollections.observableArrayList("month"); //only testing

public ObservableList<String> getList() {
    return list;
}

public void setList(ObservableList<String> list) {
    this.list = list;
}

//populating the comboBox
@FXML
private ComboBox chooseMonth;




// individual dates or days (monday - sunday)
@FXML
private Label Label00, Label02, Label03, Label04,Label05,Label10,
        Label11, Label12, Label13, Label14, Label15, Label20, Label21,
        Label22, Label23, Label24, Label25, Label30, Label31, Label32,
        Label33, Label34, Label35, Label40, Label41, Label42, Label43,
        Label44, Label45, Label50, Label51, Label52, Label53, Label54,
        Label55, Label60, Label61, Label62, Label63, Label64, Label65;

@Override
public void initialize(URL url, ResourceBundle rb) {
    chooseMonth.setItems(list);
}    

@FXML
private void loadFebruary(ActionEvent event) throws IOException {   
    Parent registerPane = FXMLLoader.load(getClass().getResource("February.fxml"));
    Scene ViewScene = new Scene(registerPane);

    Stage window = (Stage) ((Node) event.getSource()).getScene().getWindow();
    window.setScene(ViewScene);
    window.show();
} 

}

【问题讨论】:

    标签: java javafx javafx-8 fxml observablelist


    【解决方案1】:

    您的代码甚至无法按照编写的方式编译。您正在尝试将 String 传递给您的 FXCollections.observableArrayList() 方法。该方法不接受 String 参数。

    要创建正确的ObservableList,您需要将实际的List 传递给方法。这是一个这样的示例,使用Arrays.asList() 即时生成List

    ObservableList<String> list = FXCollections.observableList(Arrays.asList("Jan", "Feb", "Mar"));
    

    从那里,您可以设置 ComboBox 项目:

    comboBox.setItems(list);
    

    【讨论】:

      【解决方案2】:

      我所做的与 Zephyr 建议的类似,但略有不同。主要区别在于最后,允许在组合框中设置默认值。

      在我的项目中,表格视图正在填充基于组合框中当前选择的值的信息。也许这是一个用户错误的事情,但默认情况下,我的组合框在启动时是空白的,所以程序正在读取错误并且无法正常运行。所以在组合框中添加一个默认值解决了我的问题。

      将此代码放在您的 FXML 项目(如按钮、文本字段等)之后以创建列表:

      private final ObservableList<String> allMonths = FXCollections.observableArrayList("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
      

      并在您的初始化方法下,使用以下内容填充该列表:

      monthComboBox.setItems(allMonths);
      

      您还可以更进一步,将列表中的一项(即一月)设置为默认选项,方法是在填充列表后放置:

      monthComboBox.getSelectionModel().selectFirst();
      

      总而言之,FXMLController 看起来像这样,假设上面有正确的导入(因为我不记得所有这些都是在我脑海中浮现的):

      public class FXMLDocumentController implements Initializable {
      
          @FXML private ComboBox<String> monthComboBox;
      
          private final ObservableList<String> allMonths = FXCollections.observableArrayList("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
      
          @Override
          public void initialize(URL url, ResourceBundle rb) {
          monthComboBox.setItems(allMonths);
          monthComboBox.getSelectionModel().selectFirst();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多