Java:在没有输入提示的情况下停止程序
正如许多人可能知道的那样,当调用输入方法时,当您有一个while循环(或任何循环)时,程序会停止并等待输入 e、 g 现在我用按钮输入。使用JButton、JPanel、JFrame等,我是否可以做同样的事情(在循环中停止程序) 注意:如果需要,我也愿意使用Runnable()接口。 更新: 我正在为按钮使用侦听器。这正是问题所在Java:在没有输入提示的情况下停止程序,java,input,while-loop,halt,Java,Input,While Loop,Halt,正如许多人可能知道的那样,当调用输入方法时,当您有一个while循环(或任何循环)时,程序会停止并等待输入 e、 g 现在我用按钮输入。使用JButton、JPanel、JFrame等,我是否可以做同样的事情(在循环中停止程序) 注意:如果需要,我也愿意使用Runnable()接口。 更新: 我正在为按钮使用侦听器。这正是问题所在 public void actionPerformed (ActionEvent x){ string = x.getActionCommand} public
public void actionPerformed (ActionEvent x){ string = x.getActionCommand}
public void someOtherMethod ()
{
while (true){
start ();
if (string.equals ("exit") break; // This line will never execute because start()
//is always repeating itself.
}
}
编辑:
我找到了解决办法(终于!)
这就是我们需要做的一切
string = "";
while (true){
if (string.equals ("");
start ();
if (string.equals ("exit") break; // I guess I didn't explain the problem too well...
}
谢谢大家的帮助 当您使用GUI时,编程范式有点不同 通过在按钮上注册监听器,当有事情发生时,您会收到通知-如果什么都没有发生,Swing事件循环(EDT)已经“什么都没有做”
也许我误解了这个问题。当您使用GUI时,编程范式有点不同 通过在按钮上注册监听器,当有事情发生时,您会收到通知-如果什么都没有发生,Swing事件循环(EDT)已经“什么都没有做”
也许我误解了这个问题。如果您有GUI,通常不会有一个无限期执行的中央主循环。响应事件的标准方式是:
如果您有GUI,通常不会有一个无限期执行的中央主循环。响应事件的标准方式是:
让您的
JFrame
实现ActionListener
并调用按钮。添加ActionListener(this)
。单击按钮时,将执行actionPerformed(ActionEvent事件)
方法中的代码:)
或者,您可以使用
button.addActionListener(new ActionListener() {
void actionPerformed(ActionEvent event) {
// Insert code to execute when button is clicked
}
}
让您的
JFrame
实现ActionListener
并调用按钮。添加ActionListener(this)
。单击按钮时,将执行actionPerformed(ActionEvent事件)
方法中的代码:)
或者,您可以使用
button.addActionListener(new ActionListener() {
void actionPerformed(ActionEvent event) {
// Insert code to execute when button is clicked
}
}
我认为您遇到的问题是如何根据输入到GUI的内容更改按钮的功能。请记住,使用GUI,用户可以在任何时间以任何顺序与任何启用的GUI组件进行交互。关键是检查按钮ActionListener中GUI的状态,然后根据此GUI的状态更改此方法的行为。例如,如果GUI有三个JTextField、field1、field2和sumField以及一个JButton addButton:
private JTextField field1 = new JTextField(5);
private JTextField field2 = new JTextField(5);
private JTextField sumField = new JTextField(5);
private JButton addButton = new JButton("Add");
您希望addButton将field1和field2中的数字相加,并将结果放入sumField中,如果其中任何一个字段留空,您显然不想进行任何相加,因此您需要在JButton的ActionListener中进行测试:
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text1 = field1.getText().trim();
String text2 = field2.getText().trim();
if (text1.isEmpty() || text2.isEmpty()) {
// data not entered... so return the method and do nothing
return;
}
// if we've reached this point, the user has entered in text and so we handle it
事情是这样的:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class WaitForInput extends JPanel {
private JTextField field1 = new JTextField(5);
private JTextField field2 = new JTextField(5);
private JTextField sumField = new JTextField(5);
private JButton addButton = new JButton("Add");
public WaitForInput() {
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text1 = field1.getText().trim();
String text2 = field2.getText().trim();
if (text1.isEmpty() || text2.isEmpty()) {
// data not entered... so return the method and do nothing
return;
}
try {
int number1 = Integer.parseInt(field1.getText());
int number2 = Integer.parseInt(field2.getText());
int sum = number1 + number2;
sumField.setText("" + sum);
} catch (NumberFormatException e1) {
// TODO: use JOptionPane to send error message
// clear the fields
field1.setText("");
field2.setText("");
}
}
});
add(field1);
add(new JLabel("+"));
add(field2);
add(new JLabel("="));
add(sumField);
add(addButton);
}
private static void createAndShowUI() {
JFrame frame = new JFrame("WaitForInput");
frame.getContentPane().add(new WaitForInput());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
编辑1否则,如果您必须使用循环,那么是的,在Runnable中执行,并在后台线程中执行。记住在循环内部调用Thread.sleep(…),即使是很短的一段时间,也不要占用CPU。比如说
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class HaltingProblem extends JPanel {
private static final int PANEL_HEIGHT = 400;
private static final int PANEL_WIDTH = 600;
private static final long SLEEP_DELAY = 100;
private Color[] colors = {Color.red, Color.orange, Color.yellow,
Color.green, Color.blue, Color.cyan};
private boolean halt = false;
private JButton haltButton = new JButton("Halt");
private int colorIndex = 0;
public HaltingProblem() {
setBackground(colors[colorIndex]);
haltButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
halt = !halt; // toggle it!
}
});
add(haltButton);
new Thread(new Runnable() {
public void run() {
while (true) {
keepDoingThis();
}
}
}).start();
}
private void keepDoingThis() {
try {
Thread.sleep(SLEEP_DELAY);
} catch (InterruptedException e) {}
if (halt) {
return;
}
colorIndex++;
colorIndex %= colors.length;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setBackground(colors[colorIndex]);
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PANEL_WIDTH, PANEL_HEIGHT);
}
private static void createAndShowUI() {
JFrame frame = new JFrame("HaltingProblem");
frame.getContentPane().add(new HaltingProblem());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
我认为您遇到的问题是如何根据输入到GUI的内容更改按钮的功能。请记住,使用GUI,用户可以在任何时间以任何顺序与任何启用的GUI组件进行交互。关键是检查按钮ActionListener中GUI的状态,然后根据此GUI的状态更改此方法的行为。例如,如果GUI有三个JTextField、field1、field2和sumField以及一个JButton addButton:
private JTextField field1 = new JTextField(5);
private JTextField field2 = new JTextField(5);
private JTextField sumField = new JTextField(5);
private JButton addButton = new JButton("Add");
您希望addButton将field1和field2中的数字相加,并将结果放入sumField中,如果其中任何一个字段留空,您显然不想进行任何相加,因此您需要在JButton的ActionListener中进行测试:
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text1 = field1.getText().trim();
String text2 = field2.getText().trim();
if (text1.isEmpty() || text2.isEmpty()) {
// data not entered... so return the method and do nothing
return;
}
// if we've reached this point, the user has entered in text and so we handle it
事情是这样的:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class WaitForInput extends JPanel {
private JTextField field1 = new JTextField(5);
private JTextField field2 = new JTextField(5);
private JTextField sumField = new JTextField(5);
private JButton addButton = new JButton("Add");
public WaitForInput() {
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text1 = field1.getText().trim();
String text2 = field2.getText().trim();
if (text1.isEmpty() || text2.isEmpty()) {
// data not entered... so return the method and do nothing
return;
}
try {
int number1 = Integer.parseInt(field1.getText());
int number2 = Integer.parseInt(field2.getText());
int sum = number1 + number2;
sumField.setText("" + sum);
} catch (NumberFormatException e1) {
// TODO: use JOptionPane to send error message
// clear the fields
field1.setText("");
field2.setText("");
}
}
});
add(field1);
add(new JLabel("+"));
add(field2);
add(new JLabel("="));
add(sumField);
add(addButton);
}
private static void createAndShowUI() {
JFrame frame = new JFrame("WaitForInput");
frame.getContentPane().add(new WaitForInput());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
编辑1否则,如果您必须使用循环,那么是的,在Runnable中执行,并在后台线程中执行。记住在循环内部调用Thread.sleep(…),即使是很短的一段时间,也不要占用CPU。比如说
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class HaltingProblem extends JPanel {
private static final int PANEL_HEIGHT = 400;
private static final int PANEL_WIDTH = 600;
private static final long SLEEP_DELAY = 100;
private Color[] colors = {Color.red, Color.orange, Color.yellow,
Color.green, Color.blue, Color.cyan};
private boolean halt = false;
private JButton haltButton = new JButton("Halt");
private int colorIndex = 0;
public HaltingProblem() {
setBackground(colors[colorIndex]);
haltButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
halt = !halt; // toggle it!
}
});
add(haltButton);
new Thread(new Runnable() {
public void run() {
while (true) {
keepDoingThis();
}
}
}).start();
}
private void keepDoingThis() {
try {
Thread.sleep(SLEEP_DELAY);
} catch (InterruptedException e) {}
if (halt) {
return;
}
colorIndex++;
colorIndex %= colors.length;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setBackground(colors[colorIndex]);
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PANEL_WIDTH, PANEL_HEIGHT);
}
private static void createAndShowUI() {
JFrame frame = new JFrame("HaltingProblem");
frame.getContentPane().add(new HaltingProblem());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
是的,有一点。我使用的是侦听器,问题是,循环一直在循环,当侦听器动作发生时,它总是覆盖。我会更新一点OP post。@Jimmy:解决办法是不使用循环。相反,当按下按钮时,检查JTextField中的文本,看看它是否包含所需的字符串。“你需要改变你的思维方式。@装满鳗鱼的气垫船,我希望我能改变我的思维方式,不幸的是我的程序必须有一个主循环来控制流量。我知道这很奇怪,但老师就是老师。@Jimmy:请看我贴在这条帖子上的答案。此外,如果你的老师的指导很奇怪、不寻常或难以理解,请将准确的指导以编辑的形式发布到你的原始帖子中,以便我们阅读并尝试解释,然后使用这些信息更正我们的建议。是的,有一点。我使用的是侦听器,问题是,循环一直在循环,当侦听器动作发生时,它总是覆盖。我会更新一点OP post。@Jimmy:解决办法是不使用循环。相反,当按下按钮时,检查JTextField中的文本,看看它是否包含所需的字符串。“你需要改变你的思维方式。@装满鳗鱼的气垫船,我希望我能改变我的思维方式,不幸的是我的程序必须有一个主循环来控制流量。我知道这很奇怪,但老师就是老师。@Jimmy:请看我贴在这条帖子上的答案。另外,如果你的老师的指示很奇怪、不寻常或难以理解,请将准确的指示以编辑的形式发布到你的原始帖子中,以便我们阅读并尝试解释它们,然后使用inf