gpt4 book ai didi

Javafx Listview 添加和编辑元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:43:25 34 4
gpt4 key购买 nike

我想直接向 ListView 添加和编辑元素:

/*
* 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 进行了一些进一步的交互,后者管理着各个项目的焦点。

对于真正丑陋的 hack,使用 AnimationTimer 通过额外的渲染帧延迟对 ListView.edit(...) 的调用。 (如果你不熟悉它,AnimationTimer 定义了一个 handle(...) 方法,在每个渲染脉冲上调用一次;这里我只计算一帧然后调用 edit , 并停止计时器。)

    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();
});

用索引而不是项目调用 scrollTo(...) 似乎也更健壮(特别是当你有彼此相等的项目时:)。)

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

关于Javafx Listview 添加和编辑元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32700005/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com