javafx基于列值向行添加颜色

javafx基于列值向行添加颜色,java,javafx,Java,Javafx,我需要根据pnl值为行和列添加颜色。如何更改行的颜色以及如何获取pnl值以确定行的颜色更改 TreeTableColumn<ClosedTradesPnL, String> symColumn = new TreeTableColumn<>("Symbol"); symColumn.setPrefWidth(100); symColumn.setCellValueFactory( (TreeTabl

我需要根据pnl值为行和列添加颜色。如何更改行的颜色以及如何获取pnl值以确定行的颜色更改

        TreeTableColumn<ClosedTradesPnL, String> symColumn = new TreeTableColumn<>("Symbol");
        symColumn.setPrefWidth(100);

        symColumn.setCellValueFactory(
            (TreeTableColumn.CellDataFeatures<ClosedTradesPnL, String> param) -> 
            new ReadOnlyStringWrapper(param.getValue().getValue().getSymbol())
        );


        TreeTableColumn<ClosedTradesPnL, Date> expiryColumn = 
            new TreeTableColumn<>("Expiry Date");
        expiryColumn.setPrefWidth(100);
        expiryColumn.setCellValueFactory(
            (TreeTableColumn.CellDataFeatures<ClosedTradesPnL, Date> param) -> 
            new ReadOnlyObjectWrapper(param.getValue().getValue().getExpiry_date())
        );




         TreeTableColumn<ClosedTradesPnL, String> pnlColumn = 
            new TreeTableColumn<>("PnL");
        pnlColumn.setPrefWidth(100);
       // pnlColumn.setStyle(" -fx-background-color: red ;");
      //  pnlColumn.setCellValueFactory(
       //     (TreeTableColumn.CellDataFeatures<ClosedTradesPnL, String> param) -> 
       //     new ReadOnlyStringWrapper(param.getValue().getValue().getRealized_PNL())
       // );
        pnlColumn.setCellValueFactory(new Callback<CellDataFeatures<ClosedTradesPnL, String>, ObservableValue<String>>() {
     @Override
     public ObservableValue<String> call(CellDataFeatures<ClosedTradesPnL, String> p) {

         int foo = Integer.parseInt(p.getValue().getValue().getRealized_PNL().replace(",", "").replace(".", ""));
         if( foo == 0){
             System.out.println("color app"+p.getValue().getValue().getRealized_PNL());
             pnlColumn.setStyle(" -fx-background-color: red ;");
         }else{
         pnlColumn.setStyle("-fx-background-color: white ;");
         }
         System.out.println(p.getValue().getValue().getRealized_PNL());
         return new ReadOnlyObjectWrapper(p.getValue().getValue().getRealized_PNL());
     }
  });
TreeTableView<ClosedTradesPnL> treeTableView = new TreeTableView<>(root);
        treeTableView.getColumns().setAll(symColumn, expiryColumn,pnlColumn);

// pnlColumn.setStyle("-fx-alignment: center-right;-fx-control-inner-background: slateblue;");
        sceneRoot.getChildren().add(treeTableView);
//        if (treeTableView.getRow(root)){treeTableView.setBackground(Background.RED);}
        stage.setScene(scene);
        stage.show();
    }
TreeTableColumn symColumn=新的TreeTableColumn(“Symbol”);
SYMBOLumn.setPrefWidth(100);
symColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures参数)->
新的ReadOnlyStringWrapper(param.getValue().getValue().getSymbol())
);
TreeTableColumn expiryColumn=
新的TreeTableColumn(“到期日”);
expiryColumn.setPrefWidth(100);
expiryColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures参数)->
新的ReadOnlyObjectWrapper(param.getValue().getValue().getExpiry_date())
);
TreeTableColumn pnlColumn=
新的树形柱(“PnL”);
pnlColumn.setPrefWidth(100);
//pnlColumn.setStyle(“-fx背景色:红色;”);
//pnlColumn.setCellValueFactory(
//(TreeTableColumn.CellDataFeatures参数)->
//新的ReadOnlyStringWrapper(param.getValue().getValue().getRealized_PNL())
// );
pnlColumn.setCellValueFactory(新回调(){
@凌驾
公共可观察值呼叫(CellDatap){
int foo=Integer.parseInt(p.getValue().getValue().getRealized_PNL().replace(“,”).replace(“,”);
如果(foo==0){
System.out.println(“颜色应用程序”+p.getValue().getValue().getRealized_PNL());
pnlColumn.setStyle(“-fx背景色:红色;”);
}否则{
pnlColumn.setStyle(“-fx背景色:白色;”);
}
System.out.println(p.getValue().getValue().getRealized_PNL());
返回新的ReadOnlyObjectWrapper(p.getValue().getValue().getRealized_PNL());
}
});
TreeTableView TreeTableView=新的TreeTableView(根目录);
treeTableView.getColumns().setAll(symColumn、expiryColumn、pnlColumn);
//pnlColumn.setStyle(“-fx对齐:右中;-fx控件内部背景:slateblue;”);
sceneRoot.getChildren().add(treeTableView);
//if(treeTableView.getRow(root)){treeTableView.setBackground(Background.RED);}
舞台场景;
stage.show();
}

这应该是不言自明的,我已经包括了一些评论

import java.util.Date;
import javafx.application.Application;
import javafx.beans.property.ReadOnlyDoubleWrapper;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableCell;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableRow;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;

public class StyleTableRow extends Application {

