Как ждать ввода в текстовом поле?
Я конвертирую консольное приложение в то, которое использует Swing. На данный момент я хочу, чтобы моя программа делала нечто подобное .nextInt();
как я могу добиться этого с помощью .getText();
или что-то подобное?
Короче;
Как я могу задержать выполнение программы, пока пользователь не введет что-то в текстовое поле и не нажмет ввод.
2 ответа
Обновление: так что вы хотите подождать, пока пользователь не введет что-то из графического интерфейса. Это возможно, но необходимо синхронизировать, поскольку графический интерфейс работает в другом потоке.
Итак, шаги:
- Создайте объект-держатель, который переводит результат из графического интерфейса в "логический" поток
- "Логический" поток ожидает ввода (используя
holder.wait()
) - Когда пользователь ввел текст, он синхронизирует объект "держатель" и дает результат + уведомляет "логический" поток (с
holder.notify()
) - "Логический" поток освобождается от блокировки и продолжается.
Полный пример:
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);
//....
}
}
Консольное приложение и приложение с графическим интерфейсом совершенно разные по поведению. Консольное приложение принимает данные из аргументов командной строки или ожидает ввода данных пользователем с клавиатуры, пока приложение GUI управляется механизмом событий для выполнения задачи.
Например, вы добавляете объект TextField в свой фрейм и добавляете keyListener в свой объект текстового поля. Слушатель вызывается, когда о ключевом событии получено уведомление. Есть много примеров, например, официальный пример Java http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html