0

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

例如

  while {
      String input = in.readLine();
      int x = 55;  //This will not execute until input has been given a value
      System.out.println (x + x);
      }

现在我使用按钮进行输入。有什么方法可以使用 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...
     }

谢谢大家的帮助!

4

4 回答 4

2

我认为您遇到的问题是如何根据输入到 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 中对其进行测试动作监听器:

  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();
         }
      });
   }
}
于 2011-06-05T14:19:24.670 回答
1

当您使用 GUI 时,编程范式有点不同。

通过在按钮上注册侦听器,您会在发生某些事情时收到通知——如果没有发生任何事情,则 Swing 事件循环 (EDT) 已经“无所事事”。

也许我误解了这个问题。

于 2011-06-05T13:58:18.267 回答
1

如果你有一个 GUI,你通常不会有一个无限期执行的中央主循环。响应事件的规范方法是使用事件侦听器:

mybutton.addListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) { System.out.println("Clicked"); }
    });
于 2011-06-05T13:58:51.510 回答
1

制作您的JFrame工具ActionListener并调用button.addActionListener(this). 然后actionPerformed(ActionEvent event)点击按钮时方法内的代码将执行:)

或者你可以ActionListener匿名

button.addActionListener(new ActionListener() {
    void actionPerformed(ActionEvent event) {
        // Insert code to execute when button is clicked
    }
}
于 2011-06-05T14:00:00.387 回答