    @Override
    public void start(Stage primaryStage) {
        TreeTableView<ClosedTradesPnL> ttv = new TreeTableView<>(new TreeItem<>(new ClosedTradesPnL()));
        for (int i=0;i<10;i++) ttv.getRoot().getChildren().add(new TreeItem<>(new ClosedTradesPnL()));
        ttv.getRoot().setExpanded(true);

        TreeTableColumn<ClosedTradesPnL, String> symColumn = new TreeTableColumn<>("Symbol");
        symColumn.setCellValueFactory((param) -> 
            new ReadOnlyStringWrapper(param.getValue().getValue().getSymbol())
        );

        TreeTableColumn<ClosedTradesPnL, Date> expiryColumn = new TreeTableColumn<>("Expiry Date");
        expiryColumn.setCellValueFactory((param) -> 
            new ReadOnlyObjectWrapper<>(param.getValue().getValue().getExpiry_date())
        );

        //use Number for type of data in column
        TreeTableColumn<ClosedTradesPnL, Number> pnlColumn = new TreeTableColumn<>("PnL");
        pnlColumn.setCellValueFactory((param) -> 
            new ReadOnlyDoubleWrapper(param.getValue().getValue().getRealized_PNL())
        );

        //now use a cellFactory to style the cell
        //you can get the row and style it as well
        pnlColumn.setCellFactory((TreeTableColumn<ClosedTradesPnL, Number> param) -> {
            TreeTableCell cell = new TreeTableCell<ClosedTradesPnL, Number>(){
                @Override
                //by using Number we don't have to parse a String
                protected void updateItem(Number item, boolean empty) {
                    super.updateItem(item, empty);
                    TreeTableRow<ClosedTradesPnL> ttr = getTreeTableRow();
                    if (item == null || empty){
                        setText(null);
                        ttr.setStyle("");
                        setStyle("");
                    } else {
                        ttr.setStyle(item.doubleValue() > 0 
                                ? "-fx-background-color:lightgreen"
                                : "-fx-background-color:pink");
                        setText(item.toString());
                        setStyle(item.doubleValue() > 0 
                                ? "-fx-background-color:green"
                                : "-fx-background-color:red");
                    }
                }
            };
            return cell;
        });

        ttv.getColumns().setAll(symColumn, expiryColumn,pnlColumn);

        Scene scene = new Scene(ttv, 500, 500);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    private static class ClosedTradesPnL{
        private SimpleStringProperty symbol = new SimpleStringProperty("symbol");
        private SimpleObjectProperty<Date> expiry_date = new SimpleObjectProperty<>(new Date(System.currentTimeMillis()));
        private SimpleDoubleProperty realized_PNL= new SimpleDoubleProperty(Math.random()-0.5);

        public String getSymbol() {return symbol.get();}
        public Date getExpiry_date() {return expiry_date.get();}
        public double getRealized_PNL() {return realized_PNL.get();}

    }
}
import java.util.Date;
导入javafx.application.application;
导入javafx.beans.property.ReadOnlyDoubleWrapper;
导入javafx.beans.property.ReadOnlyObjectWrapper;
导入javafx.beans.property.ReadOnlyStringWrapper;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.beans.property.SimpleObject属性;
导入javafx.beans.property.SimpleStringProperty;
导入javafx.scene.scene;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeTableCell;
导入javafx.scene.control.TreeTableColumn;
导入javafx.scene.control.TreeTableRow;
导入javafx.scene.control.TreeTableView;
导入javafx.stage.stage;
公共类StyleTableRow扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
TreeTableView ttv=新的TreeTableView(新的TreeItem(新的ClosedTradesPnL());
对于(int i=0;i
新的ReadOnlyStringWrapper(param.getValue().getValue().getSymbol())
);
TreeTableColumn ExpireyColumn=新的TreeTableColumn(“到期日”);
expiryColumn.setCellValueFactory((参数)->
新的ReadOnlyObjectWrapper(param.getValue().getValue().getExpiry_date())
);
//将数字用作列中的数据类型
TreeTableColumn pnlColumn=新的TreeTableColumn(“PnL”);
pnlColumn.setCellValueFactory((参数)->
新的ReadOnlyDoubleWrapper(param.getValue().getValue().getRealized_PNL())
);
//现在使用cellFactory设置单元格样式
//您还可以获取行并设置其样式
pnlColumn.setCellFactory((TreeTableColumn参数)->{
TreeTableCell=新的TreeTableCell(){
@凌驾
//通过使用Number,我们不必解析字符串
受保护的void updateItem(数字项,布尔值为空){
super.updateItem(项,空);
TreeTableRow ttr=getTreeTableRow();
如果(项==null | |空){
setText(空);
ttr.setStyle(“”);
设置样式(“”);
}否则{
ttr.setStyle(item.doubleValue()>0
?“-fx背景色:浅绿色”
:“-fx背景色:粉红色”);
setText(item.toString());
setStyle(item.doubleValue()>0
?“-fx背景色:绿色”
:“-fx背景色:红色”);
}
}
};
返回单元;
});
ttv.getColumns().setAll(symColumn、expiryColumn、pnlColumn);
场景=新场景(ttv,500500);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
私有静态类ClosedTradesPnL{
私有SimpleStringProperty symbol=新SimpleStringProperty(“symbol”);
私有SimpleObjectProperty Expiration_date=新SimpleObjectProperty(新日期(System.currentTimeMillis());
私有SimpleDoubleProperty已实现\u PNL=新SimpleDoubleProperty(Math.random()-0.5);
公共字符串getSymbol(){return symbol.get();}
public Date getexpiration_Date(){返回expiration_Date.get();}
public double getRealized_PNL(){返回realized_PNL.get();}
}
}

您想给整行还是只给pnl单元格上色?您还说要为列着色,但这没有意义,因为在一个c中有许多pnl值