0

多くの人が知っているように、input メソッドが呼び出されたときに 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 に field1、field2、sumField の 3 つの JTextField と 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();
         }
      });
   }
}

EDIT 1
そうでなければ、絶対にループを使用する必要がある場合は、はい、Runnableで実行し、バックグラウンドスレッドで実行します。CPU を独り占めしないように、短い時間でもループ内で Thread.sleep(...) を呼び出すことを忘れないでください。例えば

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 に答える