Skip to main content
 首页 » 编程设计

java之从 JavaFX 打印时设置要使用的 CSS

2023年09月11日31jyk

我正在编写一个程序,该程序需要打印有关已交付 cargo 的注释。目前使用 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 如下所示:

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

关于如何设置正在打印的节点的样式的任何想法?

请您参考如下方法:

这可能是一个优先级问题。 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找出如何使您的选择器比默认选择器更具体。


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