2017-09-14 7 views
0

私のコードに問題があります。 )複数のスレッドスイング

public static void startCupsMonitor() throws Exception { 

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

あなたが見ることができるように、私はPrintJobsUtils.getAllPrinters(で呼ばれる私のリスト内の各要素のためのスレッドを起動します。私は、各プリンタのスレッドであるWICH CUPSサーバを監視する必要があります。ここまでは順調ですね。

しかし、新しい印刷サービスがCUPSサーバーに到着したときに更新されるJTableを持つModal(setModalを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を試しましたが、このクラスを再利用することはできませんでした。

EDIT

私は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(); 
関連する問題