2017-09-14 51 views
0

내 코드에 문제가 있습니다. 당신이 볼 수 있듯이, 나는 PrintJobsUtils.getAllPrinters에서 호출 내 목록의 각 요소()에 대한 스레드를 시작여러 스레드 스윙

public static void startCupsMonitor() throws Exception { 

    for (CupsPrinter cupsPrinter : PrintJobsUtils.getAllPrinters()) { 
     new Thread(new PrinterTask(cupsPrinter.getName()), cupsPrinter.getName()).start(); 
    } 
} 

: 나는 CUPS 서버가 각 프린터를 이십 기가 바이트 모니터링해야하는 스레드입니다. 여태까지는 그런대로 잘됐다.

하지만 새 인쇄 서비스가 CUPS 서버에 도착하면 업데이트 될 JTable을 사용하여 모달 (JDialog가 true로 설정된 JDialog)을 갖습니다. 그래서 ... Runnable의 인터페이스와이 물건을 구현 한 클래스를 만들었습니다.

@Override 
public void run() { 

    CupsPrinter cupsPrinter; 
    PrintQueue printQueue = new PrintQueue(); 

    try { 
     cupsPrinter = PrintJobsUtils.getPrinter("http://" 
                + ApplicationUtils.getApplicationProperties().getProperty("cups.hostname") 
                + ":" + ApplicationUtils.getApplicationProperties().getProperty("cups.port") 
                + "/printers/" 
                + pName.toUpperCase()); 


     while (true) { 

      SwingUtilities.invokeLater(() -> { 
       List<PrintJobAttributes> printJobAttributesList; 
       try { 
        printJobAttributesList = PrintJobsUtils.getAllJobDetails(cupsPrinter); 
        if (!printJobAttributesList.isEmpty()) { 
         for (PrintJobAttributes printJobAttributes : printJobAttributesList) { 
          if (printJobAttributes.getJobState() == JobStateEnum.PENDING_HELD) { 
           printQueue.setVisible(true); 
           if (!ApplicationUtils.cotainsId(printJobAttributes, printQueueArrayList)) { 
            printQueueArrayList.add(printJobAttributes); 

            for (PrintJobAttributes jobAttributes : printQueueArrayList) { 
             printQueue.getDefaultTableModel().addRow(new Object[]{jobAttributes.getJobID(), 
              jobAttributes.getJobName(), jobAttributes.getSize()}); 
            } 

           } 
          } 
         } 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      }); 
      Thread.sleep(1000); 
     } 
    } catch (Exception e) { 

    } 

그러나 이것은 올바르게 작동하지 않습니다. 나는 jtable을 채울 것으로 예상했지만 위의 오류와 중복 된 행이 있습니다. 그러면 어떻게해야합니까? SwingWorker를 시도했지만이 클래스를 다시 사용할 수 없다고 읽었습니다.

수정

이 문제는 SwingWorker를 사용하여 해결되었습니다. 모두 감사합니다

+0

@JB Nizet를 실행, 내 문제가되지 널 포인트. –

+0

그런 다음 문제를 해결하고 실제 문제를 게시하십시오. "작동하지 않는다"는 것은 당신이 무엇을 기대하고 대신 무엇이 일어날 것인가에 관해 우리에게 * 아무것도 말하지 않는다는 것에주의하십시오. 또한 ** EDT 이외의 다른 스레드에서 스윙 구성 요소 나 모델을 사용하지 않을 수도 있습니다. –

답변

0

스윙 개체를 바인딩 할 수 없습니다. 그런 다음 Jtable을 포함하는 스레드를 만들고이 객체를 조작하고이 객체를 모달의 Jtable과 연결하면 모달을 반영합니다.

public class ThRefreshTable extends Thread{ 
    private JProgressBar barraProgresso = null; 

// setJtable // 등 }

modal: 
ThRefreshTable th = new ThRefreshTable(); 
        th.setJTable(this.table); 
th.start();