2011-08-09 79 views
6

在我的Java桌面应用程序中我有一个包含3列的JavaFX表。我想将第三列的字体颜色设置为红色。我一直无法设置Tableb的字体颜色。我看着CSS,但没有找到任何东西。有没有办法用CSS做到这一点?我也希望能够设置setFont()。空空如也。我甚至无法想象某种方式在某个细胞上设置某种东西。设置JavaFX TableView单元格的字体颜色?

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); 

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

回答

20

您需要重写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","[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(); 
} 
} 
+0

对不起,我已经想通出。我只是没有机会发布答案。但你的回答很好。 – Dorothy

+1

谢谢!我从你的其他帖子中发现了很多 - 但是我看到这个问题在其他地方出现过很多次,以至于无法回答。 – jkaufmann

+0

对不起,我迟到了派对,但是如何在表格行被选中时禁用文本填充?问候 –

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); 

         } 
        } 

       }; 
      } 
     }); 
相关问题