Jframe trava quando executo um loop infinito

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?

Sim!

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?

Você também pode utilizar esse método para evitar que a tela fique travada:
https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)

Vou testar já já posto aqui o resultado.

Cara não funcionou =(

Obrigado, galera, conseguir executando uma nova Thread para o loop. Vlw.