设置 JavaFX TableView 单元格的字体颜色?
Posted
技术标签:
【中文标题】设置 JavaFX TableView 单元格的字体颜色?【英文标题】:Setting font color of JavaFX TableView Cells? 【发布时间】:2011-10-23 08:03:38 【问题描述】:在我的 Java 桌面应用程序中,我有一个包含 3 列的 JavaFX 表。我想将第三列的字体颜色设置为红色。我根本无法设置 Tableb 的字体颜色。我查看了 CSS,但没有找到任何东西。有没有办法用 CSS 做到这一点?我还寻找了 setFont() 并希望以这种方式进行设置。那里空无一物。我什至想不出办法在某个单元格上设置一些东西。
TableView<TableData> myTable = new TableView<TableData>();
ObservableList<TableData> myTableData = FXCollections.observableArreyList(
new TableData("data", "data", "data"),
new TableData("data", "data", "data"));
TableColumn firstColumn = new TableColumn("First Column");
firstColumn.setProperty("one");
TableColumn secondColumn = new TableColumn("Second Column");
secondColumn .setProperty("two");
TableColumn thirdColumn = new TableColumn("Third Column");
thirdColumn .setProperty("three");
myTable.setItems(myTableData);
myTable.getColumns.addAll(firstColumn, secondColumn, thirdColumn);
我怎样才能做到这一点?如何设置字体颜色?任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:您需要覆盖 CellFactory。
第三列的部分代码:
TableColumn thirdColumn = new TableColumn("Third Column");
thirdColumn.setCellValueFactory(new PropertyValueFactory<TableData,String>("three"));
// ** The TableCell class has the method setTextFill(Paint p) that you
// ** need to override the text color
// To obtain the TableCell we need to replace the Default CellFactory
// with one that returns a new TableCell instance,
// and @Override the updateItem(String item, boolean empty) method.
//
thirdColumn.setCellFactory(new Callback<TableColumn, TableCell>()
public TableCell call(TableColumn param)
return new TableCell<TableData, String>()
@Override
public void updateItem(String item, boolean empty)
super.updateItem(item, empty);
if (!isEmpty())
this.setTextFill(Color.RED);
// Get fancy and change color based on data
if(item.contains("@"))
this.setTextFill(Color.BLUEVIOLET);
setText(item);
;
);
整个代码示例:
package tablecelltextcolorexample;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Callback;
/**
*
* @author jKaufmann
*/
public class TableCellTextColorExample extends Application
public static class TableData
SimpleStringProperty one,two,three;
public TableData(String one, String two, String three)
this.one = new SimpleStringProperty(one);
this.two = new SimpleStringProperty(two);
this.three = new SimpleStringProperty(three);
public String getOne()
return one.get();
public void setOne(String one)
this.one.set(one);
public String getThree()
return three.get();
public void setThree(String three)
this.three.set(three);
public String getTwo()
return two.get();
public void setTwo(String two)
this.two.set(two);
/**
* @param args the command line arguments
*/
public static void main(String[] args)
Application.launch(args);
@Override
public void start(Stage stage)
VBox vbox = new VBox();
Scene scene = new Scene(vbox, 200, 200);
stage.setTitle("Table View - Change color of a particular column");
stage.setWidth(400);
stage.setHeight(500);
TableView<TableData> myTable = new TableView<TableData>();
ObservableList<TableData> myTableData = FXCollections.observableArrayList(
new TableData("data", "data", "data"),
new TableData("data", "data", "data"),
new TableData("Name the song","867-5309","SomeEmail@gmail.com"));
TableColumn firstColumn = new TableColumn("First Column");
firstColumn.setCellValueFactory(new PropertyValueFactory<TableData,String>("one"));
TableColumn secondColumn = new TableColumn("Second Column");
secondColumn.setCellValueFactory(new PropertyValueFactory<TableData,String>("two"));
TableColumn thirdColumn = new TableColumn("Third Column");
thirdColumn.setCellValueFactory(new PropertyValueFactory<TableData,String>("three"));
// ** The TableCell class has the method setTextFill(Paint p) that you
// ** need to override the text color
// To obtain the TableCell we need to replace the Default CellFactory
// with one that returns a new TableCell instance,
// and @Override the updateItem(String item, boolean empty) method.
//
thirdColumn.setCellFactory(new Callback<TableColumn, TableCell>()
public TableCell call(TableColumn param)
return new TableCell<TableData, String>()
@Override
public void updateItem(String item, boolean empty)
super.updateItem(item, empty);
if (!isEmpty())
this.setTextFill(Color.RED);
// Get fancy and change color based on data
if(item.contains("@"))
this.setTextFill(Color.BLUEVIOLET);
setText(item);
;
);
myTable.setItems(myTableData);
myTable.getColumns().addAll(firstColumn, secondColumn, thirdColumn);
vbox.getChildren().addAll(myTable);
VBox.setVgrow(myTable, Priority.ALWAYS);
stage.setScene(scene);
stage.show();
【讨论】:
对不起,我已经想通了。我只是没有机会发布答案。但你的答案很好。 谢谢!我从你的其他帖子中得到了同样多的信息 - 但我已经看到这个问题在其他地方多次出现,没有得到回答。 抱歉,我迟到了派对,但是在选择表行时如何禁用文本填写?问候 如果你添加了一个TextFill颜色,然后你想恢复TableView的默认颜色怎么办?例如,单元格值改变了它的内容,现在它不包含"@"
。【参考方案2】:
代码需要稍作改动:
// Method for displaying data in table
protected void displayDataInTable()
tblColID.setCellValueFactory(new PropertyValueFactory<Person, String>("id"));
// Table cell coloring
tblColID.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>()
@Override
public TableCell<Person, String> call(TableColumn<Person, String> param)
return new TableCell<Person, String>()
@Override
public void updateItem(String item, boolean empty)
super.updateItem(item, empty);
if (!isEmpty())
this.setTextFill(Color.RED);
// Get fancy and change color based on data
if(item.contains("@"))
this.setTextFill(Color.BLUEVIOLET);
setText(item);
;
);
【讨论】:
【参考方案3】:我找到了一个 CSS 代码。将此red-column
类应用到您的列中。
.red-column.table-cell
-fx-padding: 0.5em;
-fx-border-color: transparent -fx-box-border transparent transparent;
-fx-font: 13px "Arial";
-fx-text-fill: red;
你的桌子会是这样的。
表格视图的完整 css 是 here。
【讨论】:
【参考方案4】:或者,类似于 Panduka,
tableColumn.setStyle("-fx-text-fill: red");
【讨论】:
【参考方案5】:对于多行单元格:
Callback<TableColumn<MyDTO, String>, TableCell<MyDTO, String>> multilineRedCallback = param ->
TableCell<MyDTO, String> cell = new TableCell<MyDTO, String>();
Text text = new Text();
cell.setGraphic( text );
cell.setPrefHeight( Region.USE_COMPUTED_SIZE );
text.setFill( Color.RED );
text.wrappingWidthProperty().bind( cell.widthProperty() );
text.textProperty().bind( cell.itemProperty() );
return cell;
;
this.colMultilineRed.setCellFactory( multilineRedCallback );
【讨论】:
您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。以上是关于设置 JavaFX TableView 单元格的字体颜色?的主要内容,如果未能解决你的问题,请参考以下文章