Java: остановка программы без запроса ввода - PullRequest
0 голосов
/ 05 июня 2011

Как многие из вас могут знать, когда у вас есть цикл 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 () при необходимости.

UPDATE: Я использую слушателей для кнопки. Это точная проблема.

 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.
     }
 }

EDIT: Я нашел решение (НАКОНЕЦ!)

это все, что нужно сделать ....

 string = "";
 while (true){
 if (string.equals ("");
 start ();
 if (string.equals ("exit") break; // I guess I didn't explain the problem too well...
     }

Спасибо за помощь всем!

Ответы [ 4 ]

2 голосов
/ 05 июня 2011

Я думаю, что ваша проблема в том, как изменить то, что делает кнопка, в зависимости от того, что было введено в GUI. Помните, что с GUI пользователь может взаимодействовать с любым включенным компонентом GUI в любое время и в любом порядке. Ключ должен проверить состояние GUI в ActionListener вашей кнопки и затем изменить поведение этого метода в зависимости от состояния этого GUI. Например, если в вашем графическом интерфейсе было три JTextFields, 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, вы, очевидно, не захотите делать какие-либо добавления, если любое из полей оставлено пустым, и поэтому вы проверяете его в ActionListener 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 (...) внутри цикла даже на короткое время, чтобы он не перегружал процессор. Например

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();
         }
      });
   }
}
1 голос
/ 05 июня 2011

Если у вас есть графический интерфейс, у вас обычно нет центрального основного цикла, который выполняется бесконечно. Канонический способ реагирования на события - прослушиватели событий :

mybutton.addListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) { System.out.println("Clicked"); }
    });
1 голос
/ 05 июня 2011

Сделайте ваше 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
    }
}
1 голос
/ 05 июня 2011

Парадигма программирования немного отличается, когда вы используете графический интерфейс.

Регистрируя слушателей на кнопках, вы получаете уведомление, когда что-то происходит - если ничего не происходит, цикл событий Swing (EDT) уже ничего не делает.

Возможно, я неправильно понял вопрос.

...