【问题标题】:Setting CSS to use when printing from JavaFX设置从 JavaFX 打印时使用的 CSS
【发布时间】:2017-06-12 14:21:24
【问题描述】:

我正在编写一个程序,该程序需要打印有关交付的注释。目前使用 JavaFX 8 打印方法,我已经能够创建一个基本的交货单,但是显示 TableView 的默认样式包含很多灰度,这使得物理打印副本看起来很奇怪且难以阅读。

我使用 CSS 将 TableView 设置为纯黑色和白色,但是在打印时它似乎忽略了我设置的 CSS。

这是我目前拥有的:

private void printDeliveryNote(){
    PrinterJob job = PrinterJob.createPrinterJob();
    PageLayout pageLayout = Printer.getDefaultPrinter().createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.HARDWARE_MINIMUM);
    Group pane = new Group();
    pane.getChildren().addAll(getNodeToPrint());
    pane.getStylesheets().add("css/main.css");

    if (job != null && job.showPrintDialog(new Stage())){
        boolean success = job.printPage(pageLayout, pane);
        if (success){
            job.endJob();
        }
    }
}

private Node getNodeToPrint() {
    Group group = new Group();
    Label prntDeliveryId = new Label("Delivery Id: " + txtDeliveryId.getText());
    prntDeliveryId.setLayoutX(txtDeliveryId.getLayoutX());
    prntDeliveryId.setLayoutY(txtDeliveryId.getLayoutY());

    Label prntDate = new Label("Date: " + txtDate.getText());
    prntDate.setLayoutX(txtDate.getLayoutX() - 20);
    prntDate.setLayoutY(txtDate.getLayoutY());

    Label prntTitle = new Label(lblTitle.getText());
    prntTitle.setLayoutX(lblTitle.getLayoutX());
    prntTitle.setLayoutY(lblTitle.getLayoutY());
    prntTitle.setFont(lblTitle.getFont());

    ImageView imgBarcode = new ImageView(SwingFXUtils.toFXImage(handleBarcode(txtDeliveryId.getText()), null));
    imgBarcode.setLayoutX(txtDeliveryId.getLayoutX());
    imgBarcode.setLayoutY(txtDeliveryId.getLayoutY());

    TableView<InstrumentContainer> prntInstrumentList = new TableView<InstrumentContainer>();
    setupInstrumentList(prntInstrumentList);
    prntInstrumentList.setLayoutY(lstInstruments.getLayoutY() + 40);
    prntInstrumentList.setPrefWidth(lstInstruments.getPrefWidth());
    System.out.println(prntInstrumentList.getHeight());
    prntInstrumentList.setLayoutX(lstInstruments.getLayoutX());
    group.getChildren().addAll(
            prntDeliveryId,
            prntDate,
            prntInstrumentList,
            prntTitle,
            imgBarcode
    );
    return group;
}

CSS 文件如下所示(在表单上显示而不是打印时有效):

.table-row-cell{
-fx-table-cell-border-color: #424242;
}
.column-header{
-fx-border-color: #424242;
-fx-background-color: #ffffff;
}

在表单上应用了样式的 TableView 如下所示:

但打印时它仍然具有默认样式:

关于如何为正在打印的节点设置样式有什么想法吗?

【问题讨论】:

  • 我想知道这是否是优先事项。尝试将!important 添加到声明中,例如-fx-border-color: #424242 !important;
  • 实际上效果很好!谢谢!我已经坚持了很多年了,不知道为什么我什至没有想到这一点。您能否将其添加为答案,以便我将其标记为正确?干杯
  • 没问题。是的,我添加了一个包含更多信息的正确答案。

标签: java css javafx javafx-8


【解决方案1】:

这可能是一个优先问题。 JavaFX 包含其自己的默认样式表 modena.css*,它可以并且经常使用比您可能添加的任何自定义规则更高的特异性规则。

解决此问题的一种方法是将!important 添加到每个声明中:

.table-row-cell {
    -fx-table-cell-border-color: #424242 !important;
}
.column-header {
    -fx-border-color: #424242 !important;
    -fx-background-color: #ffffff !important;
}

如果您有很多属性要覆盖,这可能会变得有点乏味。您可以查看默认样式表(上面链接)中的默认样式,并使用specificity calculator 来确定如何使您的选择器比默认选择器更具体。


* 旧版本可能使用不同的默认样式表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2017-04-16
    • 2010-11-08
    • 1970-01-01
    • 2012-04-01
    • 2010-09-28
    • 2015-04-10
    相关资源
    最近更新 更多