从ListView Javafx打印

从ListView Javafx打印,java,javafx,printing,Java,Javafx,Printing,我有一个javafx应用程序,用户在测试字段中输入一些细节,并显示在列表视图中。我现在有一个使用printjob打印的按钮,但每次我点击打印按钮时,打印机都会打印垃圾数据,比如jhsjs6sh3#uhbsbkahi,而不是ListView中的实际值。下面是我的打印功能代码 public void print (final Node node) { Printer printer = Printer.getDefaultPrinter(); PageLayout p

我有一个javafx应用程序,用户在测试字段中输入一些细节,并显示在列表视图中。我现在有一个使用printjob打印的按钮,但每次我点击打印按钮时,打印机都会打印垃圾数据,比如
jhsjs6sh3#uhbsbkahi
,而不是ListView中的实际值。下面是我的打印功能代码

public void print (final Node node) {
        Printer printer = Printer.getDefaultPrinter();
        PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.HARDWARE_MINIMUM);
        final double scaleX = pageLayout.getPrintableWidth() / node.getBoundsInParent().getWidth();
        final double scaleY = pageLayout.getPrintableHeight() / node.getBoundsInParent().getHeight();
        node.getTransforms().add(new Scale(scaleX, scaleY));

        PrinterJob job =PrinterJob.createPrinterJob();
        if (job != null ){

            boolean success = job.printPage(node);
            System.out.println("printed");
            if (success){
                System.out.println(success);
                job.endJob();
            }
        }

    }
@FXML

    私有void打印操作(ActionEvent事件){
    
        打印(billingDataList);

}


我使用MacBook进行开发和HP打印机。

您必须计算出缩放比例。这将使用
SnapShot
awt
进行打印。使用来自的代码

导入java.awt.Graphics;
导入java.awt.image.buffereImage;
导入java.awt.print.PageFormat;
导入静态java.awt.print.Printable.NO_这样的页面;
导入静态java.awt.print.Printable.PAGE_存在;
导入java.awt.print.PrinterException;
导入java.awt.print.PrinterJob;
导入java.io.File;
导入java.io.IOException;
导入javafx.application.application;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.embed.swing.SwingFXUtils;
导入javafx.scene.scene;
导入javafx.scene.Snapshot参数;
导入javafx.scene.control.Button;
导入javafx.scene.control.ListView;
导入javafx.scene.image.image;
导入javafx.scene.image.WritableImage;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
导入javax.imageio.imageio;
/**
*
*@author blj0011
*/
公共类JavaFXApplication61扩展了应用程序
{
@凌驾
公共无效开始(阶段primaryStage)
{
ListView列表=新建ListView();
ObservableList items=FXCollections.observableArrayList(“A”、“B”、“C”、“D”);
列表。设置项目(项目);
VBox root=新的VBox();
按钮btn=新按钮();
btn.setText(“说‘你好,世界’”);
btn.setOnAction((事件)->
{
WritableImage image=list.snapshot(新的SnapshotParameters(),null);
File File=新文件(“nodeImage.png”);
尝试
{
write(SwingFXUtils.fromFXImage(image,null),“png”,文件);
Image imageToPrint=新图像(file.toURI().toString());
BuffereImage BuffereImage=SwingFXUtils.fromFXImage(imageToPrint,null);
打印图像(缓冲图像);
}
捕获(IOEX异常)
{
System.out.println(例如toString());
}
});
root.getChildren().add(btn);
root.getChildren().add(列表);
场景=新场景(根,1080720);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args)
{
发射(args);
}
私有void打印图像(BuffereImage图像)
{
PrinterJob printJob=PrinterJob.getPrinterJob();
printJob.setPrintable((图形、页面格式、页面格式、整型页面索引)->
{
//获取可打印的左上角
intx=(int)Math.ceil(pageFormat.getImageableX());
int y=(int)Math.ceil(pageFormat.getImageableY());
如果(页面索引!=0)
{
不返回此类页面;
}
graphics.drawImage(image,x,y,image.getWidth(),image.getHeight(),null);
返回页面_存在;
});
尝试
{
printJob.print();
}
捕获(打印异常e1)
{
e1.printStackTrace();
}
}
}

为什么要使用
android
标签?我用给定的代码打印
列表视图
,没有问题。我猜这可能是Mac电脑的问题,或者您没有发布导致问题的部分代码。为了避免浪费纸张试图找出打印问题,我总是使用
job.showPrintDialog(node.getScene().getWindow())
。这使我可以打印为PDF而不是纸张。所以我会用
if(job!=null)
替换
if(job!=null&&job.showPrintDialog(node.getScene().getWindow())
,直到我知道我的打印作业是正确的。我已经发布了完整的代码。即使我将其保存为PDF,它仍然会显示垃圾文本。我认为您在尝试排除打印作业故障时忽略了打印为PDF的原因。请尝试打印不同的
节点
,以查看是否有任何情况发生。根据您的回答,我无法将其合并到我的代码中。请查看我的代码结构并输入额外的内容代码。如果您需要我的应用程序中的额外代码,我会提供我的答案,以便您可以在您的机器上测试它,然后自己进行必要的编码。好的,我现在会在我的机器上尝试,我能够考虑代码,我已经解决了。谢谢
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import static java.awt.print.Printable.NO_SUCH_PAGE;
import static java.awt.print.Printable.PAGE_EXISTS;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javax.imageio.ImageIO;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication61 extends Application
{

    @Override
    public void start(Stage primaryStage)
    {
        ListView<String> list = new ListView<>();
        ObservableList<String> items = FXCollections.observableArrayList("A", "B", "C", "D");
        list.setItems(items);

        VBox root = new VBox();

        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction((event) ->
        {
            WritableImage image = list.snapshot(new SnapshotParameters(), null);
            File file = new File("nodeImage.png");

            try
            {
                ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file);

                Image imageToPrint = new Image(file.toURI().toString());
                BufferedImage bufferedImage = SwingFXUtils.fromFXImage(imageToPrint, null);
                printImage(bufferedImage);
            }
            catch (IOException ex)
            {
                System.out.println(ex.toString());
            }
        });

        root.getChildren().add(btn);
        root.getChildren().add(list);
        Scene scene = new Scene(root, 1080, 720);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

    private void printImage(BufferedImage image)
    {
        PrinterJob printJob = PrinterJob.getPrinterJob();
        printJob.setPrintable((Graphics graphics, PageFormat pageFormat, int pageIndex) ->
        {
            // Get the upper left corner that it printable
            int x = (int) Math.ceil(pageFormat.getImageableX());
            int y = (int) Math.ceil(pageFormat.getImageableY());
            if (pageIndex != 0)
            {
                return NO_SUCH_PAGE;
            }
            graphics.drawImage(image, x, y, image.getWidth(), image.getHeight(), null);
            return PAGE_EXISTS;
        });
        try
        {
            printJob.print();
        }
        catch (PrinterException e1)
        {
            e1.printStackTrace();
        }
    }
}