내 코드에 문제가 있습니다. 당신이 볼 수 있듯이, 나는 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를 사용하여 해결되었습니다. 모두 감사합니다
@JB Nizet를 실행, 내 문제가되지 널 포인트. –
그런 다음 문제를 해결하고 실제 문제를 게시하십시오. "작동하지 않는다"는 것은 당신이 무엇을 기대하고 대신 무엇이 일어날 것인가에 관해 우리에게 * 아무것도 말하지 않는다는 것에주의하십시오. 또한 ** EDT 이외의 다른 스레드에서 스윙 구성 요소 나 모델을 사용하지 않을 수도 있습니다. –