【问题标题】:Setting font color of JavaFX TableView Cells?设置 JavaFX TableView 单元格的字体颜色?
【发布时间】: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);

我怎样才能做到这一点?如何设置字体颜色?任何帮助将不胜感激。

【问题讨论】:

    标签: java tableview javafx textcolor


    【解决方案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 的更多信息来改进。
          猜你喜欢
          • 1970-01-01
          • 2017-04-30
          • 2012-05-24
          • 2011-09-23
          • 2017-02-08
          • 1970-01-01
          • 2016-01-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多