2015-01-17 68 views
1

我正在學習JavaFX。我創建了我的TableView並用數據填充它。我添加了一個按鈕,點擊時可以打印表格內容。在JavaFX中打印TableView內容

這裏是整個代碼:

`public final class TableViewSample2 extends Application { 
private TableView<Person> table; 
private ObservableList<Person> list; 

public void createTable() { 

    table = new TableView<>(); 
    table.setEditable(true); 
    list = FXCollections.observableArrayList(
      new Person("Jacob", "Smith", "[email protected]"), 
      new Person("Isabella", "Johnson", "[email protected]"), 
      new Person("Ethan", "Williams", "[email protected]"), 
      new Person("Emma", "Jones", "[email protected]"), 
      new Person("Michael", "Brown", "[email protected]")); 

//associating data with the table columns 
    TableColumn firstNameCol = new TableColumn("First Name"); 
    firstNameCol.setMinWidth(100); 
    firstNameCol.setCellValueFactory(
      new PropertyValueFactory<Person, String>("name")); 

    TableColumn SurnameCol = new TableColumn("Surname"); 
    SurnameCol.setMinWidth(100); 
    SurnameCol.setCellValueFactory(
      new PropertyValueFactory<Person, String>("surname")); 
    TableColumn emailCol = new TableColumn("Emil"); 
    emailCol.setMinWidth(100); 
    emailCol.setCellValueFactory(
      new PropertyValueFactory<Person, String>("email")); 

    table.setItems(list); 
    table.getColumns().addAll(firstNameCol, SurnameCol, emailCol); 

} 

@Override 
public void start(Stage primaryStage) { 
    StackPane root = new StackPane(); 
    Scene scene = new Scene(root, 300, 250); 
    this.createTable(); 
    Label label = new Label("My Address Book"); 
    Button button = new Button("Print"); 
    //printing 
    button.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      System.out.println(" can I print?"); 
      PrinterJob printerJob = PrinterJob.createPrinterJob(); 
      if (printerJob.showPrintDialog(primaryStage) && printerJob.printPage(table)) 
      { 
       printerJob.endJob(); 
       System.out.println("printed"); 
      } 
     } 
    }); 

    final VBox vbox = new VBox(); 
    vbox.setSpacing(5); 
    vbox.setPadding(new Insets(10, 0, 0, 10)); 
    vbox.getChildren().addAll(label, table, button); 
    root.getChildren().add(vbox); 

    primaryStage.setTitle("Sample TableView"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 

} 

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

當我運行該程序,作爲它應該顯示的表。完善。但是,當我點擊打印按鈕時,什麼都沒有發生。當我看到此代碼時,我正在查看如何打印TableView內容。我試圖在控制檯輸出一些消息,但沒有顯示。

我該如何解決這個問題?

+0

什麼是你的「我可以打印?」 - 輸出。這是在你的控制檯上? – chris

+0

@chris是的。因爲當我點擊打印按鈕時它沒有做任何事情,我想看看它是否可以執行這些語句。但是,即使當我評論與打印相關的代碼時,它也不會打印這些語句。 – JWizard

+0

完整示例爲我打印'我可以打印嗎? – ItachiUchiha

回答

1

更換primaeyStage.getOwner()我複製你的代碼(從Oracle網站類Person :)它作品完美。正如ItachiUchiha所評論的,我也假定.createPrinterJob()不會返回一個對象。也許你還沒有安裝任何打印機。

的NetBeans顯示我的老惠普打印機的一些細節:

enter image description here

+0

我一直在努力,終於有效。但是,它向我展示了這兩行代碼。 '注意:C:\ Users \ nationch \ Documents \ NetBeansProjects \ TableViewPrint \ src \ tableviewprint \ TableViewPrint.java使用未選中或不安全的操作。 注意:使用-Xlint重新編譯:取消選中以查看詳細信息。他們的意思是什麼? – JWizard

+0

我知道這個消息,但我從來不介意。在這裏問一個新問題。 – chris

0

既然你已經在使用primaryStage,它的主人將是null

嘗試用primaryStage

button.setOnAction((ActionEvent event) -> { 
     System.out.println(" can I print?"); 
     PrinterJob printerJob = PrinterJob.createPrinterJob(); 
     if (printerJob.showPrintDialog(primaryStage) && printerJob.printPage(table)) { 
      printerJob.endJob(); 
      System.out.println("printed"); 
    } 
}); 
+0

我試過了,但沒有顯示。我甚至評論了與打印相關的代碼,但它不打印這兩個控制檯語句。讓我發佈整個代碼。 – JWizard

+0

你可以檢查你是否能夠從PrinterJob.createPrinterJob()中獲得一個值嗎?我想這是爲你返回'null'! – ItachiUchiha