JavaFX PrinterJob komische Zeichen?

1 Antwort

Code:

PrinterJob printerJob = PrinterJob.createPrinterJob(); if(printerJob.showPrintDialog(primaryStage) && printerJob.printPage(new Text("Text"))) printerJob.endJob();

Dein Code würde theoretisch ein neues Textelement drucken. - Nachdem dieses Textelement aber nirgends gezeichnet ist, siehst du nur abgehackte Zeichen.

PS: Es wäre gut wenn du ein vollständiges Beispiel deines Codes bereit stellen könntest. 

legaga1208 
Fragesteller
 14.07.2017, 10:54

Danke erstmal für deine Antwort!

Hier ist der ganze Code:

private void print() {

PrinterJob printerJob = PrinterJob.createPrinterJob();

if(printerJob.showPrintDialog(primaryStage) && printerJob.printPage(getPrintPage()))
printerJob.endJob();
}

private AnchorPane getPrintPage() {

AnchorPane root = new AnchorPane();

HBox hBox = new HBox();
VBox vBox = new VBox();

vBox.getChildren().add(hBox);

Label label = new Label("Hallo");

hBox.getChildren().add(label);

root.getChildren().add(vBox);

return root;
}
0
KnusperPudding  14.07.2017, 11:47
@legaga1208

Der 'ganze' Code ist es leider nicht: Um dein Beispiel nachvollziehen zu können, wäre ein ausführbares Beispiel relevant gewesen. Also eine vollständige (ausführbare) Klasse. - In der Frage waren davon nur drei Zeilen enthalten und jetzt im Kommentar immerhin die Methode.

Das Problem ist hier aber nach wie vor dasselbe: Die Elemente die du drucken willst, sind nirgends gezeichnet. Somit gibt es keinen Ankerpunkt, wo die Zeichnung beginnen soll:

Deine Methode:  getPrintPage(); würde eine neue AnchorPane erstellen (aber auch diese nirgends Zeichen). 

Wenn du eine Pane als Root-Pane definieren willst, dann zeichne diese einmal und verweise anschließend beim Drucken auf die Root Pane, z.B. so:

private AnchorPane root;


public void start(Stage stage) throws Exception {
    root = getPrintPage();
    stage.setScene(new Scene(root));
    ...
}
...

private void print() {
   .... 
   printerjob.printPage(root);
   ...
}

Ein Ausführbares nachvollziehbares Beispiel könnte im übrigen z.B. so aussehen:

public class Test extends Application {


public static class Bean {

private StringProperty col1, col2;

public Bean(String col1, String col2) {
this.col1 = new SimpleStringProperty(col1);
this.col2 = new SimpleStringProperty(col2);
}

public String getCol1() {
return col1.get();
}

public StringProperty col1Property() {
return col1;
}

public String getCol2() {
return col2.get();
}

public StringProperty col2Property() {
return col1;
}

}

@Override
public void start(Stage primaryStage) throws Exception {

VBox vbox = new VBox();

TableViewtblView<Bean> = new TableView<>();
vbox.getChildren().add(tblView);

TableColumn<Bean,String> col1 = new TableColumn<>("col1");
TableColumn<Bean,String> col2 = new TableColumn<>("col2");

col1.setCellValueFactory(new PropertyValueFactory<Bean,String>("col1"));
col2.setCellValueFactory(new PropertyValueFactory<Bean,String>("col2"));

tblView.getColumns().add(col1);
tblView.getColumns().add(col2);

ObservableList<Bean> obs = FXCollections.observableArrayList();
obs.add(new Bean("Col1", "Col2"));
obs.add(new Bean("Test2", "Test3"));
tblView.setItems(obs);

Button btn = new Button("Print");
btn.setOnAction(new EventHandler<ActionEvent>() {

@Override
public void handle(ActionEvent event) {
PrinterJob printerJob = PrinterJob.createPrinterJob();
if (printerJob.showPrintDialog(primaryStage) && printerJob.printPage(tblView)) {
printerJob.endJob();
}
}
});
vbox.getChildren().add(btn);

Scene scene = new Scene(vbox);

primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);

}
}
0