JavaFX TableView 滚动

2024-01-11

我的 TableView 包含一些数字数据。当我说通过按钮编辑值时,它将单元格的背景更改为绿色。当没有足够的行使表可滚动时,这种方法很有效。一旦表格变得(或从一开始)可滚动,它就会开始表现得很奇怪。它会更改已编辑项目的背景,但它会更改在向下滚动之前不可见的项目的背景。但是,当我调试时,更改背景的代码仅被调用一次。我认为当可滚动破坏并重新创建单元格时,它必须对表格视图做一些事情,或者也许我误解了某些东西并且我做错了。

Example: I've edited second row. I've edited second row

And when I scrolled down just a little bit, this one had different background as well. (they both have it same time) This one got edited as well

代码: 型号类别:

public class Bid {

  private DoubleProperty value; 
  private BooleanProperty valueChanged;

  public Bid(double val) {
    value = new SimpleDoubleProperty();
    valueChanged = new SimpleBooleanProperty();
    setValue(val);
    value.addListener((observable, old, newVal) -> {
      System.out
          .println(observable.toString() + " changed value from " + old.doubleValue() + " to " + newVal.doubleValue());
      valueChanged.setValue(true);
    });
  }

  public double getValue() {
    return value.get();
  }

  public void setValue(double value) {
    this.value.set(value);
  }

  public DoubleProperty valueProperty() {
    return value;
  }

  public boolean isValueChanged() {
    return valueChanged.get();
  }

  public BooleanProperty valueChangedProperty() {
    return valueChanged;
  }

  public void setValueChanged(boolean valueChanged) {
    this.valueChanged.set(valueChanged);
  }

  @Override
  public String toString() {
    return "Bid{" +
        "value=" + value.getValue() +
        '}';
  }
}

我的单元格(当我第一次遇到这个问题时,我认为这是样式删除部分,但删除它没有帮助):

public class BidCell extends TextFieldTableCell<Bid, Double> {


  private BooleanProperty newExternalValue;

