2011-08-09 3 views
6

내 Java Desktop Application에는 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); 

         } 
        } 

       }; 
      } 
     }); 
관련 문제