2016-04-04 27 views
3

JavaFX programım bir dizi VBox'u hazırlar ve basar.JavaFX (OpenJFX) yazdırmama izin vermiyor

Bu ModPrintCycle'dir. Bu seçenekler sunar Pencere

public PrintCycle data; 
    //PrintCycle is a HashMap of VBoxes containing all the details 
PrinterJob pj; 
ChoiceBox<String> cbxPrinters = new ChoiceBox<String>(); 
ArrayList<Printer> arrPrinters = new ArrayList<Printer>(); 

//util.say just pops out a messagebox attached to ModPrintCycle. 

public void printAll(ArrayList<String> pageList){ 
    if(cbxPrinters.getSelectionModel().getSelectedIndex() >=0){ 
     if (data.tables.size() > 0){ 
      Printer curP = Printer.getDefaultPrinter(); 
       if(arrPrinters.size() > 0){ 
        curP = arrPrinters.get(cbxPrinters.getSelectionModel().getSelectedIndex()); 
       } 
       try{ 
        pj = PrinterJob.createPrinterJob(curP); 
        PageLayout pp = curP.createPageLayout(Paper.LEGAL, PageOrientation.PORTRAIT, MarginType.DEFAULT); 
        PageLayout pl = curP.createPageLayout(Paper.LEGAL, PageOrientation.LANDSCAPE, MarginType.DEFAULT); 

        for(String p : pageList){ 
         Printable pt = data.tables.get(p); 
         pt.scaleToFit(); 
         if(pt.isLandscape()){ 
          pj.printPage(pl,pt);  
         } 
         else{ 
          pj.printPage(pp,pt); 
         } 
        } 

        pj.endJob(); 
       }catch(Exception e){ 
        util.say(ModPrintCycle.this, "Error on Print"); 
       } 
     }else{ 
      util.say(ModPrintCycle.this, "Nothing to print"); 
     } 
    } 
    else{ 
     util.say(ModPrintCycle.this, "No Printer Selected"); 
    } 
} 

Yazıcı yüklü ve varsayılan olarak ayarlanır yazdırmak ve benim program bunu algılar. Ancak yazdığımda, hiçbir hata çıkmaz ve yazıcı hiçbir iş almaz.

Programımın daha önce çalıştığından eminim (A Lubuntu 15.10, 32-bit.). Ama şimdi farklı bir bilgisayara aktardım. Bir Lubuntu 15.10, 64-bit. Ben openjfx ve openjdk sürümü "1.8.0_66-internal" yüklü.

Neden yazdırılmadığını öğrenmek için neler yapabilirim?


Aynı baskıdan daha küçük bir yazdırma işi yapmaya çalıştı.

Button testPrint = new Button("Test Print"); 

    testPrint.setOnAction(new EventHandler<ActionEvent>(){ 

     @Override 
     public void handle(ActionEvent arg0) { 
      try{ 
       Printer p = Printer.getDefaultPrinter(); 
       PrinterJob pj = PrinterJob.createPrinterJob(p); 
       //util.say(ModShortcuts.this, "Print: " + pj.getJobStatus()); 
       Boolean k = pj.printPage(p.createPageLayout(Paper.LEGAL,PageOrientation.PORTRAIT,MarginType.DEFAULT), new Text("Hey")); 
       //util.password(); //reused for a showAndWait() dialog 
       //util.say(ModShortcuts.this, "Print: " + pj.getJobStatus()); 
       //util.say(ModShortcuts.this, "attempted Print using: " + pj.getPrinter().getName()); 


       if(k){ 
        //util.say(ModShortcuts.this, "Print: " + pj.getJobStatus()); 
        pj.endJob(); 
        //util.say(ModShortcuts.this, "Print: " + pj.getJobStatus()); 
       } 

      }catch(Exception e){ 
       e.printStackTrace(); 
      } 

     } 

    }); 

    vbox.getChildren().add(testPrint); 

Uncommented, çıkış

Print: Not Printing 
Print: Printing 
attempted Print using: AstinePrinter 
Print: Printing 
Print: Done 

AstinePrinter benim yazıcının addır.

sudo add-apt-repository ppa:webupd8team/java 
sudo apt-get update 
sudo apt-get install oracle-java8-installer 

Ben Oracle Java 8 yüklü kullanarak ve hala aynı sorun:


Düzen.

Düzenleme: Ayrıca Oracle Java 7.

Düzenleme: Güvenlik duvarını devre dışı bırakmayı denedim

, durumunda bir liman problemi

sudo ufw disable 
Hala

şey oldu.

cevap

0

bir şey denilen CUPS4J bulduk ve bu beni o 64 bit Ubuntu CUPS erişmeye çalışan Java ile ilgili olan sorunu atlamasına izin verir. Byte dizilerini kullanarak yazdırır ve neyse ki, JavaFX'in seçilen düğümü yakalama yolu vardır.

Biraz bulanık, ama yeterince iyi. NOT: Uzman değilim ve bunun neden gerekli olduğunu bilmiyorum. Ancak bu, CUPS4J'yi hatasız kullanmamı sağladı, dolayısıyla doğru olması gerekiyordu. düzeltilmesi gereken bağımlılıkları olduğundan

  • Yani, her şeyden önce, cups4j için [ECLIPSE PROJECT] indirin. Projenize aktarın.

DÜZENLEME: Aşağıdakilerin gerekmesinin nedeni, bir şekilde paketimin org.slf4j ile gelmemesidir. Sınıf yolunuzda varsa, bu adımları atlayın.

  • Sonraki orada her sınıf için, Logger tüm örnekleri (küçük harf duyarlı ) Log ile değiştirilir ve ithalatlarınızı düzeltmek gerekir (Ctrl + + O Shift). Bu, Log'un bir sürümünü önerecek ve LogFactory otomatik olarak algılanacaktır. İçe aktarım yolumda, Kütüphaneler altındaki yapı yolunuzda org.slf4j için kitaplık bağımlılığını kaldırın.

(ı Runnable Kavanoz gayet kullanarak eminim, ama bu Runnable Jar kullanarak bana hataları verdi çünkü benim yaptığım budur) Bu benim baskı fonksiyonu için yaptıklarının bir basitleştirme olduğunu

.

private void print(Region node){ 
    //Make the image with the proper sizes 
    WritableImage wi = new WritableImage(
      (int) Math.round(Math.ceil(node.getWidth())), 
      (int) Math.round(Math.ceil(node.getHeight()))); 
    //shoot the image 
    wi = node.snapshot(new SnapshotParameters(), wi); 

    //write the image into a readable context 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    try{ 
     ImageIO.write(SwingFXUtils.fromFXImage(wi, null), "png", out); 
    }catch(Exception e){ 
     System.out.println("Error with SnapShot function"); 
    } 

    //Get your printer 
    CupsClient cc = new CupsClient(); 
    CupsPrinter cp = cc.getDefaultPrinter(); 

    //print the readable context 
    cp.print(new PrintJob.Builder(out.toByteArray()).build()); 

    //unlike PrinterJob, you do not need to end it. 
} 

emin değilim ama birden çok sayfa ile ilgili bir sorun var yani CUPS4J forumda hata raporları gördüm ama bunu karşılaşmaya henüz.

Birisi daha iyi bir cevabı varsa, eklemek için çekinmeyin. Ama şimdiye kadar, bu benim için çalıştı.

İlgili konular