【发布时间】:2017-09-14 17:29:37
【问题描述】:
我的代码有问题。我需要监控 CUPS 服务器,每台打印机都是一个线程:
public static void startCupsMonitor() throws Exception {
for (CupsPrinter cupsPrinter : PrintJobsUtils.getAllPrinters()) {
new Thread( new PrinterTask( cupsPrinter.getName() ), cupsPrinter.getName() ).start();
}
}
如您所见,我为 List 中的每个元素启动了一个线程,名为 PrintJobsUtils.getAllPrinters ()。到目前为止,一切顺利。
但我有一个带有 JTable 的 Modal(JDialog,setModal 设置为 true),当新的打印服务到达 CUPS 服务器时,它将更新它。所以...我创建了一个类来实现 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 以外的任何线程中使用摆动组件或其模型。
标签: java multithreading swing swingworker cups