2

I'm trying to set up a GUI for a program of mine, and have got it mostly working. However, I would like to be able to create a method that works a lot like Scanner's nextLine(); it waits for the input from my JTextField, and then returns it. It seemed like this question was very similar to mine but did not wait for the user's input. Here is my GUI's current code:

package util;

import java.awt.Font;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import com.jgoodies.forms.factories.DefaultComponentFactory;

public class Gui {

    public JFrame frame;
    private JTextField textField;
    private final JLabel lblVector = DefaultComponentFactory.getInstance().createTitle("Please type commands below.");
    private JScrollPane scrollPane;
    private JTextArea textArea;

    /**
     * Create the application.
     */
    public Gui() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    public void print(String text){
        textArea.append(text+"\n");
    }
    public String getInput()
    {
        String input = textField.getText();
        textField.setCaretPosition(0);
        return input;
    }
    private void initialize() {
        frame = new JFrame("Vector");
        frame.setBounds(100, 100, 720, 720);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        textField = new JTextField();
        frame.getContentPane().add(textField, BorderLayout.SOUTH);
        textField.setColumns(10);
        frame.getContentPane().add(lblVector, BorderLayout.NORTH);

        scrollPane = new JScrollPane();
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

        textArea = new JTextArea();
        textArea.setFont(new Font("Monospaced", Font.PLAIN, 15));
        textArea.setEditable(false);
        scrollPane.setViewportView(textArea);
    }
}

I'd like to be able to call it like so:

String menus = gui.getInput();

or such; I've already set up the gui variable as a new Gui().

From my searches, I've gathered it would probably involve either a DocumentListener, or an ActionListener, or both.

4

2 回答 2

4

ActionListener在文本字段中添加一个。当文本字段具有焦点并且用户按下Enter时,将触发一个事件。有关详细信息,请参阅如何编写动作侦听器

于 2013-07-14T16:31:48.100 回答
-1

经过一番搜索,我发现这个问题回答了我的问题:

public String getInput() throws InterruptedException
{
    final CountDownLatch latch = new CountDownLatch(1);
    KeyEventDispatcher dispatcher = new KeyEventDispatcher() {
        // Anonymous class invoked from EDT
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER)
                latch.countDown();
            return false;
        }
    };
    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher);
    latch.await();  // current thread waits here until countDown() is called
    KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher);
    String input = textField.getText();
    textField.setCaretPosition(0);
    return input;
}

感谢大家的帮助!

于 2013-07-14T17:23:50.750 回答