从另一个类更改UI值

时间:2013-10-27 20:47:09

标签: java swing encapsulation

我正在用Java实现Consumer-Producer问题,我需要添加man。我的问题是从CustomerProducer类更改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);
        }
    }
}

3 个答案:

答案 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类型的参数传递。这个升技巧让我可以按照我想要的方式访问所有内容。