【问题标题】:Retrieving JTextField Contents Like Scanner像扫描仪一样检索 JTextField 内容
【发布时间】:2013-07-14 16:30:27
【问题描述】:

我正在尝试为我的程序设置 GUI,并且大部分时间都可以正常工作。但是,我希望能够创建一个很像 Scanner 的 nextLine(); 的方法。它等待来自我的 JTextField 的输入,然后返回它。 this question 似乎与我的非常相似,但没有等待用户输入。这是我的 GUI 的当前代码:

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);
    }
}

我希望能够这样称呼它:

String menus = gui.getInput();

之类的;我已经将 gui 变量设置为 new Gui()。

根据我的搜索,我收集到它可能涉及 DocumentListener 或 ActionListener,或两者兼而有之。

【问题讨论】:

    标签: java swing user-interface jtextfield


    【解决方案1】:

    在文本字段中添加ActionListener。当文本字段具有焦点并且用户按下 Enter 时,将触发一个事件。详情请见How to Write an Action Listener

    【讨论】:

    • 谢谢,但这是否意味着该事件将在 actionPerformed() 中触发,因此我的函数无法返回?我从代码中完全独立的文件中调用此函数。
    • @user1796160:你可以试试这个approach,它使用java.beans.EventHandler,同样的东西,虽然你说的函数,必须把ActionEvent作为参数,它需要公开(我猜) 才能正常工作。
    • @nIcEcOw 我有点茫然不知如何从另一个文件中调用它。
    • 如需尽快获得更好的帮助,请发帖SSCCE。对于这种情况,SSCCE 需要包含两个类,因此将另一个类的可见性降低为默认值并将其包含在 Gui 的源中,添加 main(String[]) 并排除 jgoodies 依赖项。
    • @user1796160 :为什么不简单地使用JOptionPaneJDialog,如果我正确理解您的问题,它们可以为您提供您渴望的功能现在。提交JOptionPane/JDialog后,您可以暂停执行流程,等待用户输入后再继续...
    【解决方案2】:

    经过一番搜索,我找到了回答我的this question

    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;
    }
    

    感谢大家的帮助!

    【讨论】:

    • 我不得不投反对票,如果只是为了冒其他人可能会看到它并认为“这是要走的路”的风险。这不是..
    • @AndrewThompson 它对我有用,并且提出的其他替代方案都无法理解,所以。这满足了我的要求。
    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多