我正在用Java实现Consumer-Producer问题,我需要添加man。我的问题是从Customer
或Producer
类更改UI组件。
我不知道如何从其他类别调用这些组件 - 而不是相关的类。当我试图获得例如height
组件时,一切都像魅力一样,但当我尝试set
时,没有任何反应!
这是我的Producer
类代码,尝试了一些:
public class Producer extends Thread {
// Variable which holds shared queue
private BlockingQueue<String> queue;
// Amount products created by producer
private int steps;
// Object with normaln distribution
private NormalDistribution distribution;
// Accessors to the frame
private PCPMainFrame frame;
private JSlider queueSlider;
private JProgressBar queueProgressBar;
// Constructor with 4 arguments
// q - is our queue shared between customer and producer
// steps - amount of products
// mean - parameter rquired for normal distribution
// standardDeviation - ditto
public Producer(BlockingQueue<String> q, int steps, double mean, double standardDeviation){
this.queue=q;
this.steps = steps;
this.distribution = new NormalDistribution(mean, standardDeviation);
this.frame = new PCPMainFrame();
this.queueSlider = frame.getQueueSlider();
this.queueProgressBar = new JProgressBar();
}
@Override
public void run() {
// Generating products and filling queue with them
for(int i = 0; i < steps; i++){
try {
long sleepTime = Math.abs((long)distribution.sample()*100);
Thread.sleep(sleepTime);
// Saving element in queue
queue.put(String.valueOf(i));
// This is a log for developer needs, feel free to uncomment
System.out.println("Produced: " + i);
queueSlider.setValue(steps);
frame.setQueueProgressBar(queueProgressBar);
} catch (InterruptedException e) {
System.out.println("Producer exception: " + e);
}
}
// Ading exit message at the end of the queue
String exit = new String("exit");
try {
queue.put(exit);
} catch (InterruptedException e) {
System.out.println("Queue exception: " + e);
}
}
}
答案 0 :(得分:1)
为了在Event Dispatch Thread之外修改GUI的外观,您有几个选择。您可以使用SwingUtilities.invokeLater
并传递执行任务的Runnable
,或使用SwingWorker
。
答案 1 :(得分:0)
确保您实际显示框架。
以下是基本Swing教程的示例代码:
JFrame frame = new JFrame(“HelloWorldSwing”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add the ubiquitous "Hello World" label.
JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
//Display the window.
frame.pack();
frame.setVisible(true);
编辑: 请注意,您缺少底部的两行。 (如果你已经可以看到一个框架,我猜你实际上正在查看不同的框架,而不是代码中生成的框架。)
答案 2 :(得分:0)
经过多次痛苦后我找到了答案!
以下是我所做的:
我已将JFrame
参数添加到我的Producer
构造函数中,当我在startButtonMouseClicked
中构建生成器时,我将this
作为JFrame
类型的参数传递。这个升技巧让我可以按照我想要的方式访问所有内容。