使用停止按钮停止无限循环
stop infinite loop using stop button
开始无限循环后,我无法关闭 JFrame。
我想使用停止按钮停止无限循环。
我正在使用开始按钮开始无限循环。我想使用停止按钮关闭该循环。
if(stop.getModel().isPressed()){break;} 不工作
用于识别按钮点击和使用 break 语句终止 while 循环的 actionListener 也不起作用
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class NewClass1 {
private String arg = "";
public NewClass1()
{
JFrame frame = new JFrame("Datacolor software automate");
JButton stop = new JButton("STOP");
stop.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae)
{
arg = (String)ae.getActionCommand();
System.out.println(arg);
}
});
JButton button = new JButton("Start");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
int i = 0;
while (true)
{
try {
System.out.println(i);
i++;
if(arg.equals("STOP"))
{
break;
}
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
}
});
frame.add(button);
frame.add(stop);
frame.setLayout(new FlowLayout());
frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
new NewClass1();
}
});
}
}
单击停止按钮时,无限循环必须终止。使用启动按钮启动无限循环后,我无法使用 JFrame 中的任何按钮。
您首先无法单击 "Stop" 按钮,这是因为您 运行 在 Event Dispatch Thread 这将导致整个 GUI 冻结。
为了避免这种情况并使其正常工作,您将不得不使用 SwingWorker. 一个 class 允许您 运行 long/heavy 中的任务背景并(可选)在 GUI 中发布它们。
那么,如果要取消这个SwingWorker,调用它的cancel()
方法就可以了。
看看下面的例子:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class NewClass1 {
private String arg = "";
private SwingWorker<Void, Integer> worker;
public NewClass1() {
JFrame frame = new JFrame("Datacolor software automate");
JButton stop = new JButton("STOP");
stop.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
worker.cancel(true);
}
});
JButton button = new JButton("Start");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
initializeWorker();
worker.execute();
}
});
frame.add(button);
frame.add(stop);
frame.setLayout(new FlowLayout());
frame.setSize(300, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void initializeWorker() {
worker = new SwingWorker<Void, Integer>() {
@Override
protected Void doInBackground() throws Exception {
int i = 0;
while (!isCancelled()) {
i++;
publish(i); // give this i to "process" method
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
int i = chunks.get(0);
System.out.println(i);
}
};
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new NewClass1());
}
}
开始无限循环后,我无法关闭 JFrame。
我想使用停止按钮停止无限循环。
我正在使用开始按钮开始无限循环。我想使用停止按钮关闭该循环。
if(stop.getModel().isPressed()){break;} 不工作
用于识别按钮点击和使用 break 语句终止 while 循环的 actionListener 也不起作用
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class NewClass1 { private String arg = ""; public NewClass1() { JFrame frame = new JFrame("Datacolor software automate"); JButton stop = new JButton("STOP"); stop.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { arg = (String)ae.getActionCommand(); System.out.println(arg); } }); JButton button = new JButton("Start"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { int i = 0; while (true) { try { System.out.println(i); i++; if(arg.equals("STOP")) { break; } } catch (Exception e) { System.out.println(e.toString()); } } } }); frame.add(button); frame.add(stop); frame.setLayout(new FlowLayout()); frame.setSize(300,300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new NewClass1(); } }); } }
单击停止按钮时,无限循环必须终止。使用启动按钮启动无限循环后,我无法使用 JFrame 中的任何按钮。
您首先无法单击 "Stop" 按钮,这是因为您 运行 在 Event Dispatch Thread 这将导致整个 GUI 冻结。
为了避免这种情况并使其正常工作,您将不得不使用 SwingWorker. 一个 class 允许您 运行 long/heavy 中的任务背景并(可选)在 GUI 中发布它们。
那么,如果要取消这个SwingWorker,调用它的cancel()
方法就可以了。
看看下面的例子:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class NewClass1 {
private String arg = "";
private SwingWorker<Void, Integer> worker;
public NewClass1() {
JFrame frame = new JFrame("Datacolor software automate");
JButton stop = new JButton("STOP");
stop.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
worker.cancel(true);
}
});
JButton button = new JButton("Start");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
initializeWorker();
worker.execute();
}
});
frame.add(button);
frame.add(stop);
frame.setLayout(new FlowLayout());
frame.setSize(300, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void initializeWorker() {
worker = new SwingWorker<Void, Integer>() {
@Override
protected Void doInBackground() throws Exception {
int i = 0;
while (!isCancelled()) {
i++;
publish(i); // give this i to "process" method
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
int i = chunks.get(0);
System.out.println(i);
}
};
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new NewClass1());
}
}