我有一个创建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课程,所以老师给了我们大部分的代码。下面是调用Thread的代码:
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();
}
});
答案 0 :(得分:1)
您可以创建一个实际的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();
答案 1 :(得分:1)
应该在JFrame上修改任何内容的唯一线程是事件派发线程。
为了让另一个线程修改像JFrame这样的Swing组件,它需要在事件派发线程上提交更改,例如让工作线程使用SwingUtilities#invokeLater:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// modify your JFrame here
}
});