热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaFX8,带Checkboxes的ListView

如何解决《JavaFX8,带Checkboxes的ListView》经验,为你挑选了1个好方法。

我想创建一个简单的ListView.我已经想通了我可以使用方法setCellFactory()但我不明白如何正确使用它们.到目前为止,我有:

myListView.setCellFactory(CheckBoxListCell.forListView(property));

由于"属性"被称为回调 - 我认为Callback与双向边界有关.所以我创建了一个

property = new CallBack>();

我的编译器告诉我是否创建了一个新的Callback,我需要覆盖方法调用.

在这里,我被卡住了.该怎么办这个方法调用?我可以实现它,但我应该返回什么,或者使用它?我想在任何listItem上单击我的复选框,并在控制台中显示"hi".



1> James_D..:

如果你有a ListView,则a中的每个项ListView都是a String,而CheckBoxListCell.forListView(...)方法需要a Callback>.

在Java 8之前的思维方式中,a Callback>是定义单个方法的接口,

public ObservableValue call(String s) ;

因此,您需要一些实现该接口的东西,并传入该类型的对象.

该文档还告诉您如何使用该回调:

给定类型为T的对象(从ListView.items列表中取出的值)的回调函数将返回一个ObservableValue,表示是否选择了给定项.此ObservableValue将双向绑定(意味着单元格中的CheckBox将根据用户交互设置/取消设置此属性,并且CheckBox将反映ObservableValue的状态,如果它在外部更改).

(因为你有一个ListView,这里TString.)因此,对于列表视图中的每个元素(每个元素是a String),回调用于确定ObservableValue哪个是双向绑定到复选框的状态.即,如果选中该复选框,则该属性设置为true,如果未选中,则将其设置为false.相反,如果属性设置为true(或false)以编程方式,则选中(或取消选中)复选框.

这里的典型用例是,该项中的项目类型ListView具有BooleanProperty其状态的一部分.因此,您通常会使用某种自定义类来表示您的数据,如下内容Item类:

import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.cell.CheckBoxListCell;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Callback;

public class ListViewWithCheckBox extends Application {

    @Override
    public void start(Stage primaryStage) {
        ListView listView = new ListView<>();
        for (int i=1; i<=20; i++) {
            Item item = new Item("Item "+i, false);

            // observe item's on property and display message if it changes:
            item.onProperty().addListener((obs, wasOn, isNowOn) -> {
                System.out.println(item.getName() + " changed on state from "+wasOn+" to "+isNowOn);
            });

            listView.getItems().add(item);
        }

        listView.setCellFactory(CheckBoxListCell.forListView(new Callback>() {
            @Override
            public ObservableValue call(Item item) {
                return item.onProperty();
            }
        }));

        BorderPane root = new BorderPane(listView);
        Scene scene = new Scene(root, 250, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static class Item {
        private final StringProperty name = new SimpleStringProperty();
        private final BooleanProperty on = new SimpleBooleanProperty();

        public Item(String name, boolean on) {
            setName(name);
            setOn(on);
        }

        public final StringProperty nameProperty() {
            return this.name;
        }

        public final String getName() {
            return this.nameProperty().get();
        }

        public final void setName(final String name) {
            this.nameProperty().set(name);
        }

        public final BooleanProperty onProperty() {
            return this.on;
        }

        public final boolean isOn() {
            return this.onProperty().get();
        }

        public final void setOn(final boolean on) {
            this.onProperty().set(on);
        }

        @Override
        public String toString() {
            return getName();
        }

    }

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

如果你真的有一个ListView,那么通过点击复选框就可以确定你所设置的属性是什么.但是没有什么可以阻止你在回调中创建一个只是为了绑定到复选框的选中状态:

import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.cell.CheckBoxListCell;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Callback;

public class ListViewWithStringAndCheckBox extends Application {

    @Override
    public void start(Stage primaryStage) {
        ListView listView = new ListView<>();
        for (int i = 1; i <= 20 ; i++) {
            String item = "Item "+i ;
            listView.getItems().add(item);
        }

        listView.setCellFactory(CheckBoxListCell.forListView(new Callback>() {
            @Override
            public ObservableValue call(String item) {
                BooleanProperty observable = new SimpleBooleanProperty();
                observable.addListener((obs, wasSelected, isNowSelected) -> 
                    System.out.println("Check box for "+item+" changed from "+wasSelected+" to "+isNowSelected)
                );
                return observable ;
            }
        }));

        BorderPane root = new BorderPane(listView);
        Scene scene = new Scene(root, 250, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

请注意,在这种情况下,BooleanProperty可能会经常创建和丢弃s.这在实践中可能不是问题,但它确实意味着具有专用模型类的第一个版本可能表现更好.

在Java 8中,您可以简化代码.因为Callback接口只有一个抽象方法(使其成为功能接口),所以你可以将a Callback>视为一个接受Item并生成一个的函数ObservableValue.因此,第一个示例中的单元工厂可以使用lambda表达式编写:

    listView.setCellFactory(CheckBoxListCell.forListView(item -> item.onProperty()));

或者,更简洁地使用方法参考:

    listView.setCellFactory(CheckBoxListCell.forListView(Item::onProperty));


推荐阅读
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • 具有顺序标题的ListView ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • Spring Security基础配置详解
    本文详细介绍了Spring Security的基础配置方法,包括如何搭建Maven多模块工程以及具体的安全配置步骤,帮助开发者更好地理解和应用这一强大的安全框架。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文是对《敏捷软件开发:原则、模式与实践》一书的深度解析,书中不仅探讨了敏捷方法的核心理念及其应用,还详细介绍了面向对象设计的原则、设计模式的应用技巧及UML的有效使用。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 如何在Visual C#中使用ListView控件来展示数据记录
    如果要你在程序中显示数据库中的数据记录,你首先想用的显示工具肯定是DataGrid。当然用DataGrid显示数据记录是一种既常用又简单的方法。但是在程序控制方面,它却无法那么随心所欲。本文就是介绍另 ... [详细]
  • 我在Winform上有一个ListView,可以将文件拖放到该列表上。这些文件随后由我的 ... [详细]
  • 如题在ListView每个item的布局里面都有一个webView来加载内容因为内容含有文字和图片,但是很加载很慢,求大神帮忙解决 ... [详细]
  • 如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity集成ListActivity来实现,ListActivity的子类无须调用setContentView方法来显示某个 ... [详细]
author-avatar
V铿锵花木兰V
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有