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

从addListener中的ListView中删除项

段干浩荡
2023-03-14

我对下面的Java程序有问题。我在Ubuntu系统上使用带有JDK-1.8u25的JavaFX。我想显示一个ListView,并从列表中删除突出显示的条目。我创建了一个列表,并将其与一个可观察列表配对,以通知侦听器事件。然而,通过删除下面的“orderOvList.remove(i,i 1)”项来更改列表似乎会生成另一个侦听器事件。所以,我似乎在侦听器代码的主体中递归。我想过将list元素从nor有序列表中移动,"orderList.remove(i)",但之后ListView没有更新。

有人有什么想法吗?

下面的代码在我运行后崩溃。

堆栈跟踪:

0
0
Exception in thread "JavaFX Application Thread" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
    at javafx.collections.ListChangeBuilder.nextRemove(ListChangeBuilder.java:204)
    at javafx.collections.ObservableListBase.nextRemove(ObservableListBase.java:150)
    at javafx.collections.ModifiableObservableListBase.remove(ModifiableObservableListBase.java:181)
    at com.sun.javafx.collections.ObservableListWrapper.remove(ObservableListWrapper.java:165)
    at TestListView.lambda$start$0(TestListView.java:32)
    at TestListView$$Lambda$82/921981528.invalidated(Unknown Source)
    at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:137)
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
    at javafx.beans.property.ReadOnlyObjectWrapper$ReadOnlyPropertyImpl.fireValueChangedEvent(ReadOnlyObjectWrapper.java:176)
    at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:142)
    at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)
    at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:145)
    at javafx.scene.control.SelectionModel.setSelectedItem(SelectionModel.java:102)
    at javafx.scene.control.ListView$ListViewBitSetSelectionModel$1.onChanged(ListView.java:1245)
    at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88)
    at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329)
    at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
    at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
    at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
    at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
    at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
    at com.sun.javafx.collections.ObservableListWrapper.remove(ObservableListWrapper.java:167)
    at TestListView.lambda$start$0(TestListView.java:32)
    at TestListView$$Lambda$82/921981528.invalidated(Unknown Source)
    at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:137)
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
    at javafx.beans.property.ReadOnlyObjectWrapper$ReadOnlyPropertyImpl.fireValueChangedEvent(ReadOnlyObjectWrapper.java:176)
    at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:142)
    at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)
    at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:145)
    at javafx.scene.control.SelectionModel.setSelectedItem(SelectionModel.java:102)
    at javafx.scene.control.MultipleSelectionModelBase.lambda$new$34(MultipleSelectionModelBase.java:67)
    at javafx.scene.control.MultipleSelectionModelBase$$Lambda$75/1274395902.invalidated(Unknown Source)
    at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:137)
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
    at javafx.beans.property.ReadOnlyIntegerWrapper$ReadOnlyPropertyImpl.fireValueChangedEvent(ReadOnlyIntegerWrapper.java:176)
    at javafx.beans.property.ReadOnlyIntegerWrapper.fireValueChangedEvent(ReadOnlyIntegerWrapper.java:142)
    at javafx.beans.property.IntegerPropertyBase.markInvalid(IntegerPropertyBase.java:113)

    at javafx.beans.property.IntegerPropertyBase.set(IntegerPropertyBase.java:146)
    at javafx.scene.control.SelectionModel.setSelectedIndex(SelectionModel.java:68)
    at javafx.scene.control.MultipleSelectionModelBase.select(MultipleSelectionModelBase.java:357)
    at javafx.scene.control.ListView.lambda$new$156(ListView.java:374)
    at javafx.scene.control.ListView$$Lambda$74/963851926.invalidated(Unknown Source)
    at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:349)
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
    at javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(ReadOnlyBooleanPropertyBase.java:72)
    at javafx.scene.Node$FocusedProperty.notifyListeners(Node.java:7526)
    at javafx.scene.Scene$13.invalidated(Scene.java:2046)
    at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:111)
    at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:145)
    at javafx.scene.Scene$KeyHandler.setFocusOwner(Scene.java:3891)
    at javafx.scene.Scene$KeyHandler.requestFocus(Scene.java:3938)
    at javafx.scene.Scene$KeyHandler.access$1900(Scene.java:3877)
    at javafx.scene.Scene.requestFocus(Scene.java:2010)
    at javafx.scene.Node.requestFocus(Node.java:7687)
    at com.sun.javafx.scene.traversal.TopMostTraversalEngine.focusAndNotify(TopMostTraversalEngine.java:92)
    at com.sun.javafx.scene.traversal.TopMostTraversalEngine.traverseToFirst(TopMostTraversalEngine.java:110)
    at javafx.scene.Scene.focusInitial(Scene.java:1980)
    at javafx.scene.Scene.access$3200(Scene.java:144)
    at javafx.scene.Scene$ScenePulseListener.focusCleanup(Scene.java:2330)
    at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2351)
    at com.sun.javafx.tk.Toolkit.lambda$runPulse$28(Toolkit.java:314)
    at com.sun.javafx.tk.Toolkit$$Lambda$154/326451107.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:313)
    at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:340)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:451)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:431)
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$363(QuantumToolkit.java:298)
    at com.sun.javafx.tk.quantum.QuantumToolkit$$Lambda$46/1868350875.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$45(GtkApplication.java:126)
    at com.sun.glass.ui.gtk.GtkApplication$$Lambda$42/584634336.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)

