制作节目"暂停"直到用户在JTextField

时间:2015-08-07 23:42:42

标签: java swing input

我想要制作类似于Windows命令提示符或终端的程序。它基本上只是一个JTerame,JTextArea为output,JTextField为input。它看起来像这样:

enter image description here

每当我的程序调用返回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();时,我怎么能在用户按下回车之前停止程序?

3 个答案:

答案 0 :(得分:4)

编辑:上半场已删除。我注意到这是错误的。

最好的选择是在用户在actionPerformed方法中输入文本后,将调用附加到您需要计算机执行的任何内容。因此,当用户输入文本并按下回车键时,程序将自动从那里继续。

Action action = new AbstractAction(){
@Override
    public void actionPerformed(ActionEvent e) {

    userInput = input.getText()
    enterPressed = true;
    input.setText("");
    //call next method;

    }
};

这需要代表您进行更多格式化工作,但根据您的项目,它可能会有所帮助。 This link有关于此策略的更多信息。

希望这有帮助。

答案 1 :(得分:2)

  

我希望能够在我的程序中从JTextField获取输入   调用返回String的方法,如:

     

我添加了一个AbstractAction,所以我可以在输入键时执行操作   按下,但我仍然可以弄清楚如何将输入作为一个返回   每次调用方法时的字符串。

public String getInput() {
    return input.getText();
}
  

那么,每当我调用getInput()时,我怎么能在用户按Enter键之前停止程序??

你不是。像大多数UI框架一样,Swing是事件驱动的,也就是说,某些事情会发生并且你会对它做出回应。

因此,考虑到这一点,您应该考虑使用某种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...
    }
});

答案 2 :(得分:-1)

    jTextField1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
                yourFunction(jTextField1.getText());
                jTextField1.setText("");
        }
    });

顺便说一下,你可以append JTextArea来感受console window