【问题标题】:Waiting on text field input等待文本字段输入
【发布时间】:2013-07-04 05:39:57
【问题描述】:

我想我必须先解释一下我要做什么 我创建了一个带有文本字段的 From 用于接受名称和另一个用于密码。 输入必须存储在 UID 中的用户名和 pass 中的密码两个字符串中。

我们如何在程序结束之前将值存储在字符串中,然后才打印它? 无论main()我把打印语句放在哪里,甚至在表单打开之前都会打印空值。

这是我的代码,由 Netbeans 生成。 检查 main 方法。

package mypackage;

public class test extends javax.swing.JFrame {
    public test() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {

        username = new javax.swing.JTextField();
        password = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("LOGIN");

        username.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                usernameActionPerformed(evt);
            }
        });

        password.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                passwordActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(107, 107, 107)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                .addComponent(username, javax.swing.GroupLayout.DEFAULT_SIZE, 183, Short.MAX_VALUE)
                .addComponent(password))
                .addContainerGap(110, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(117, 117, 117)
                .addComponent(username, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(28, 28, 28)
                .addComponent(password, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(111, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void usernameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_usernameActionPerformed
        uid=username.getText(); 
    }//GEN-LAST:event_usernameActionPerformed

    private void passwordActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_passwordActionPerformed
        pass=password.getText();
    }//GEN-LAST:event_passwordActionPerformed

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new test().setVisible(true);
            }
        });
        System.out.println(uid+" "+pass);
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextField password;
    private javax.swing.JTextField username;
    // End of variables declaration//GEN-END:variables
    static String uid,pass;
}

【问题讨论】:

  • 你可以试试invokeAndWait
  • AFAIK - main 方法和 EDT-Event Dispatcher Thread 是两个不同的线程。在将您的应用程序放在EDT 上(并将某些内容打印到控制台(用于您的用例)之后),主要未使用。虽然您的应用程序实际启动的时间现在取决于EDT-Queue

标签: java string swing jtextfield


【解决方案1】:

JTextField 中的 ActionListener 仅在字段具有焦点时按 Enter 时才会执行。

当然,您可以随时致电getText() 来检索当前文本字段包含的内容。

例如,如果您使用 Tab 在输入字段之间切换,您不会触发侦听器。

如果您想确保在用户关闭窗口而不按回车时获得密码,那么您可以添加WindowListener 并在窗口关闭时读取值。或者,您可以在文本字段中添加 FocusListener,以便在用户离开时也会收到通知。

【讨论】:

    【解决方案2】:

    为此使用模态JDialogJOptionPane

    请参阅How to Use Modality in Dialogs 了解更多信息。关于如何使用它们来阻止应用程序的进度。直到他们关闭。

    其他提示

    1)

    username = new javax.swing.JTextField();
    

    应该是:

    // suggest a size in letters..
    username = new javax.swing.JTextField(12);
    

    2)

    password = new javax.swing.JTextField();
    

    应该是:

    // use a field specialized for this purpose
    password = new javax.swing.JPasswordField();
    

    3)

    不要扩展框架或其他顶级容器。而是创建并使用一个实例。

    【讨论】:

      【解决方案3】:

      您应该在框架中添加windowListener 并覆盖windowClosing

      这是修改后的 init 版本。

      private void initComponents() {
          this.addWindowListener(new java.awt.event.WindowAdapter() {
              public void windowClosing(java.awt.event.WindowEvent windowEvent) {
                          uid=username.getText();
                          pass=password.getText();
      
      
                      System.out.println(uid+" "+pass);
      
              }
          });
      
          username = new javax.swing.JTextField();
          password = new javax.swing.JTextField();
      
          setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
          setTitle("LOGIN");
      
          username.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(java.awt.event.ActionEvent evt) {
                  usernameActionPerformed(evt);
              }
          });
      
          password.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(java.awt.event.ActionEvent evt) {
                  passwordActionPerformed(evt);
              }
          });
      
          javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
          getContentPane().setLayout(layout);
          layout.setHorizontalGroup(
              layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
              .addGroup(layout.createSequentialGroup()
                  .addGap(107, 107, 107)
                  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                      .addComponent(username, javax.swing.GroupLayout.DEFAULT_SIZE, 183, Short.MAX_VALUE)
                      .addComponent(password))
                  .addContainerGap(110, Short.MAX_VALUE))
          );
          layout.setVerticalGroup(
              layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
              .addGroup(layout.createSequentialGroup()
                  .addGap(117, 117, 117)
                  .addComponent(username, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                  .addGap(28, 28, 28)
                  .addComponent(password, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                  .addContainerGap(111, Short.MAX_VALUE))
          );
      
          pack();
      }
      

      【讨论】:

      • 非常感谢。 :) 这是一个非常有用的答案
      猜你喜欢
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2021-11-09
      • 2011-04-11
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多