代码之家  ›  专栏  ›  技术社区  ›  Saltydog693

更改TableView JavaFX中的值列标题

  •  0
  • Saltydog693  · 技术社区  · 8 年前

    我试图在JavaFX中创建一个TableView,用户可以通过双击表头来更改列头的值。 应出现一个文本框,在填写新值后,应将该值分配给列标题。

    Example of output below

    1 回复  |  直到 8 年前
        1
  •  1
  •   kleopatra Aji kattacherry    8 年前

    与詹姆斯评论中概述的方法稍有不同:

    • 在表中注册鼠标处理程序
    • 双击时(这会干扰排序…但这是另一个问题),找到表示tableColumn的TableColumnHeader(如果有)
    • 创建并连接一个TextField,并将其设置为列的图形(正如James建议的那样)

    请注意,TableColumnHeader的包取决于版本,对于fx8,它被视为驻留在com中的内部api。xx。皮肤,对于fx9,它在javafx中是公开的。xx。皮

    示例:

    public class TableHeaderWithInput extends Application {
        TableView<Locale> table;
    
        protected void installHeaderHandler(Observable s) {
            table.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
                if (e.isPrimaryButtonDown() &&  e.getClickCount() > 1) {
                    EventTarget target = e.getTarget();
                    TableColumnBase<?, ?> column = null;
                    while (target instanceof Node) {
                        target = ((Node) target).getParent();
                        // beware: package of TableColumnHeader is version specific
                        if (target instanceof TableColumnHeader) {
                            column = ((TableColumnHeader) target).getTableColumn();
                            if (column != null) break;
                        }
                    }
                    if (column != null) {
                        TableColumnBase<?,?> tableColumn = column;
                        TextField textField = new TextField(column.getText());
                        textField.setMaxWidth(column.getWidth());
                        textField.setOnAction(a -> {
                            tableColumn.setText(textField.getText());
                            tableColumn.setGraphic(null);
                        });
                        textField.focusedProperty().addListener((src, ov, nv) -> {
                            if (!nv) tableColumn.setGraphic(null);
                        });
                        column.setGraphic(textField);
                        textField.requestFocus();
                    }
                    e.consume();
                }
            });
        }
    
        private Parent getContent() {
            table = new TableView<>(FXCollections.observableArrayList(
                    Locale.getAvailableLocales()));
            table.setTableMenuButtonVisible(true);
            // quick hack: don't let sorting interfere ...
            table.setSortPolicy(e -> {return false;});
            TableColumn<Locale, String> countryCode = new TableColumn<>("CountryCode");
            countryCode.setCellValueFactory(new PropertyValueFactory<>("country"));
            TableColumn<Locale, String> language = new TableColumn<>("Language");
            language.setCellValueFactory(new PropertyValueFactory<>("language"));
            table.getColumns().addAll(countryCode, language);
            table.skinProperty().addListener(this::installHeaderHandler);
            BorderPane pane = new BorderPane(table);
            return pane;
        }
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            primaryStage.setScene(new Scene(getContent(), 800, 400));
            primaryStage.setTitle(FXUtils.version());
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @SuppressWarnings("unused")
        private static final Logger LOG = Logger
                .getLogger(TableHeaderWithInput.class.getName());
    }