2011-08-09 1 views
6

Dans mon application de bureau Java, j'ai une table JavaFX avec 3 colonnes. Je veux mettre la couleur de police de la 3ème colonne au rouge. Je n'ai pas pu définir la couleur de police du tableau. J'ai regardé dans CSS et je n'ai rien trouvé. Y a-t-il un moyen de le faire avec CSS? J'ai aussi cherché setFont() avec l'espoir de le définir ainsi. Rien ici. Je n'arrivais même pas à trouver un moyen de mettre quelque chose sur une certaine cellule.Définition de la couleur de la police de JavaFX TableView Cells?

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

Comment puis-je accomplir cela? Comment puis-je définir la couleur de la police? Toute aide serait appréciée.

Répondre

20

Vous devez remplacer la CellFactory.

code partiel seulement de la troisième colonne:

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

code entier Exemple:

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

Désolé, je l'ai déjà figuré en dehors. Je n'ai tout simplement pas eu l'occasion de poster une réponse. Mais le vôtre est une bonne réponse. – Dorothy

+1

Merci! Je me suis dit autant de vos autres posts - mais j'ai vu cette question surgir plusieurs fois dans d'autres endroits pour la laisser sans réponse. – jkaufmann

+0

Désolé d'être en retard à la fête, mais comment désactiver le remplissage du texte lorsque la ligne du tableau est sélectionnée? Regards –

2

Le code doivent être peu changé:

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

         } 
        } 

       }; 
      } 
     }); 
Questions connexes