私のコードに問題があります。 )複数のスレッドスイング
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のを使用してこの問題を解決しました。ありがとうございました
@JB Nizetを実行し、私の問題ではありませんヌル点。 –
それを修正し、あなたが関係する実際の問題を投稿してください。 「うまくいきません」とは、何が起こると予想されるか、何が起こるかについては何も教えてくれないことに注意してください。また、EDT以外のスレッドからスイングコンポーネントまたはそのモデルを使用しない**ことがあります。 –