Java:在没有输入提示的情况下停止程序

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

正如许多人可能知道的那样,当调用输入方法时,当您有一个while循环(或任何循环)时,程序会停止并等待输入

e、 g

现在我用按钮输入。使用JButton、JPanel、JFrame等,我是否可以做同样的事情(在循环中停止程序)

注意:如果需要,我也愿意使用Runnable()接口。

更新: 我正在为按钮使用侦听器。这正是问题所在

 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