繁体   English   中英

将JFrame传递给线程

[英]pass JFrame to a thread

我有一个创建JFrame的类。 单击开始按钮后,它将调用我的CoinCounterMechanism类。 此类包含以下线程:

Thread consumer = new Thread("CONSUMER"){
    public void run ()
    {
        Integer coin;
        while (producerFlag)
        try 
        {
            coin = queue.take();
            System.out.println("Coin received: " + coin);
        } catch (InterruptedException e)  
        {
            e.printStackTrace();
        }
    }
};

当从其他类调用此线程时,我需要将其传递给JFrame,以便可以修改JFrame的内容。 我怎样才能做到这一点? 这是针对入门级Java课程的,因此老师为我们提供了大部分此类代码。 以下是调用线程的代码:

Button btnStart = new JButton("Start");
    btnStart.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            cm = new CoinCounterMechanism();
            cm.setConsumerFlag();
            cm.setProducerFlag();

            cm.producer.start();
            cm.consumer.start();
        }
    });

您可以创建一个实际的Runnable类,而不是一个匿名线程。 您可以使用构造函数来传递JFrame和其他字段。

public class Consumer implements Runnable {

    private boolean producerFlag;

    private JFrame frame;

    private Queue<Integer> queue;

    public Consumer(JFrame frame, Queue<Integer> queue, boolean producerFlag) {
        this.frame = frame;
        this.queue = queue;
        this.producerFlag = producerFlag;
    }

    @Override
    public void run() {
        Integer coin;
        while (producerFlag)
            try {
                coin = queue.take();
                System.out.println("Coin received: " + coin);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }

}

您的JButton代码包含比实际启动线程的代码更高级别的代码。 通常,您可以通过上述方式使用Runnable类启动线程:

new Thread(new Consumer(frame, queue, true)).start();

事件分配线程是唯一应修改JFrame上任何内容的线程。

为了让另一个线程修改像JFrame这样的Swing组件,它需要在事件分发线程上提交更改,例如,让工作线程使用SwingUtilities#invokeLater

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // modify your JFrame here
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM