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

时间:2015-02-04 10:10:09

标签: javafx alignment tableview cell

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

E.g。我有一个列中包含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;
        }
    });
}

也不起作用。 Ty求救。

1 个答案:

答案 0 :(得分:1)

好的,我有一个有效的例子 - 似乎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();
}