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
@JB Nizet, mon problème est pas le point zéro. –
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. –