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

Javafx链接/将Treeview项绑定到ObservableList

蒋浩
2023-03-14

我试图找到一种简单的方法来链接下载类型的树视图到相同类型的可观察列表。

主控制器。JAVA

public class MainController {

    private ObservableList<Download> downloads = FXCollections.observableArrayList();
    @FXML private TreeView<Download> $TreeDownloads;

    @FXML
    public void initialize() {
        $TreeDownloads.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        $TreeDownloads.setNodeOrientation(NodeOrientation.LEFT_TO_RIGHT);
        $TreeDownloads.setShowRoot(false);

        downloads.addListener(new ListChangeListener<Download>() {
            @Override
            public void onChanged(Change<? extends Download> c) {
                if (c.wasAdded()) {
                    addDownloads(c.getAddedSubList());
                }
                if (c.wasRemoved()) {
                    //
                }
            }
        });
        downloads.add(new Download("3847"));
        downloads.add(new Download("3567"));
        downloads.add(new Download("2357"));
    }

    private void addDownloads(List<? extends Download> downloads) {
        downloads.forEach(download -> {
            TreeItem<Download> treeItem = new TreeItem<>(download);
            $TreeDownloads.getRoot().getChildren().add(treeItem);
            new Thread(download::start).start();
        });
    }

    private void removeDownloads(List<? extends Download> downloads) {
        // remove treeitems from the treeview that hold these downloads
    }
}

Download.java

public class Download {

    private DoubleProperty progress = new SimpleDoubleProperty(0D);
    private StringProperty id = new SimpleStringProperty("");

    public Download(String id) {
        this.id.set(id);
    }

    public void start() {
        while (progress.getValue() < 1) {
            try {
                Thread.sleep(1000);
                progress.add(0.1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }      

    @Override
    public String toString() {
        return id.getValue();
    }
}

如何实现按对象删除(下载)机制,是否有更简单的方法将observablelist的项绑定到treeview?

共有1个答案

袁耀
2023-03-14

仍然不能完全确定确切的问题是什么,所有这些都非常简单:

首先,您的列表更改监听器实现是不正确的,它必须在访问其状态之前推进子更改(您是否运行了发布的代码;)

downloads.addListener(new ListChangeListener<Download>() {
    @Override
    public void onChanged(Change<? extends Download> c) {
        // this while was missing
        while (c.next()) {
            if (c.wasAdded()) {
                addDownloads(c.getAddedSubList());
            }
            if (c.wasRemoved()) {
                // accessing the list of removed elements is .. plain standard api 
                removeDownloads(c.getRemoved());
            }

        }
    }
});

现在实现相应树项的移除:

private void removeDownloads(List<? extends Download> downloads) {
    // remove treeitems from the treeview that hold these downloads
    List<TreeItem<Download>> treeItemsToRemove = treeDownloads.getRoot().getChildren().stream()
            .filter(treeItem -> downloads.contains(treeItem.getValue()))
            .collect(Collectors.toList());
    treeDownloads.getRoot().getChildren().removeAll(treeItemsToRemove);
}

旁白:

  • java命名约定对成员使用小写字母:treeDownloads(不是$treeDownloads)
 类似资料:
  • 我在JavaFX应用程序中使用MVP。 资源: 控制器: 看法 在我的InfoStageView中,只需初始化我的标签和样式我的视图。 如何将我的超链接绑定到我的标签。我尝试了一些方法,但没有成功。我的StringProperty不可点击,但很容易绑定。 我的目标:我想打开带有链接的浏览器。

  • 我不希望GUI代码(即JavaFX类)出现在我的域对象中。 我需要编写一个适配器类来将我的域对象转换为JavaFX树吗?然后将侦听器添加到树中,并将更改映射回域对象?还是有更好的办法?

  • 我正在尝试这里提供的解决方案https://social.msdn.microsoft.com/forums/en-us/16a91381-0714-4ba1-aff0-7f3b6483b282/populate-a-treeview-from-xsd-file-in-wpf?forum=wpf只采用xs:element和xs:sequence节点,排除所有其他节点(xs:complextype>

  • 注意:我实际上不确定为什么这种情况首先需要监听器,因为我甚至不想经常监听,而是在调用方法时得到结果。

  • 我在将dsata绑定到tabl时遇到了一些麻烦;JavaFX中的E 我有我的模型controtor.java 公共课指挥{