0

Java で Consumer-Producer 問題を実装していますが、これに guy を追加する必要があります。私の問題は、UI コンポーネントをCustomerまたはProducerクラスから変更することです。

これらのコンポーネントを他のクラスから呼び出す方法がわかりません-関連するクラスではありません。たとえば、コンポーネントを取得しようとすると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);
        }
    }
}
4

3 に答える 3

1

イベント ディスパッチ スレッドの外側で GUI がどのように見えるかを変更するには、いくつかのオプションがあります。タスクを実行する を使用SwingUtilities.invokeLaterして渡すか、 を使用できます。RunnableSwingWorker

于 2013-10-27T21:03:44.677 に答える
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行が欠落していることに注意してください。(既にフレームが表示されている場合は、コードで生成されたフレームではなく、実際には別のフレームを見ていると思います。)

于 2013-10-27T21:09:51.380 に答える
0

苦労の末に答えを見つけました!

JFrameコンストラクターに引数を追加し、Producerプロデューサーを構築するときに型の引数としてstartButtonMouseClicked渡します。このリッター トリックのおかげで、あらゆるものに思い通りにアクセスできるようになりました。thisJFrame

于 2013-10-27T21:40:18.903 に答える