Javafx Listview 添加和编辑元素

2024-02-18

我想直接向列表视图添加和编辑元素:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafx_test;

import java.util.Observable;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.cell.TextFieldListCell;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.StringConverter;

/**
 *
 * @author karim
 */
public class Javafx_test extends Application {

    @Override
    public void start(Stage primaryStage) {
        ObservableList<String> items = FXCollections.observableArrayList("test1", "test2");
        ListView<String> list = new ListView<>(items);

        list.setEditable(true);
        list.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {

            @Override
            public ListCell<String> call(ListView<String> param) {
                return new TextFieldListCell<>(new StringConverter<String>() {

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

                    @Override
                    public String fromString(String string) {
                        return string;
                    }
                });
            }
        });

        Button btn = new Button();
        btn.setText("Add String");
        btn.setOnAction((ActionEvent event) -> {
            String c = new String("test");
            list.getItems().add(list.getItems().size(), c);
            list.scrollTo(c);
            list.edit(list.getItems().size() - 1);
        });

        VBox root = new VBox(list, btn);

        Scene scene = new Scene(root);

        primaryStage.setTitle("test!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

一切似乎都是正确的,但不起作用,它喜欢尝试修改第一个项目而不是最后一个索引中新添加的项目,我不知道为什么


这是一个错误。

焦点和编辑之间似乎存在一些真正可怕的相互作用。基本问题似乎是当列表单元格失去焦点时,它会取消任何编辑。我认为通过单击按钮,您会导致焦点转移到该按钮,然后在下一个渲染脉冲时,列表单元格会发现它失去了焦点并取消编辑。我无法完全解释为什么列表中的第一项似乎进入编辑状态,但我怀疑这是由于与列表的进一步交互所致focusModel,它管理单个项目的焦点。

对于真正丑陋的黑客,使用AnimationTimer延迟呼叫ListView.edit(...)通过额外的渲染帧。 (如果您不熟悉它,AnimationTimer http://docs.oracle.com/javase/8/javafx/api/javafx/animation/AnimationTimer.html定义了一个handle(...)在每个渲染脉冲上调用一次的方法;这里我只计算一帧,然后调用编辑,并停止计时器。)

    btn.setOnAction((ActionEvent event) -> {
        String c = "test"+(list.getItems().size()+1);
        list.getItems().add(list.getItems().size(), c);
        list.scrollTo(list.getItems().size() - 1);
        // list.edit(list.getItems().size() - 1);

        new AnimationTimer() {

            int frameCount = 0 ;

            @Override
            public void handle(long now) {
                frameCount++ ;
                if (frameCount > 1) {        
                    list.edit(list.getItems().size() - 1);
                    stop();
                }
            }

        }.start();
    });

Calling scrollTo(...)使用索引而不是项目似乎也更强大(特别是当您其中的项目彼此相等时:)。)

也许其他人可以想出一些更干净的东西......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javafx Listview 添加和编辑元素 的相关文章

随机推荐

  • Excel 图表不应有尾随的空单元格占用轴上的空间

    想要在一系列数据上绘制图表 其长度可以根据用户输入而改变 因此 范围末尾的空单元格不应出现在图表上 并且轴根本不应具有这些值 Detail 复利计算器 用户可以进入投资期 如果图表正确显示 10 年 并且用户将期间更改为 5 年 那么图表应
  • 带有外键字段列表的 Django 表单

    我有以下模型 我正在尝试为其创建表单 class Letter models Model title models CharField max length 100 publish date models TimeField class L
  • J2Mod 基本主从问题

    我正在尝试使用 Modbus 从站和主站j2mod 它的版本是 1 0 6 所以与另一个程序兼容 对于我在网上找到的代码 我确实有一些一般性问题 我几乎没有找到任何有用的文档 所以我有点无能为力 TCP主控器 this addr InetA
  • iOS Swift:在收件箱电子邮件中打开邮件应用程序

    晚上 我试图通过按钮操作打开邮件应用程序的收件箱邮件 在网络上 我看到可以打开电子邮件编辑器对象的电子邮件应用程序 但我并不想创建新电子邮件 我只是希望用户检查电子邮件 有小费吗 我使用以下代码解决了 let mailURL URL str
  • 如何在自引用关联中强制执行外键约束?

    假设最简单的例子 var Person sequelize define Person name Sequelize STRING Person hasMany Person as Children foreignKeyConstraint
  • WPF 中 DataTemplate 中的 x:Key、x:Name 和 x:UID 有什么区别?

    我正在尝试在 WPF 中创建动态选项卡 并且正在尝试编写一个仅适用于某些选项卡项目的内容模板 我希望能够为内容模板创建一个标识符 以便我可以在后面的代码中引用它 这样我就可以有选择地将它应用于单个 TabControl 中的某些选项卡 但是
  • 如何准确合并 firebase firestore 中的多个流

    在您说这是一个重复的问题或者我应该使用嵌套流构建器之前 请听我说完 我正在设计一个社交媒体类型的应用程序 我希望用户在他们关注的人在 我的关注者帖子 集合中发布内容时收到更新 在应用程序中 应用程序将检查 firebase rtdb 中当前
  • 打印大量格式化数据时如何避免Broken Pipe错误?

    我正在尝试打印我的格式的元组列表stdout 为此 我使用字符串格式 http docs python org 2 library string html string formatting方法 一切工作正常 但是当我通过管道输出看到 第一
  • 如何使用 PhoneGap Javascript 读取 Android 中的文件

    如何使用 PhoneGap 和 Javascript 读取 Android 中的文件 我尝试了不同站点上给出的几个代码片段 但未能成功 其实我是一个初学者 对Phonegap知之甚少 我也尝试过文件阅读器 http docs phonega
  • 如何捕获控制器内变量中的default.phtml

    我有一个简单的问题 如何将 Project application layouts scripts default phtml 中的 default phtml 的内容渲染为变量 以便我可以拥有它的 html 在索引控制器中 使用一个操作和
  • 行为测试运行器在 Jenkins 上没有彩色输出

    我在 EC2 实例上的 Ubuntu 服务器 14 04 上设置了 jenkins 我有一些使用执行的硒测试behave http pythonhosted org behave 作为测试运行者 在 Jenkins 上我也安装了该插件安西色
  • 如何使用 asp.net 为 Web 应用程序创建补丁文件

    我想了解 VS 2010 中是否有可用的规定或使用某些第三方工具来为 Web 应用程序创建补丁 热修复 我不想发布副本并替换文件 dll 方法 而是使用 Web 设置来安装应用程序 以便仅更新原始应用程序中更改的文件并将其安装在虚拟目录中
  • C++ 链表行为

    我有一些 C 代码 其中有两个链接列表 比如 A 和 B A 被插入到 B 的特定位置 并且 A 仍然有元素 如何使用 C STL 有效地模拟相同的行为 如果我尝试拼接 它会使第二个空 谢谢 戈库尔 尝试插入 B insert positi
  • 实体框架获取 sql 连接

    鉴于在实体框架中显式关闭连接 https stackoverflow com questions 5285877 closing connections explicitly in entity framework and http msd
  • Date.toLocaleDateString() 不适用于 Nodejs v10.14.2

    由于我将节点服务器更新为最新稳定版本 因此日期字符串不再像以前那样显示 SERVER 使用 Nodejs v10 14 2 在 centOS 7 UNIX 上运行节点 LAPTOP 使用 Nodejs v8 5 0 在 macOS 10 1
  • Python在父类中使用派生类的方法?

    我可以强制父类调用派生类的函数版本吗 class Base object attr1 attr2 def virtual self pass doesn t do anything in the parent class def func
  • 如何在 JavaScript 中检测滑动? [复制]

    这个问题在这里已经有答案了 我想用js制作简单的游戏 但为此 我希望用户通过在屏幕上向上 向下 向右 向左滑动手指 光标来进行游戏 有一个简单的方法可以做到吗 你可以试试这个 非常简单易懂 var container document qu
  • 如何知道带有 TCP Fast Open 的 sendto() 是否实际使用了 Fast Open?

    我在Linux 3 15机器上编写了一个TCP客户端 它能够使用TCP Fast Open status sendto sd const void data data len MSG FASTOPEN const struct sockad
  • 将日期添加到 SQL 数据库备份文件名

    我正在使用下面的内容从 SQL 作业备份数据库 有人可以告诉我如何将当前日期添加到输出文件名中吗 最好采用 YYYYMMDD 格式 BACKUP DATABASE myDB TO DISK N myPath myDB bak WITH NO
  • Javafx Listview 添加和编辑元素

    我想直接向列表视图添加和编辑元素 To change this license header choose License Headers in Project Properties To change this template file