  public BidCell() {
    super(new StringConverter<Double>() { // converter used for conversion from/to string


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

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

    newExternalValue = new SimpleBooleanProperty();

    newExternalValue.addListener((observable, oldValue, newValue) ->
    {
      if (newValue) {
        String old = this.getStyle();
        this.setStyle("-fx-background-color: #99ff99");
        System.out.println("Color changed");
        Thread thread = new Thread(new StyleRemover(this, old, newExternalValue));
        thread.setDaemon(true);
        thread.start();
      }
    });
  }


  @Override
  public void updateItem(Double item, boolean empty) {
    super.updateItem(item, empty);
    if (getTableRow() != null) {
      if (getTableRow().getItem() != null) {
        if (item != null && !empty) {

          Bid b = getTableRow().getItem() instanceof Bid ? ((Bid) getTableRow().getItem()) : null;
          if (b != null) {
            if (b.isValueChanged()) {
              System.out.println("Setting newExternalValue to true for cell" + this);
              newExternalValue.setValue(true);
              b.setValueChanged(false);
            }
          }
        }
      }
    }
  }

  class StyleRemover implements Runnable {

    private BidCell cell;
    private String oldStyle;
    BooleanProperty newExternalValue;

    public StyleRemover(BidCell cell, String oldStyle, BooleanProperty newExternalValue) {
      this.cell = cell;
      this.oldStyle = oldStyle;
      this.newExternalValue = newExternalValue;
    }

    @Override
    public void run() {
      try {
        Thread.sleep(3000);
        cell.setStyle(oldStyle);
        newExternalValue.setValue(false);
      }
      catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

Grid:

public class Grid {

  private TableView<Bid> view;
  private TableColumn<Bid, Double> bidStringTableColumn;
  ObservableList<Bid> bids;

  public TableView<Bid> getView() {
    return view;
  }

  public Grid() {
    view = new TableView<>(); // create tableview

    bids = FXCollections.observableArrayList(); // fill data for it
    bids.addListener((ListChangeListener<Bid>) c -> {
      c.next();
      if (c.wasAdded()) {
        System.out.println("added new value " + c.getAddedSubList().get(0).toString());
      }
    });
    for (double i = 0; i < 10; i += 0.45) {
      Bid e = new Bid(i);

      bids.add(e);
    }
    view.setItems(bids);
    view.setEditable(true);

    bidStringTableColumn = new TableColumn<>("Bid"); // create column with header text "Bid"
    bidStringTableColumn.setCellValueFactory(param -> param.getValue().valueProperty()
        .asObject()); // value factory for column, determines which property will fill column
    bidStringTableColumn.setCellFactory(e -> new BidCell());

    view.getColumns().add(bidStringTableColumn); // add column to table
  }


  public ObservableList<Bid> getBids() {
    return bids;
  }

编辑:这不仅仅是样式问题,我发现如果我开始编辑该单元格并向下滚动,该单元格也处于编辑模式。一种可能的解决方案可能只是以某种方式禁用单元格破坏和重新创建滚动,但是我还没有找到一种方法来做到这一点,我认为这是不可能的。 (我知道它是为了性能而存在,但性能对我们来说并不重要,并且不会有数百万行,最多大约 100 行)


我花了一些时间,但我解决了。 最重要的是这句话

“tableview 和 listview 单元格被重用来渲染不同的行 源列表的数据。”

这基本上意味着您无法将样式设置为单元格,因为当您滚动时它会用于不同的数据。那是我的错误。

最简单的解决方案是将样式存储在模型( Bid )类中,然后在单元格中从那里获取它。 在单元格中我做了方法

 public void checkStyle() {
    if (getTableRow().getItem() != null) {
      Bid bid = (Bid) getTableRow().getItem();
      this.setDisabled(bid.isDisabled());
      String style = bid.getStyle();
      if (!this.getStyle().equals(style) && getItem() == bid.getValue()) 
          this.setStyle(style);
    }

我打电话进来updateItem and updateIndex并在

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

JavaFX TableView 滚动 的相关文章

  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • 尝试在没有 GatewayIntent 的情况下访问消息内容

    我希望每当我写一条打招呼的消息时 机器人都会在控制台中响应一条消息 但它只是给我一个错误 JDA MainWS ReadThread WARN JDA Attempting to access message content without
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新

随机推荐

  • 如何更改BitBucket中的主分支?

    我在 bitbucket 上有一个有两个分支的仓库 第一个分支是具有虚假内容的 master 分支 然后我有另一个名为 trunk 的具有正确内容的分支 我想将主分支更改为主干 实际上是master 我发现在 bitbucket web 上
  • Hilt ClassCastException:ViewComponentManager$FragmentContextWrapper 无法转换为 AppCompatActivity

    我有这段代码 当单击适配器中的 viewHolder 项目时 我会显示对话框片段 SpecialRequestNotFoundBottomSheetDialog requestItem specialRequestEntity id let
  • cURL 和重定向 - 返回多个标头?

    我正在编写一个专门的 PHP 代理 并被 cURL 的一个功能所困扰 如果设置了以下值 curl setopt ch CURLOPT FOLLOWLOCATION true curl setopt ch CURLOPT HEADER tru
  • x-editable - 调整输入字段的宽度

    如何调整弹出窗口的输入宽度 似乎没有任何选项 http vitalets github io x editable docs html text http vitalets github io x editable docs html te
  • 使用 CDI @Inject 注入 Spring bean

    我试图将 Spring 上下文中定义的 bean 注入到 CDI 托管组件中 但没有成功 bean 不会被注入 而是在每次执行注入时创建一个新实例 我的环境是带有 JBoss Weld 的 Tomcat 7 Spring Applicati
  • 导入错误:DLL 加载失败:%1 不是有效的 Win32 应用程序。但DLL在那里

    我的情况非常类似于错误 ImportError DLL 加载失败 1 不是有效的 Win32 应用程序 https stackoverflow com questions 14629818 importerror dll load fail
  • 为什么 gt() 和 lt() 只是 jQuery 选择器,而 eq() 也是一个方法?

    在 jQuery 中 为什么只eq 既是选择器 又是方法 而是gt and lt 只是选择器 对象不支持该属性或方法 jQuery 语法的这种不一致 差距是否有我不明白的特殊原因 eq click function alert li eq
  • 如何在 XMLSlurper 语句中使用变量引用

    我正在使用带有 XMLSlurper 的 groovy 来验证soap ui pro 中的 Web 服务响应 我有以下有效代码 expectedResponse 是存储预期错误代码的 var 例如 E0023 if expectedResp
  • Xcode 数据模型编辑器未出现

    我正在使用 Xcode 4 2 并且正在尝试使用 Core Data 单击 xcdatamodeld 文件后 我看到一个奇怪的视图 而不是数据模型编辑器视图 我已经重新安装了 Xcode 4 2 甚至从头开始创建了一个启用 Core Dat
  • 如何删除 MASM 中未使用的 .CONST 数据?

    我在 MASM 中使用宏生成大约 2000 个函数 为每个函数定义一个字符串 但在任何给定程序中我只使用大约 30 个函数 无法提前预测我将使用哪些 我根据需要使用它们 有什么方法可以告诉链接器 删除 我最终没有使用的字符串吗 他们将二进制
  • 如何使用图像类型按钮删除 HTML 表单中提交时的 x 和 y?

    我在我的应用程序中创建了一个表单 如下所示
  • 免费矢量图标[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于基本桌面程序工具栏按钮 如后退 前进 打印 保存等 的免费矢量图标 例如 适合在使用 WPF
  • 在 JSON 键或值中使用双引号

    我想使用双引号 在我的 JSON 中 但它不起作用 这是我的 JSON I 1 Vehicle Con trol M D2 VM 3300 00 VSD 324 04 G 1 Ve hicle Control M N 1 http json
  • Java 日期解析“上午”和“下午”

    使用 SimpleDateFormat 如何解析字符串 2013 05 23T09 18 07 下午 380 0000 我所有的 SimpleDateFormat 字符串都在 p m part 提前致谢 编辑 我们无法控制传入的格式 我试过
  • 如何要求 Neo4j 考虑周期

    Neo4j 似乎故意省略了循环 因此查询如下 MATCH n1 R gt n2 lt R n1 RETURN n1 n2 除非存在两个类型关系 否则始终不返回任何内容R之间n1 and n2 这绝对是可能的 而且是一个糟糕的黑客 但我有一个
  • Oracle:从字符串中删除前 4 个字符

    所以我想从oracle中的字符串中删除前4个字符 这些角色每次都可能不同 就我而言 我需要去掉 IBAN 的前 4 个字符并将它们放在字符串的末尾 我得到了将它们放在字符串末尾的部分 但我无法删除前 4 个字符 我在互联网上找到的每个解决方
  • 我怎样才能安全地执行Python的子集?

    我需要在数据库中存储基本功能的源代码 并允许通过管理界面对其进行修改 这段代码将接受几个数字和字符串作为参数 并返回一个数字或None 我知道 eval 是邪恶的 所以我需要实现一种安全的方法来从基于 python 的网络应用程序中执行 p
  • Django 管理员,无法分组依据:异常值:“dict”对象没有属性“_meta”

    我有一个映射到 postgresql 视图的模型 class AppModel models Model nbr models BigIntegerField blank True null True region models Forei
  • 是否可以从 heroku 检索您的源代码?

    将源代码上传到 Heroku 后 如果需要 例如本地磁盘出现故障 是否可以从那里下载它 由于 Heroku 与 git 的集成 我认为这至少在理论上是可能的 只要去https dashboard heroku com apps YOUR A
  • JavaFX TableView 滚动

    我的 TableView 包含一些数字数据 当我说通过按钮编辑值时 它将单元格的背景更改为绿色 当没有足够的行使表可滚动时 这种方法很有效 一旦表格变得 或从一开始 可滚动 它就会开始表现得很奇怪 它会更改已编辑项目的背景 但它会更改在向下