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();
}
是否可以对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();
}