Я привязываюсь, чтобы сделать программу, которая действует аналогично командной строке Windows или терминалу. В основном это JFrame с JTextArea как output
, а JTextField - как input
. Это выглядит следующим образом:Сделать программу «пауза» до тех пор, пока пользователь ничего не введет в JTextField
Я хочу, чтобы иметь возможность получить ввод с JTextField всякий раз, когда моя программа вызывает метод, который возвращает строку, что-то вроде:
public static String getInput() {
//Wait for user to enter something, then press the enter key
}
Я добавил AbstractAction поэтому я могу делать что-то, когда нажата клавиша ввода, но я все еще могу понять, как возвращать входные данные как String всякий раз, когда я вызываю метод.
Action action = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
//Clears the JTextField
input.setText("");
}
};
я мог бы поставить что-то вроде userInput = input.getText()
в public void actionPerformed()
, поэтому было бы просто установить переменную к тому, что было введено каждый раз, и использовать userInput
всякий раз, когда я хочу, но я хочу, чтобы пользователь имел время, чтобы прочитать, Что на экране, затем попросите программу подождать ответа, вместо того, чтобы просто использовать последнее, что они ввели сразу.
Я пытался использовать userInput
переменную и логическую переменную так:
private static String userInput = "";
private static boolean enterPressed = false;
Action action = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
userInput = input.getText()
enterPressed = true;
input.setText("");
}
};
...
public static String getInput() {
enterPressed = false;
while(!enterPressed){
//Do Nothing
}
enterPressed = false;
return userInput;
}
Когда я назвал output.setText(getInput());
, он работал, как я хотел, за исключением того, что while(!enterPressed){}
сделал мой процессор работать намного сложнее, чем должен понадобиться. Я почти уверен, что, вероятно, есть намного лучший способ сделать это.
Вот весь мой код прямо сейчас:
public class ConsoleFrame {
//Objects for Console Frame
JFrame frame = new JFrame();
JTextArea output = new JTextArea();
JTextField input = new JTextField();
BoxLayout boxLayout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS);
JScrollPane scrollPane = new JScrollPane(output);
DefaultCaret caret = (DefaultCaret)output.getCaret();
Action action = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
input.setText("");
}
};
ConsoleFrame(){
input.addActionListener(action);
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
frame.setLayout(boxLayout);
frame.add(scrollPane);
frame.add(input);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 250);
frame.setLocationRelativeTo(null);
input.setMaximumSize(new Dimension(Integer.MAX_VALUE, 10));
output.setEditable(false);
output.setAutoscrolls(true);
}
public static String getInput() {
return null;
}
}
Итак, как я мог бы остановить программу, пока пользователь нажмет не вводить каждый раз, когда я называю getInput();
?
У вас нет. Swing, как и почти все работы графического интерфейса GUI, управляется событиями, то есть в какой-то момент времени (который вы не можете определить) что-то произойдет, и тогда вы ответите на него. Вы не можете думать о графическом интерфейсе линейным способом, когда код переходит из одной точки в другую. По сути, если вы поместите текстовую область и текстовое поле на экран, программа «приостанавливается», ожидая, когда пользователь что-то сделает. Вам нужно разработать решение по этой функции. – MadProgrammer
Что вы хотите показать в консоли, когда 'getInput' вызван _not_. Если вы ничего не делаете, зачем останавливать программу? Вы просто хотите что-то выводить и ждать ввода, правильно? Вам даже не нужен метод getInput. Вы отключите JTextField при выводе материала и включите его, когда хотите ввода. – Sweeper
* «Я хочу иметь возможность получать входные данные от JTextField всякий раз, когда моя программа вызывает метод, который возвращает строку, что-то вроде:« * - 'JTextField # getText'. Вместо этого вы можете использовать шаблон наблюдателя вместо этого, где при запуске 'ActionListener' вы запускаете другое событие зарегистрированному слушателю (возможно, вашего собственного типа), который сообщает любой заинтересованной стороне, что новое значение доступно ... – MadProgrammer