Bom dia,
Sou novo na programação java, estou criando um código que pega um arquivo PDF em um diretório, e simplesmente imprimi. Só que eu preciso ficar monitorando se o arquivo está presente e pra isso eu criei um loop infinito. Até ai tudo bem, só que eu preciso de um tela informando que foi impresso, eu criei a tela só que ela trava quando o loop inicial.
Estou usando o netbeans para criar a interface gráfica,
Gostaria de um luz para resolver esse problema.
Desde de já agradeço a atenção de todos.
Poderia nos mostrar o código?
Se você não estiver usando thread, a tela irá mesmo travar se o loop infinito estiver executando.
public String PrintNow(String Imp, String Diretorio) throws IOException, PrinterException, InterruptedException {
imp = Imp;
while (Control) {
Thread.sleep(2000);
int result = CopyFile.copyFile();
if (result == 0) {
System.out.println("Arquivo Não Encontrado!!!");
} else {
System.out.println("Arquivo Encontrado!!!");
FileInputStream fis = new FileInputStream(Diretorio);
PrintPdf printPDFFile = new PrintPdf(fis, "imprimir.pdf");
printPDFFile.print();
Control = false;
}
}
return null;
}
A tela que você quer imprimir seria PrintPdf?
Mas desconsidera o controle=false dentro do loop que eu tava pedindo pra ele parar, mas a intenção é ele ser infinito!
Seu código está bem estranho. De qualquer forma, para apresentar a tela, você pode tirar de dentro do while o código que chama o frame, assim:
public String PrintNow(String Imp, String Diretorio) throws IOException, PrinterException, InterruptedException {
imp = Imp;
while (Control) {
Thread.sleep(2000);
int result = CopyFile.copyFile();
if (result == 0) {
System.out.println("Arquivo Não Encontrado!!!");
} else {
break;
}
}
System.out.println("Arquivo Encontrado!!!");
FileInputStream fis = new FileInputStream(Diretorio);
PrintPdf printPDFFile = new PrintPdf(fis, "imprimir.pdf");
printPDFFile.print();
return null;
}
O problema, é que, quando ele encontrar o arquivo, a tela deverá abrir, porém, o laço irá parar. Se sua intenção é que o laço continue executando, mesmo depois que o arquivo seja encontrado, então você terá que montar um esquema um pouco melhor, de preferência, usando thread.
Esse é o meu codigo de imprmir, Quem chama ele é um Jbutton.
package Control;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFRenderer;
import javax.print.PrintService;
import View.JFrameInicial;
public class PrintPdf extends Thread {
private PrinterJob pjob = null;
static String imp = "";
private PrintService impressora = null;
JFrameInicial setnome = new JFrameInicial();
boolean Control = true;
public String PrintNow(String Imp, String Diretorio) throws IOException, PrinterException, InterruptedException {
imp = Imp;
while (Control) {
Thread.sleep(2000);
int result = CopyFile.copyFile();
if (result == 0) {
System.out.println("Arquivo Não Encontrado!!!");
} else {
System.out.println("Arquivo Encontrado!!!");
FileInputStream fis = new FileInputStream(Diretorio);
PrintPdf printPDFFile = new PrintPdf(fis, "imprimir.pdf");
printPDFFile.print();
Control = false;
}
}
return null;
}
public PrintPdf(InputStream inputStream, String jobName) throws IOException, PrinterException {
byte[] pdfContent = new byte[inputStream.available()];
inputStream.read(pdfContent, 0, inputStream.available());
initialize(pdfContent, jobName);
}
public PrintPdf(byte[] content, String jobName) throws IOException, PrinterException {
initialize(content, jobName);
}
public PrintPdf() {
}
private void initialize(byte[] pdfContent, String jobName) throws IOException, PrinterException {
ByteBuffer bb = ByteBuffer.wrap(pdfContent);
PDFFile pdfFile = new PDFFile(bb);
PDFPrintPage pages = new PDFPrintPage(pdfFile);
PrintService[] pservices = PrinterJob.lookupPrintServices();
if (pservices.length > 0) {
for (PrintService ps : pservices) {
// System.out.println("Impressora Encontrada: " + ps.getName());
if (ps.getName().contains(imp)) {
// System.out.println("Impressora Selecionada: " + ps.getName());
impressora = ps;
break;
}
}
}
if (impressora != null) {
pjob = PrinterJob.getPrinterJob();
pjob.setPrintService(impressora);
PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
pjob.setJobName(jobName);
Book book = new Book();
book.append(pages, pf, pdfFile.getNumPages());
pjob.setPageable(book);
Paper paper = new Paper();
paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight());
pf.setPaper(paper);
}
}
public void print() throws PrinterException {
if (impressora != null) {
System.out.println("IMPRIMINDO....");
pjob.print();
System.out.println("IMPRIMIU");
}
}
}
class PDFPrintPage implements Printable {
private PDFFile file;
PDFPrintPage(PDFFile file) {
this.file = file;
}
@Override
public int print(Graphics g, PageFormat format, int index) throws PrinterException {
int pagenum = index + 1;
if ((pagenum >= 1) && (pagenum <= file.getNumPages())) {
Graphics2D g2 = (Graphics2D) g;
PDFPage page = file.getPage(pagenum);
Rectangle imageArea = new Rectangle((int) format.getImageableX(), (int) format.getImageableY(),
(int) format.getImageableWidth(), (int) format.getImageableHeight());
g2.translate(0, 0);
PDFRenderer pgs = new PDFRenderer(page, g2, imageArea, null, null);
try {
page.waitForFinish();
pgs.run();
} catch (InterruptedException ie) {
System.out.println(ie.toString());
}
return PAGE_EXISTS;
} else {
return NO_SUCH_PAGE;
}
}
}
Se não for muito, poderia me mostrar como realizar o que estou fazendo com uma Thread, sem ser com um while?
Vou testar já já posto aqui o resultado.
Obrigado, galera, conseguir executando uma nova Thread para o loop. Vlw.