簡體   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