示例代码:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.List;

public class TestListView extends Application {
  @Override
  public void start (Stage stage) {
    List<String> orderList = new ArrayList<String> ();
    ObservableList<String> orderOvList =
      FXCollections.observableList (orderList);
    ListView<String> order = new ListView<String> (orderOvList);

    orderOvList.add ("abc");
    orderOvList.add ("def");
    orderOvList.add ("ghi");
    orderOvList.add ("jkl");

    VBox orderBoxPane = new VBox (6);
    order.getSelectionModel().selectedItemProperty().addListener (
      ov -> {
        int i = order.getSelectionModel ().getSelectedIndex ();

        if (orderOvList.size () >= 0) {
          System.out.println (i);
          orderOvList.remove (i, i + 1);
        }
      });
    orderBoxPane.getChildren ().add (order);

    Scene scene = new Scene (orderBoxPane);
    stage.setTitle ("TestListView");
    stage.setScene (scene);
    stage.show ();
  }
}

共有1个答案

宋子辰
2023-03-14

一旦用户选择删除所选项目,想要编写代码似乎是一种奇怪的用户体验。我不太确定是什么导致了您看到的异常,但您在侦听器中执行的代码确实会更改所选的值,从而在选择模型上引发新的更改事件。(我本以为是StackOverflowException而不是UnsupportedOperationException。我猜对选择模型中所选项目列表的“嵌套”更改会导致尝试更改不可修改的列表。)

如果这真的是您想要的行为,我会更多地从鼠标按下动作的角度来考虑——当用户单击该项时,将其从列表中删除。您可以通过创建单元格工厂并在所创建的单元格中注册鼠标侦听器来完成此操作:

order.setCellFactory(lv -> {
    ListCell<String> cell = new ListCell<String>() {
        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            setText(item);
        }
    };
    cell.setOnMouseClicked(event -> {
        String item = cell.getItem();
        if (item != null) {
            orderOvList.remove(item);

            // ensure nothing selected after removal:
            order.getSelectionModel().clearSelection();
        }
    });
    return cell ;
});
 类似资料:
  • 当我更改ListViewAdapter时,我的项目将无法从ListView中清除,并且我有一些空白条目。 她是我的密码:

  • 我正在用C#WPF做一个项目,它包含在一个客户机管理中,在那里我添加了新的客户机,在一个txt文档中有save,我有一个listview,在那里我可以看到所有添加的客户机,但现在我想实现一个delete按钮,在那里我从listview中选择一个客户机,并可以删除它。如果我现在做的正确,如果有人能帮我…,…谢谢。

  • 我正在使用ListView。向ListView添加新项很容易,但如何删除? 我通过以下方式构建ListView: Listcell Y的一个实例在setGraphics中设置了一个标签。要从我的观察列表中删除与之关联的字符串,我添加了一个MouseEvent处理程序: 虽然这段代码通过从ObservableList中删除每个单击的项目来工作,但listView的行为很奇怪。每次单击标签时,它都会成

  • 我的代码有点纠结。我已经搜索并尝试了许多方法。我的目标是删除Firebase之前提供给我的应用程序的条目,Firebase数据来自嵌入式设备。我想替换android应用程序中的值。 Firebase工作正常,应用程序将显示Firebase提供的新值,但不会删除以前的条目。 我还有很多事情要做,但想在继续前进之前解决基础问题。 因此,OnChildChanged基本上会显示新的firebase条目,

  • 我有一个嵌套的列表框(主对象列表中的对象集合),它需要删除基础项。 删除项时,我可以重置主列表的itemssource,但主列表将有大量项,每次从其基础集合中移除项时,主滚动条也将重置,这使得用户愿意以非常痛苦的方式杀死我。 我的问题:如何找到项的容器,单击了哪个按钮,如何找到项本身,以便杀死@&!$*&#$@(诅咒拟声词)? 以下是列表的XAML示例: 我的应该怎么样?

  • 我有一个假设,它有8个项目A-H,现在我想从中删除存储在int数组中的1,3,5位置项目。我该怎么做。 我正试着和你一起做这件事 但在数组的第一个被删除的项被更改之后,在下一次迭代中它删除了错误的元素或给出异常。