JavaFX表格列使用css的不同字体

JavaFX表格列使用css的不同字体,css,javafx,Css,Javafx,我想在JavaFX表的一列中设置不同的字体(实际上只是斜体)。 我已经看到了通过调用setCellFactory然后在上面设置字体来回答这个问题。在我看来(JavaFX经常出错;-))这是一种复杂而混乱的工作方式——如果你想处理单元格上的编辑等问题,你最终会得到一个大类,而不仅仅是使用 col.setCellFactory(TextFieldTableCell.<TableRow>forTableColumn()); 然后使用一些 #italic-cell .italic-cell

我想在JavaFX表的一列中设置不同的字体(实际上只是斜体)。
我已经看到了通过调用setCellFactory然后在上面设置字体来回答这个问题。在我看来(JavaFX经常出错;-))这是一种复杂而混乱的工作方式——如果你想处理单元格上的编辑等问题,你最终会得到一个大类,而不仅仅是使用

col.setCellFactory(TextFieldTableCell.<TableRow>forTableColumn());
然后使用一些

#italic-cell
.italic-cell
#special-table .italic-cell
等等等等等等

-fx-font-style: italic;

作为ID/class的样式表列的CSS样式

向列中添加适当的样式类:

nameColumn.getStyleClass().add("italic");
向场景中添加样式表,该样式表定义表格单元格的斜体样式:

.italic.table-cell { -fx-font-style: italic; }
警告1

基于T-and-M Mike的评论,我再次尝试了这个例子,事实上,它在使用Java8的OSX10.9上并没有完全正常工作。我相信,在windows上,只要将
-fx字体样式设置为斜体,文本就可以以斜体显示。在Mac电脑上,这会将字体设置为System Italic(系统斜体),这是一种似乎不存在的字体,因此文本只显示而不显示斜体。如果还将字体系列设置为定义了斜体的字体,则列中的文本将按预期以斜体显示。例如,使用Times New Roman,italic:

.italic.table-cell { 
  -fx-font-family: "Times New Roman"; 
  -fx-font-style: italic; 
}
警告2

在OS X 10.9上的Java 8b132上,当第一次显示表格时,表格内容与表格标题稍微不一致,出现了一个轻微的渲染错误

调用
table.requestLayout()在屏幕上显示表格后,似乎修复了表格的对齐渲染错误,但是如果一切正常,则不需要调用

可执行样本

Win7+Java 8b91上的测试输出结果:

CellShadeTable.java

cell-shader.css

基于单元工厂的方法

为供参考(如上所示,对于简单的样式设置操作而言,这不是必需的),以下是关于基于自定义TableCell的行着色方法的信息:


首先,感谢您的回复和完整的应用示例!嗯,由于某种原因,我无法让它工作——首先我在我的应用程序中尝试了它,然后我认为它可能是Java版本,所以我下载并配置了1.8b92。最后,我把你的代码复制到一个新项目中,但它仍然拒绝像你的截图那样显示它,也就是说,我所有的专栏都是非斜体的。我检查了它是否在1.8平台上运行(在XP和Win7上);我也试过用.italic和.table cell之间的空格(显示我对css语法的无知);我试着在css中使用setID和#italic,只是标题行是斜体。我似乎没有东西要检查了。有什么想法吗?PS我喜欢你在目录中的幽默;-)在NetbeansforJRE7所需的4个jar文件(jfxrt.jar、deploy.jar、javaws.jar和plugin.jar)上再次挣扎!这些显然不需要为jre8添加。移除它们,是的,谢谢,这很有效!还有一件事要告诉大家——使用JDK8b92,它可以在Win7上运行,但不会根据T-And-M Mike评论的进一步测试进行更新
.italic.table-cell { 
  -fx-font-family: "Times New Roman"; 
  -fx-font-style: italic; 
}
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

// demonstrates styling column cells in a tableview.
public class CellShadedTable extends Application {
  public static void main(String[] args) throws Exception { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    stage.setTitle("So called friends . . .");

    // create a table.
    TableColumn<Friend, String> nameColumn = new TableColumn<>("Name");
    nameColumn.setCellValueFactory(new PropertyValueFactory<Friend, String>("name"));
    nameColumn.setPrefWidth(75);
    nameColumn.getStyleClass().add("italic");

    TableColumn<Friend, String> owesMeColumn = new TableColumn<>("Owes Me");
    owesMeColumn.setCellValueFactory(new PropertyValueFactory<Friend, String>("owesMe"));
    owesMeColumn.setPrefWidth(150);

    TableColumn<Friend, Boolean> willPayColumn = new TableColumn<>("Will Pay Up");
    willPayColumn.setCellValueFactory(new PropertyValueFactory<Friend, Boolean>("willPay"));
    willPayColumn.setPrefWidth(75);

    TableView<Friend> table = new TableView(Friend.data);
    table.getColumns().addAll(
      nameColumn,
      owesMeColumn,
      willPayColumn
    );
    table.setPrefHeight(200);
    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

    stage.setScene(new Scene(table));
    stage.getScene().getStylesheets().add(getClass().getResource("cell-shader.css").toExternalForm());
    stage.show();

    table.requestLayout();
  }
}
import javafx.collections.*;

/** Sample data for a table view */
public class Friend {
  final static public ObservableList data = FXCollections.observableArrayList(
    new Friend("George", "Movie Ticket", true),
    new Friend("Irene", "Pay Raise", false),
    new Friend("Ralph", "Return my Douglas Adams Books", false),
    new Friend("Otto", "Game of Golf", true),
    new Friend("Sally", "$12,045.98", false),
    new Friend("Antoine", "Latte", true)
  );

  final private String  name;
  final private String  owesMe;
  final private boolean willPay;
  public Friend(String name, String owesMe, boolean willPay) {
    this.name = name; this.owesMe = owesMe; this.willPay = willPay;
  }
  public String  getName()    { return name;    }
  public String  getOwesMe()  { return owesMe;  }
  public boolean getWillPay() { return willPay; }
}
/** file: cell-shader.css
place in same directory as CellShadedTable.java */

.italic.table-cell { 
  -fx-font-family: "Times New Roman";
  -fx-font-style: italic; 
}