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方法,非常感谢,我正在尝试实现这种解决方案。