javafx - 将按钮更优雅地放入表格列中

标签 javafx javafx-2

这是一个 SSCCE,演示如何将 Button 放入 TableView 列中。它有效,但几乎没有令人不快的行为。当使用滚动条通过鼠标向下滚动表格行时,新呈现的按钮不会立即显示。仅当释放并移动鼠标时才会显示它们。我认为还有另一种更优雅的方式来显示表列中的按钮,并在单击时执行一些与所选行相关的操作。有什么建议吗?

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.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.StackPaneBuilder;
import javafx.stage.Stage;
import javafx.util.Callback;

public class ButtonDemo extends Application {

    private TableView<Person> personTable = new TableView<>();
    private TableColumn<Person, String> nameCol = new TableColumn<>("name");
    private TableColumn<Person, Double> salaryCol = new TableColumn<>("salary");
    private TableColumn<Person, String> actionCol = new TableColumn<>("action");

    @Override
    public void start(Stage primaryStage) {
        ObservableList<Person> data = FXCollections.observableArrayList();
        for (int i = 0; i < 40; i++) {
            data.add(new Person("person_" + i, i * 100d));
        }

        nameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name"));
        salaryCol.setCellValueFactory(new PropertyValueFactory<Person, Double>("salary"));
        actionCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name")); // "name" here is for just to render the column

        Callback<TableColumn<Person, String>, TableCell<Person, String>> printColumnCellFactory = //
                new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {

            @Override
            public TableCell call(final TableColumn param) {
                final TableCell cell = new TableCell() {

                    @Override
                    public void updateItem(Object item, boolean empty) {
                        super.updateItem(item, empty);
                        if (empty) {
                            setText(null);
                            setGraphic(null);
                        } else {
                            final Button btnPrint = new Button("print name");
                            btnPrint.setOnAction(new EventHandler<ActionEvent>() {

                                @Override
                                public void handle(ActionEvent event) {
                                    param.getTableView().getSelectionModel().select(getIndex());
                                    Person item = personTable.getSelectionModel().getSelectedItem();
                                    if (item != null) {
                                        System.out.println(item.getName());
                                    }
                                }
                            });
                            setGraphic(btnPrint);
                            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                        }
                    }
                };
                return cell;
            }
        };
        actionCol.setCellFactory(printColumnCellFactory);

        personTable.setItems(data);
        personTable.getColumns().addAll(nameCol, salaryCol, actionCol);
        StackPane root = StackPaneBuilder.create().children(personTable).build();
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    public class Person {

        private String name;
        private Double salary;

        public Person(String name, Double salary) {
            this.name = name;
            this.salary = salary;
        }

        public String getName() {
            return name;
        }

        public Double getSalary() {
            return salary;
        }
    }

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

最佳答案

升级到版本 2.1 解决了该问题。

关于javafx - 将按钮更优雅地放入表格列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10044779/

相关文章:

logging - JavaFx 日志记录示例

JavaFX ChoiceBox 上下文菜单位置

JavaFx:如何实现动态 Gridpane?

java - 如何获取TableView中特定点的行号?

javafx - 输入键事件在 Javafx 对话框中不起作用?

colors - 如何从 JavaFX ColorPicker 颜色获取十六进制网络字符串?

Linux 可执行文件使用 javafx-maven-plugin 失败

javafx-2 - 如何使用 javaFx 更新 TableView Row

java - 调用方法时出现问题(扫雷)

java - JavaFX 稍后运行不起作用