2017-09-14 1 views
0

J'ai un problème avec mon code. Je dois surveiller serveur CUPS wich chaque imprimante est un fil:Plusieurs threads swing

public static void startCupsMonitor() throws Exception { 

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

Comme vous pouvez le constater, je commence un thread pour chaque élément dans ma liste appelée à PrintJobsUtils.getAllPrinters(). Jusqu'ici tout va bien.

Mais j'ai un modal (JDialog avec setModal défini sur true) avec un JTable où il sera mis à jour quand un nouveau service d'impression arrive sur le serveur CUPS. Donc ... j'ai créé une classe qui a implémenté l'interface de Runnable et ce truc:

@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) { 

    } 

Mais cela ne fonctionne pas correctement. Je m'attendais à ce que le jtable soit rempli mais j'ai eu l'erreur ci-dessus et j'ai dupliqué des lignes. Alors, comment puis-je faire cela? J'ai essayé SwingWorker mais j'avais lu cette classe ne peut pas être réutilisée.

EDIT

J'ai résolu ce problème en utilisant SwingWorker. Merci à tous

+0

@JB Nizet, mon problème est pas le point zéro. –

+0

Ensuite, réparez-le et postez le problème réel qui vous préoccupe. Notez que "ça ne marche pas" ne nous dit rien de ce que vous attendez et de ce qui se passe à la place. Notez également que ** vous ne pouvez pas ** utiliser un composant swing ou son modèle à partir d'un thread autre que l'EDT. –

Répondre

0

Swing ne peut pas vous permettre de lier des objets. Ensuite, vous pouvez créer un Thread qui contient un Jtable et manipuler cet objet, et associer cet objet de la Jtable du modal, puis il réfléchira sur modal.

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

// // setJtable exécuter etc }

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