【问题标题】:Multiple Threads Swing [duplicate]多线程摆动[重复]
【发布时间】: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


【解决方案1】:

Swing 无法绑定对象。 然后你可以创建一个包含Jtable的Thread并操作这个对象,并将这个对象与modal的Jtable关联起来,然后它就会反映到modal上。

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

// setJtable //运行等 }

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

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 2015-11-21
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多