当前位置: 首页 > 知识库问答 >
问题:

ListView未反映更改

欧阳俊晖
2023-03-14

我创建了一个TableView,并为每个TableColumn注册了属性。内部数据的编辑可以很好地反映在TableView中。

然而,对于ListView,情况就不同了。除非我关闭框架并再次打开它,否则更改不会立即显示。

package application.objects;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.function.IntPredicate;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class ActionStep {

   private StringProperty actionStepID;
   private ObjectProperty<LocalDate> dateSet, dateFinished;
   private StringProperty stepName;
   private IntegerProperty completion;
   private ArrayList<StepComment> comments;



   public ActionStep(String name) {
      actionStepID = new SimpleStringProperty();
      stepName = new SimpleStringProperty();
      dateSet = new SimpleObjectProperty<LocalDate>();
      dateFinished = new SimpleObjectProperty<LocalDate>();
      completion = new SimpleIntegerProperty();
      stepName.setValue(name);
   }



   public void setName(String name) {
      stepName.setValue(name);
   }



   public String getName() {
      return stepName.getValue();
   }



   public StringProperty stepNameProperty() {
      return actionStepID;
   }



   public void setID(String id) {
      actionStepID.setValue(id);
   }



   public String getID() {
      return actionStepID.get();
   }



   public StringProperty actionStepIDProperty() {
      return actionStepID;
   }



   public void setCompletion(int percent) {
      if (percent < 0 || percent > 100)
         return;
      completion.set(percent);
   }



   public int getCompletion() {
      return completion.get();
   }



   public IntegerProperty completionProperty() {
      return completion;
   }



   public void setDateSet(LocalDate date) {
      dateSet.set(date);
   }



   public LocalDate getDateSet() {
      return dateSet.get();
   }



   public ObjectProperty<LocalDate> dateSetProperty() {
      return dateSet;
   }



   public void setDateFinished(LocalDate date) {
      dateFinished.set(date);
   }



   public LocalDate getDateFinished() {
      return dateFinished.get();
   }



   public ObjectProperty<LocalDate> dateFinishedProperty() {
      return dateFinished;
   }



   public String toString() {
      return stepNameProperty().get();
   }

}
  @FXML
  private ListView<ActionStep> actionStepsListView;
  private ObservableList<ActionStep> listOfSteps;

  listOfSteps = FXCollections.observableArrayList();
  actionStepsListView.setItems(listOfSteps);
  if (plan != null) {
     ArrayList<ActionStep> arrayOfSteps = plan.getStepsArrayList();
     for (int i = 0; i < arrayOfSteps.size(); i++)
        listOfSteps.add(arrayOfSteps.get(i));
  } else
     plan = new ActionPlan();

共有1个答案

荣俊杰
2023-03-14

请注意,您试图对ListView中的单元格进行比对TableView中的单元格进行更复杂的操作。在tableview中,单元格中显示的对象正在变化,因此单元格很容易观察到这一点。在ListView中,您希望单元格注意到属于单元格中显示的对象的属性发生更改;这是一个进一步的步骤,所以您必须做一些额外的编码(虽然不是很多,正如您将看到的)。

您可以创建一个自定义单元格工厂来绑定到stepNameProperty(),但这很棘手(您必须确保从updateItem()方法中的旧项中取消绑定/删除侦听器)。

不过,更简单的方法是使用定义了提取器的observableList

首先,修正您的方法名称:您发布的代码中有一些奇怪的不匹配。getx/setx/xproperty方法名称应全部正确匹配。即。而不是

   public void setName(String name) {
      stepName.setValue(name);
   }



   public String getName() {
      return stepName.getValue();
   }



   public StringProperty stepNameProperty() {
      return actionStepID;
   }

你应该

   public final void setName(String name) {
      stepName.setValue(name);
   }



   public final String getName() {
      return stepName.getValue();
   }


   public StringProperty nameProperty() {
      return stepName;
   }

其他属性访问器方法也是如此。(很明显,字段的名称可以是您喜欢的任何名称,因为它们是私有的。)使get/set方法最终化是一个很好的实践。

  listOfSteps = FXCollections.observableArrayList(
    actionStep -> new Observable[] { actionStep.nameProperty() } // the "extractor"
  );
  actionStepsListView.setItems(listOfSteps);

如果您不是在使用Java8,那么可以使用以下(等价但更详细)代码:

listOfSteps = FXCollections.observableArrayList(
    new Callback<ActionStep, Observable[]>() {
        @Override
        public Observable[] call(ActionStep actionStep) {
            return new Observable[] { actionStep.nameProperty() } ;
        }
    });
actionStepListView.setItems(listOfSteps);
 类似资料:
  • 问题内容: 我创建了一个TableView,并向每个TableColumns注册了Properties。内部数据的编辑本身可以很好地反映在TableView中。 但是,使用ListView则是另一回事。除非关闭框架并再次打开,否则更改不会立即显示。 我的ListView包含ActionSteps。请注意,我使用了Javafx bean属性。 我的ListView也使用ObservableList。

  • 问题内容: 我正在我的网站上工作,每当我在CSS文件中添加一些新行时,它只是不想使用我所做的行。 但是,他们应该没事。 举个例子。 CSS文件只在某一部分起作用,但是从某处开始只是停止使用我的文件。但是,它链接在< head >中。 我的HTML代码如下(请注意,这只是代码的一部分): 有人知道解决方案吗? 问题答案: 我忘了在CSS文件中关闭。这就是为什么所有代码​​都没有显示在页面上的原因。

  • 编辑:这是在添加到购物车按钮onclick事件时执行的函数: addToCart action creator如下所示:

  • 我创建了一个自定义的JDialog,其中有一些处于内部状态,我想在JDialog关闭后在父JFrame中查询这些状态。我将JDialog的模态设置为“true”,这会阻止JFrame,直到JDialog被释放。 在JDialog中,我更新状态并使用用户交互调用dispose。我验证状态是否已更新。但是,当JDialog关闭后父帧恢复时,我查询的状态不是我将JDialog设置为的状态。我不确定我在这

  • update问题似乎在于从语句中更新数据源。

  • 问题内容: 我试图用AngularJS创建一些自定义元素并将一些事件绑定到它,然后我注意到$ scope.var在绑定函数中使用时不会更新UI。 这是描述探针的简化示例: HTML: JS: 演示:http : //plnkr.co/edit/g3S56xez6Q90mjbFogkL?p=preview 基本上,我将事件绑定到用户并想要在用户单击按钮B时进行更改(类似于按钮A上的更改)。但是如果我