![](/img/trans.png)
[英]How to get user input into a for loop and make the program loop until user enters quit
[英]Make program “pause” until the user enters something in a JTextField
我想制作一个行为类似于Windows命令提示符或终端的程序。 它基本上只是一个JFrame,其output
为JTextArea,而JTextField为input
。 看起来像这样:
我希望每当我的程序调用返回String的方法时都可以从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();
时,如何在用户按下Enter之前停止程序getInput();
?
编辑:上半年删除。 我注意到这是错误的。
最好的选择是在用户在actionPerformed方法内输入文本后,将对您需要执行的计算机的调用括起来。 因此,当用户输入文本并按Enter键时,程序将自动从那里继续。
Action action = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
userInput = input.getText()
enterPressed = true;
input.setText("");
//call next method;
}
};
这需要您进行更多格式化工作,但是根据您的项目可能会有所帮助。 此链接包含有关此策略的更多信息。
希望这会有所帮助。
我希望每当我的程序调用返回String的方法时都可以从JTextField获取输入,例如:
我添加了AbstractAction,以便可以在按下回车键时做一些事情,但是我仍然可以弄清楚无论何时调用该方法,如何以String形式返回输入。
public String getInput() {
return input.getText();
}
那么,每次调用getInput();时,如何停止程序,直到用户按下Enter为止?
你不知道 像大多数UI框架一样,摆动是事件驱动的,也就是说,某些事情发生了,您对此做出了响应。
因此,考虑到这一点,您应该考虑使用某种Observer Pattern ,在其中使用回叫通知您感兴趣的某种更改,例如ActionListener
。
取而代之的是,您可以提供某种侦听器,有兴趣的各方可以向其注册,并在字段更改时通知您,例如...
import java.util.EventListener;
import java.util.EventObject;
public class InputEvent extends EventObject {
private final String text;
public InputEvent(Object source, String text) {
super(source);
this.text = text;
}
public String getText() {
return text;
}
}
public interface InputObsever extends EventListener {
public void inputChanged(InputEvent evt);
}
因此,我们现在有了一个观察者,只要更改/更新输入,便会得到通知。
然后我们只需要一种取消注册/触发事件的方法...
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.EventListenerList;
import javax.swing.text.DefaultCaret;
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) {
fireInputChanged(input.getText());
input.selectAll();
}
};
private EventListenerList listenerList = new EventListenerList();
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 String getInput() {
return input.getText();
}
public void addInputObsever(InputObsever obsever) {
listenerList.add(InputObsever.class, obsever);
}
public void removeInputObsever(InputObsever obsever) {
listenerList.remove(InputObsever.class, obsever);
}
protected void fireInputChanged(String text) {
InputObsever[] listeners = listenerList.getListeners(InputObsever.class);
if (listeners.length > 0) {
InputEvent evt = new InputEvent(this, text);
for (InputObsever obsever : listeners) {
obsever.inputChanged(evt);
}
}
}
}
现在,这里的重点是,当您想知道何时输入/更改了文本时,可以将观察者注册到ConsoleFrame
的实例
console.addInputObsever(new InputObsever() {
@Override
public void inputChanged(InputEvent evt) {
// Do what ever you need to do...
}
});
jTextField1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
yourFunction(jTextField1.getText());
jTextField1.setText("");
}
});
顺便说一句,您可以append
JTextArea
以获得console window
的感觉
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.