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

JavaFX ListView-将项目添加到选择中

阎博易
2023-03-14

我想创建一个列表视图,只能通过鼠标进行多项选择(不按住ctrl或Shift)

单击某个项目应选择此项目。如果选择了其他项目,请将此新项目添加到所选列表中。以前选中此项目时,请取消选中它。

我不想保留选定的项目。selectionModel上有一个名为“selectIndices()”的方法,它只接受一个或多个整数,而不是整数列表。。。

 DataTypesLV.getSelectionModel().selectedItemProperty().addListener(new ChangeListener <String>() {
        @Override
        public void changed(ObservableValue<? extends String> arg0, String oldVal, String newVal) {
            int idx = DataTypesLV.getItems().indexOf(newVal);
            if(newVal.equals(oldVal)){
                DataTypesLV.getSelectionModel().getSelectedIndices().remove(idx);
              } else {
                  DataTypesLV.getSelectionModel().getSelectedIndices().add(idx);
              }
        }
    });

有男孩有主意吗?

共有1个答案

董建德
2023-03-14

在JavaFX中更改控件的行为通常很困难。要做到这一点,“正确”的方法是创建一个新的皮肤实现,这涉及到很多工作,而且由于行为类目前不是公共API,因此API将涉及大量“重新设计轮子”。一个合理的破解方法是在默认皮肤类接收到鼠标事件之前拦截它们,并相应地修改选择。您可以使用事件过滤器来执行此操作,使用事件以防止皮肤接收它:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

public class ListViewModifiedSelection extends Application {

    @Override
    public void start(Stage primaryStage) {
        ListView<String> listView = new ListView<>();
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

        for (int i = 1 ; i <= 25 ; i++) {
            listView.getItems().add("Item "+i);
        }

        listView.setCellFactory(lv -> {
            ListCell<String> cell = new ListCell<String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    setText(empty ? null : item);
                }
            };

            cell.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
                if (cell.isEmpty()) {
                    return ;
                }

                int index = cell.getIndex() ;
                if (listView.getSelectionModel().getSelectedIndices().contains(index)) {
                    listView.getSelectionModel().clearSelection(index);
                } else {
                    listView.getSelectionModel().select(index);
                }

                listView.requestFocus();

                e.consume();
            });

            return cell ;
        });

        primaryStage.setScene(new Scene(listView, 250, 450));
        primaryStage.show();
    }

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

防止皮肤接收鼠标事件是一种黑客行为,这样做会有破坏现有功能的风险。另一个更健壮的解决方案可能是使用列表单元格中的复选框或类似的东西来管理您自己的“选择”功能。

 类似资料:
  • 问题内容: 这是我第一次接触android。我正在尝试向我的ListView添加项目。我使用“选项卡”,查看添加项目的唯一方法是更改​​选项卡,然后返回到第一个选项卡。 我到处搜寻,而且一直都找到 但对我不起作用。 正如我所说,我已经使用固定标签+滑动创建了项目。我只希望有一个列表视图,哪些行具有一个EditText,一个Spinner和一个Button。在用于选项卡的Fragment的底部,我有

  • 本文向大家介绍将Bootstrap添加到React.js项目,包括了将Bootstrap添加到React.js项目的使用技巧和注意事项,需要的朋友参考一下 有多种方法可以在react项目中添加引导程序。 使用引导CDN 安装引导程序依赖项 使用React Bootstrap软件包 使用引导CDN 这是添加引导程序的最简单方法。与其他CDN一样,我们可以在react项目的index.html中添加引

  • 问题内容: 我有一堆选择列表,我正在尝试向它们添加“无”和标题选项。代码如下所示: 目前,我无法将它们添加到数据中,因此我试图找到一种方法来使其正常工作。当我第一次加载它们时,“ none”选项不存在。标题在那里并且可以按预期工作,但是似乎我无法在此选择列表中添加两个空白条目。 最简单的方法是将“ none”选项添加到数据中,但这对我来说是不可能的。有没有实现我想要的正确方法? 问题答案: 没错,

  • 问题内容: 我想使用css在html中的选择选项之间添加某种空间(填充,边距或其他)。我已经尝试使用类似的东西: 但是没有用。我已经读过,这是可以做到的,但在IE中不起作用。无论如何,即使它无法在IE中运行,我也希望它可以在其他浏览器中运行。 PS:当前正在使用Chrome 问题答案: 选择选项的样式非常有限,因为要在操作系统中的所有应用程序之间保持一致性和一致性,因此浏览器应限制某些基本元素的样

  • 我一直在尝试更改选择选项的样式。例如添加颜色和背景似乎可以使用下面的代码。但它不起作用,例如边距:20px,边框或任何东西。一直在尝试不同的东西和JS和JQueary,但我不能让它工作,所有的提示都是欢迎的!:) null null

  • 问题内容: 我收到此错误 %gradle build [ant:javac] Hello.java:2:错误:包javax.persistence不存在Hello.java:2:导入javax.persistence。*; 我应该添加到gradle.build包括什么 /opt/glassfish3/glassfish/modules/javax.persistence.jar 谢谢 问题答案: