JavaFX:TableView的一列中的不同类型的对齐方式

JavaFX: Different types of alignment in one column of TableView

是否可以对TableView的一列中的每个单元格进行不同类型的对齐?

例如我有一列,其中包含 3 种可能的数据类型:正数、负数和“-”。第一个应该左对齐,第二个 - 右对齐,第三个 - 居中。

这是我试过的:

private void setPositionAndColor(TableColumn<TransferItem, String> tableColumn){
    tableColumn.setCellFactory(new Callback<TableColumn<TransferItem, String>, TableCell<TransferItem, String>>() {
        @Override
        public TableCell<TransferItem, String> call(TableColumn<TransferItem, String> column) {
            TableCell<TransferItem, String> cell = new TableCell<TransferItem, String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);

                    if (item == null || empty) {
                        setText("");
                    } else {
                        setText(item);
                        if (item.matches("-+\d.*")) {
                            setTextFill(Color.RED);
                            setTextAlignment(TextAlignment.RIGHT);
                        }
                        else if (item.equals("-")) {
                            setTextFill(Color.AQUA);
                            setTextAlignment(TextAlignment.CENTER);
                        }else {
                            setTextFill(Color.GREEN);
                            setTextAlignment(TextAlignment.LEFT);
                        }
                    }
                }
            };
            return cell;
        }
    });
}

我只是为了测试而添加了颜色更改,它起作用了,但对齐不起作用。

另一种方法:

Pos position;
private void setPositionAndColor(TableColumn<TransferItem, String> tableColumn){
    tableColumn.setCellFactory(new Callback<TableColumn<TransferItem, String>, TableCell<TransferItem, String>>() {
        @Override
        public TableCell<TransferItem, String> call(TableColumn<TransferItem, String> column) {
            TableCell<TransferItem, String> cell = new TableCell<TransferItem, String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);

                    if (item == null || empty) {
                        setText("");
                    } else {
                        setText(item);
                        if (item.matches("-+\d.*")) {
                            setTextFill(Color.RED);
                            position = Pos.CENTER_RIGHT;
                        }
                        else if (item.equals("-")) {
                            setTextFill(Color.AQUA);
                            position = Pos.CENTER;
                        }else {
                            setTextFill(Color.GREEN);
                            position = Pos.CENTER_LEFT;
                        }
                    }
                }
            };
            cell.setAlignment(position);
            return cell;
        }
    });
}

也不行。 求助。

好的,我得到了一个工作示例 - 看来,setAlignment() 可以解决问题:

@Override
public void start(Stage primaryStage) {

    ObservableList<String> data = FXCollections.observableArrayList();
    IntStream.range(0, 1000).mapToObj(Integer::toString).forEach(data::add);

    TableView<String> table = new TableView<String>(data);

    TableColumn<String, String> column = new TableColumn<String, String>("test");
    column.setCellFactory(c -> new TableCell<String,String>(){

        @Override
        protected void updateItem(String item, boolean empty) {
            if(empty) {
                setText(null);
            }
            else {
                setText(item);
                if(getIndex() % 2 == 0) {
                    setAlignment(Pos.CENTER_LEFT);
                }
                else if(getIndex() % 3 == 0) {
                    setAlignment(Pos.CENTER_RIGHT);
                }
                else {
                    setAlignment(Pos.CENTER);
                }
            }
        }
    });
    column.setCellValueFactory(c -> new SimpleStringProperty(c.getValue()));
    table.getColumns().add(column);

    Scene scene = new Scene(new BorderPane(table), 400, 400);
    primaryStage.setScene(scene);
    primaryStage.show();
}