package com.lee.platform.testtry;
import java.text.MessageFormat;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
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 lee
*/
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 myTable = new TableView();
ObservableList myTableData = FXCollections
.observableArrayList(new TableData("data", "data2", "data3"),
new TableData("data", "data2", "data4"), new TableData(
"Name the song", "867-5309",
"[email protected]"));
TableColumn firstColumn = new TableColumn("First Column");
firstColumn
.setCellValueFactory(new PropertyValueFactory(
"one"));
TableColumn secondColumn = new TableColumn("Second Column");
secondColumn
.setCellValueFactory(new PropertyValueFactory(
"two"));
TableColumn thirdColumn = new TableColumn("Third Column");
thirdColumn
.setCellValueFactory(new PropertyValueFactory(
"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() {
public TableCell call(TableColumn param) {
return new TableCell() {
ObservableValue ov;
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!isEmpty()) {
ov = getTableColumn().getCellObservableValue(getIndex());
System.out.println(ov.getValue());
if(getTableRow() != null&&item.contains("@")){
this.getTableRow().setStyle("-fx-background-color: green");
}
this.setTextFill(Color.RED);
// Get fancy and change color based on data
if (item.contains("@"))
this.setTextFill(Color.YELLOW);
setText(item);
}
/*if (!empty && getTableRow() != null) {
int row = this.getTableRow().getIndex();
//ProjectionInfo projectionInfo = getTableView().getItems().get(row);
Color regionColor = Color.RED;
String style = MessageFormat.format("-fx-background-color: rgba({0}%, {1}%, {2}%, 0.3);", regionColor.getRed() * 100, regionColor.getGreen() * 100, regionColor.getBlue() * 100); // NOI18N.
setStyle(style);
}*/
/*if (!isEmpty()&& getTableRow() != null) {
int row = this.getTableRow().getIndex();
System.out.println("row:"+row);
this.setStyle("-fx-background-color: linear-gradient(to bottom right, #a1c517, #009045, #0082b6, #151f77, #db004f);");
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();
}
}
如果要对行加颜色,就要在创建列的时候,对每一个列进行判断,然后再赋值,相当于对每一个cell的字体颜色进行赋值。
因为this.getTableRow().setStyle("-fx-text-fill: #006464;"); 并不好用,而this.getTableRow().setStyle("-fx-background-color: "+"#F00FF6");就可以。
是不是Javafx2的bug呢?部分代码如下:
public TableView initTable(JSONArray tablecolJson,JSONObject tableinfo) {
//JSONArray tablecolJson,JSONObject tableinfo,JSONObject tablePage
JSONObject jsonObject = null;
table = new TableView<>();
String twidth = (String)tableinfo.get("width");
String theight = (String)tableinfo.get("height");
String tboder = (String)tableinfo.get("boder");
String ttop = (String)tableinfo.get("top");
String tleft = (String)tableinfo.get("left");
String tisselect = (String)tableinfo.get("isselect");
String tselectstyle = "";
if("true".equals(tisselect)){
tselectstyle = (String)tableinfo.get("selectstyle");
}
for (int j = 0; j < tablecolJson.size(); j++) {
jsonObject = (JSONObject)tablecolJson.get(j);
String id = jsonObject.get("id").toString().toUpperCase();
String title = (String)jsonObject.get("title");
String width = (String)jsonObject.get("width");
if(id==null||id.equals("")){
System.out.println("未设置列id,请重新设置!");
return null;
}
if(title==null||title.equals("")){
title = "请输入标题名";
}
if(width==null||width.equals("")){
title = "60";
}
tableColu = new TableColumn<>(title);
tableColu.setCellValueFactory(new MapValueFactory(id));
tableColu.setCellFactory(new Callback() {
public TableCell call(TableColumn param) {
return new TableCell() {
ObservableValue ov;
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!empty) {
ov = getTableColumn().getCellObservableValue(getIndex());
if(getTableRow() != null&&!ov.equals("")){
Map vmap = (Map)this.getTableRow().getItem();
boolean colorFlag = false;
if(vmap.get("TEXT_COLOR")!=null){
if(!vmap.get("TEXT_COLOR").equals("")){
this.setStyle("-fx-text-fill: "+vmap.get("TEXT_COLOR"));
colorFlag = true;
}
}
if(vmap.get("BACKGROUND_COLOR")!=null){
if(!vmap.get("BACKGROUND_COLOR").equals("")){
if(!colorFlag){
this.setStyle("-fx-background-color: "+vmap.get("BACKGROUND_COLOR"));
}else{
this.setStyle("-fx-background-color: "+vmap.get("BACKGROUND_COLOR")+";"+"-fx-text-fill: "+vmap.get("TEXT_COLOR"));
}
}
}
}
setText(item);
}
}
};
}
});
tableColu.setPrefWidth(Double.valueOf(width));
table.getColumns().add(tableColu);
}
if(ttop==null||ttop.equals("")){
ttop = "190";
}
if(tleft==null||tleft.equals("")){
ttop = "20";
}
AnchorPane.setTopAnchor(table, Double.valueOf(ttop));
AnchorPane.setLeftAnchor(table, Double.valueOf(tleft));
return table;
}
参考:http://stackoverflow.com/questions/6998551/setting-font-color-of-javafx-tableview-cells