Issue
In my Java Desktop Application I have a JavaFX Table with 3 columns. I want to set the font color of the 3rd column to red. I have not been able to set the font color of the Tableb at all. I looked into CSS and I did not find anything. Is there a way to do it with CSS? I also looked for setFont() with the hope of setting it that way. Nothing there. I could not even figure a way to set something on a certain cell.
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);
How can I accomplish this? How can I set to font color? Any help will be appreciated.
Solution
You need to override the CellFactory.
Partial code just of the third column:
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);
}
}
};
}
});
Entire Code Example:
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","[email protected]"));
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();
}
}
Answered By - jkaufmann
Answer Checked By - Marie Seifert (JavaFixing Admin)