Как ждать ввода в текстовом поле? - PullRequest
6 голосов
/ 29 августа 2011

Я конвертирую консольное приложение в то, которое использует Swing. На данный момент я хочу, чтобы моя программа делала нечто подобное этому .nextInt();, как я могу добиться этого, используя .getText(); или что-то подобное?

Короче говоря;

Как я могу задержать выполнение программы, пока пользователь не введет что-то в текстовое поле и не нажмет ввод.

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Обновление: Итак, вы хотите подождать, пока пользователь не введет что-то из графического интерфейса.Это возможно, но должно быть синхронизировано , поскольку графический интерфейс запускается в другом потоке.

Итак, шаги:

  1. Создание объекта-держателя, который переносит результат из графического интерфейса в поток логики
  2. Поток логики ожидаетввод (используя holder.wait())
  3. Когда пользователь ввел текст, он синхронизирует объект «держатель» и дает результат + уведомляет «логический» поток (с holder.notify())
  4. «Логический» поток освобождается от блокировки и продолжает работу.

Полный пример:

public static void main(String... args) throws Exception {
    final List<Integer> holder = new LinkedList<Integer>();

    final JFrame frame = new JFrame("Test");

    final JTextField field = new JTextField("Enter some int + press enter");
    frame.add(field);
    field.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            synchronized (holder) {
                holder.add(Integer.parseInt(field.getText()));
                holder.notify();
            }
            frame.dispose();
        }
    });

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);

    // "logic" thread 
    synchronized (holder) {

        // wait for input from field
        while (holder.isEmpty())
            holder.wait();

        int nextInt = holder.remove(0);
        System.out.println(nextInt);
        //....
    }
}
0 голосов
/ 29 августа 2011

Консольное приложение и приложение с графическим интерфейсом сильно различаются по поведению. Консольное приложение принимает данные из аргументов командной строки или ожидает ввода данных пользователем с клавиатуры, пока приложение GUI управляется механизмом событий для выполнения задачи.

Например, вы добавляете объект TextField в свой фрейм и добавляете keyListener в свой объект текстового поля. Слушатель вызывается, когда о ключевом событии получено уведомление. Есть много примеров, например, официальный пример java http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...