Java 实现通知线程的下一步按钮

Java 实现通知线程的下一步按钮,java,swing,Java,Swing,我知道这方面有一些问题,但似乎我不理解这个概念,或者它有问题 基本上,我想做的是,有一个算法,它将按照 for(step=0;step<value;step++){ //Do something; } 所以当点击下一个按钮时,线程应该会唤醒,但它似乎不会。。。 是什么导致了这个问题,我该如何克服 使用for循环,您试图强制线性控制台代码进行事件驱动处理,基本上是试图将一个方形的销钉塞进一个圆形的孔中,这根本不起作用。正确的解决方案是不使用线程、等待甚至for循环,而是简化所有这些,而是

我知道这方面有一些问题,但似乎我不理解这个概念,或者它有问题

基本上,我想做的是,有一个算法,它将按照

for(step=0;step<value;step++){ 
//Do something;
}
所以当点击下一个按钮时,线程应该会唤醒,但它似乎不会。。。
是什么导致了这个问题,我该如何克服

使用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());
    }
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.GridBagLayout;
导入javax.swing.*;
公共类SimpleDeprocessing扩展了JPanel{
公共静态最终字符串[]步骤={“第一步”、“第二步”、“第三步”、“第四步”,
“第五步”、“第六步”、“第七步”、“第八步”、“第九步”、“第十步”};
专用JLabel stepLabel=新JLabel(“”);
私有整数步计数器=0;
私有JButton nextButton=新JButton(“下一步”);
公共简单处理(){
nextButton.addActionListener(e->{
步进计数器++;
if(步长计数器<步长长度){
//将程序推进到下一步
stepLabel.setText(步骤[stepCounter]);
}
});
stepLabel.setText(步骤[stepCounter]);
JPanel-topPanel=新的JPanel(新的FlowLayout(FlowLayout.LEADING,4,4));
添加(新JLabel(“当前步骤”);
topPanel.add(stepLabel);
JPanel middlePanel=newjpanel(newgridbagloayout());
添加(下一个按钮);
setLayout(新的BorderLayout());
添加(topPanel,BorderLayout.PAGE_START);
添加(中间面板、边框布局、中间);
setPreferredSize(新尺寸(200100));
}
私有静态void createAndShowGui(){
SimpleStoreApprocessing主面板=新建SimpleStoreApprocessing();
JFrame=新的JFrame(“简单处理”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
}

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

要在对象上等待并通知,您需要一个带有synchronized语句的锁

要创建锁定对象,请执行以下操作:

private final Object lock = new Object();
synchronized (lock) {
                        lock.wait();
                }
synchronized (lock)
            {
                lock.notify();
            }
要等待锁定对象,请执行以下操作:

private final Object lock = new Object();
synchronized (lock) {
                        lock.wait();
                }
synchronized (lock)
            {
                lock.notify();
            }
要通知锁定对象,请执行以下操作:

private final Object lock = new Object();
synchronized (lock) {
                        lock.wait();
                }
synchronized (lock)
            {
                lock.notify();
            }

<>这可能有助于实现你的目标。

你可以考虑一个更大的MVC方法,非常感谢,我正在尝试实现这种解决方案。