Java 面对行动的问题

Java 面对行动的问题,java,swing,jframe,actionlistener,Java,Swing,Jframe,Actionlistener,第一次触发按钮操作时,不会打印用户名。第二次按下按钮时,值打印一次。第三次单击时,该值将打印两次。。有人能指出我的错误吗 *这是我的第一个问题,一定要给我一些提示,让我发布更好的问题:D 以下是主要方法: public class DMS implements ActionListener{ private static String username; /** * @param args the command line arguments */ public static void

第一次触发按钮操作时,不会打印用户名。第二次按下按钮时,值打印一次。第三次单击时,该值将打印两次。。有人能指出我的错误吗

*这是我的第一个问题,一定要给我一些提示,让我发布更好的问题:D

以下是主要方法:

public class DMS implements ActionListener{

private static String username;

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    LoginFrame login = new LoginFrame();
    login.setVisible(true);    
}

public DMS(JTextField textField1) {
    DMS.username = textField1.getText();
}

@Override
public void actionPerformed(ActionEvent e) {
    System.out.println(username);
}


}
下面是动作监听器,它位于jframe中:

private void cmd_loginActionPerformed(java.awt.event.ActionEvent evt) {                                          
    ActionListener actionListener = new DMS(JTextField1);
    someButton.addActionListener(actionListener);
}

当控件传输到动作侦听器时,您正试图打印初始化期间获得的用户名,该用户名为空

您需要做的是:

在DMS类中保留JTextField的引用 在执行操作时,从组件获取数据。 这将确保您始终获取最新信息


希望能有所帮助。

尝试从cmd\u loginActionPerformed中删除此语句,这样就不会在每次发生ActionEvent时调用它


用户名将在DMS对象创建时分配一次

public DMS(JTextField textField1) {
      DMS.username = textField1.getText(); 
}
要从表单中获取最后一个值,我们需要调用getText;从actionPerformedActionEvent方法


由于您尚未显示完整的代码,因此在调用cmd_loginActionPerformed时无法看到该代码,但从所描述的行为来看,似乎每次操作发生时都添加了一个操作侦听器。您只需附加一个操作侦听器,这将修复您的增量打印,并且必须在任何用户操作发生之前完成,即,在初始化时执行此操作,这将修复第一次操作时的非打印问题。

我认为这可能是由于每次单击按钮时都会创建新的DMS类。各位,感谢您的回答。我发现我的方法是完全错误的,因为这个按钮目前有两个ActionListener。当主类上的actionListener在cmd_loginActionPerformed(将初始化该值)之前触发时,会出现此问题。请接受最佳答案,或编写自己的答案并接受它。我尝试过此方法,但NetBeans会自动将JTextField设置为private。如何更改?代码的第二部分返回错误,因为textField1在此类中不存在。TextField1位于另一个类a JFrame上。我正在使用netbean创建JFrame。将actionListener添加到构造函数后,值似乎不会传递到主类上。我应该如何更改我的代码?很难确定-请发布一个更好的帮助
public DMS(JTextField textField1) {
      DMS.username = textField1.getText(); 
}
public void actionPerformed(ActionEvent e) {
    DMS.username = textField1.getText(); 
    System.out.println(username);
}