实现将通知线程的下一个按钮

时间:2017-03-30 02:10:33

标签: java swing

我知道有一些问题,但似乎我不明白这个概念,或者它有什么问题。

基本上,我要做的是,有一个算法将继续;

for(step=0;step<value;step++){ 
//Do something;
}

但它应该是一个选项,因此如果用户检查isStepped复选框,用户可以看到每个步骤如何执行算法; 所以我想出的是

 public void run() {
for (int step = 0; step < f; step++) {
        if (isStepped) {                
            try {
                wait();//Here is the problem
            } catch (InterruptedException ex) {
                Logger.getLogger(MainThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        }

在Menuside上;

private void nextButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           

    MyThread.notify();

}  

所以当下一个按钮点击时,线程应该唤醒,但它似乎不会...... 是什么导致了这个问题,我该如何克服?

2 个答案:

答案 0 :(得分:3)

使用for循环,你试图强制线性控制台代码进行事件驱动处理,基本上试图将方形挂钩推入圆孔,这根本不起作用。正确的解决方案是不使用线程,等待甚至是for循环,而是简化所有这些,而是​​使用每次用户按下按钮时递增的计数器 - 更改对象的状态以响应事件

例如:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;

import javax.swing.*;

public class SimpleStepProcessing extends JPanel {
    public static final String[] STEPS = { "Step One", "Step Two", "Step Three", "Step Four",
            "Step Five", "Step Six", "Step Seven", "Step Eight", "Step Nine", "Step Ten" };
    private JLabel stepLabel = new JLabel("");
    private int stepCounter = 0;
    private JButton nextButton = new JButton("Next");

    public SimpleStepProcessing() {
        nextButton.addActionListener(e -> {
            stepCounter++;
            if (stepCounter < STEPS.length) {
                // advance program to the next step
                stepLabel.setText(STEPS[stepCounter]);
            }
        });

        stepLabel.setText(STEPS[stepCounter]);

        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 4, 4));
        topPanel.add(new JLabel("Current Step:"));
        topPanel.add(stepLabel);

        JPanel middlePanel = new JPanel(new GridBagLayout());
        middlePanel.add(nextButton);

        setLayout(new BorderLayout());
        add(topPanel, BorderLayout.PAGE_START);
        add(middlePanel, BorderLayout.CENTER);

        setPreferredSize(new Dimension(200, 100));
    }

    private static void createAndShowGui() {
        SimpleStepProcessing mainPanel = new SimpleStepProcessing();

        JFrame frame = new JFrame("SimpleStepProcessing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

答案 1 :(得分:0)

等待是在对象不在线程中定义的,并且线程的监视不是很多预测..

要等待并通知对象,您需要使用synchronized语句锁定。

创建锁定对象:

private final Object lock = new Object();

等待锁定对象:

synchronized (lock) {
                        lock.wait();
                }

要在锁定对象上通知:

synchronized (lock)
            {
                lock.notify();
            }

这有助于实现目标。