JAVAFX可编辑ComboBox:更改值后刷新

时间:2014-03-20 10:08:19

标签: combobox javafx converter edit

我还是JavaFX的新手,需要创建一个带有对象(SimlpePerson)而不是字符串的组合框。我想在框中编辑显示的值。适用于字符串,但我有使用SimpleObjects的问题。我做了一个StringConverter,它也可以工作,我可以编辑comboBox中显示的对象。但是之后这个名单本身并没有被重新渲染。如果我点击ComboBox,我会看到原始值。我怎么能改变它?

非常欢迎任何建议!=)

BR,谢谢! 斯蒂芬

    import javafx.application.Application;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.scene.Scene;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.TableView;
    import javafx.stage.Stage;
    import javafx.util.StringConverter;

    public class ComboBoxDemo extends Application{

      public class SimplePerson {
        private StringProperty name;
        private String somethingElse;

        public SimplePerson(String name) {
          setName(name);
        }

        public final void setName(String value) { nameProperty().set(value); }
        public String getName() { return nameProperty().get(); }

        public StringProperty nameProperty() {
          if (name == null) name = new SimpleStringProperty(this, "name");
          return name;
        }
      }

      final ObservableList<SimplePerson> persons = FXCollections.observableArrayList(
            new SimplePerson("Jacob"),
            new SimplePerson("Isabella"),
            new SimplePerson("Ethan"),
            new SimplePerson("Emma"),
            new SimplePerson("Michael")
          );

      @Override
      public void start(Stage stage) throws Exception {
        // TODO Auto-generated method stub

        final ComboBox cb = new ComboBox();
        cb.setItems(persons);
        cb.setEditable(true);
        cb.setConverter(new StringConverter<SimplePerson>() {

          @Override
          public String toString(SimplePerson p) 
          {
            if(p != null)
              return p.getName();
            return "";
          }

          @Override
          public SimplePerson fromString(String name) 
          {
            if(cb.getValue() != null)
            {
              ((SimplePerson)cb.getValue()).setName(name);
              cb.show();
              return (SimplePerson)cb.getValue();
            }
            return null;
          }
        });

        stage.setScene(new Scene(cb));
        stage.show();

      }

      public static void main(String[] args) { launch(args); }

    }

1 个答案:

答案 0 :(得分:2)

结帐this solution。在您完成编辑后会触发一个处理程序。在那里,您可以实现改变模型状态的所有代码。

要更新组合框列表,可以采用以下方法:

 cb.getEditor().setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            SimplePerson person = cb.getValue();
            if (null != person) {
                int idx = persons.indexOf(person);
                person.setName(cb.getEditor().getText());
                persons.set(idx, person);
                cb.setValue(person);
            }
        }
    });