面对actionPerformed的问题

时间:2013-10-11 11:17:46

标签: java swing jframe actionlistener

"用户名"第一次触发按钮(动作)时不会打印。第二次按下该按钮时,该值打印一次。在第三次点击时,该值打印出两次。有人可以指出我的错误吗?

*这是我的第一个问题,请提供有关发布更好问题的提示: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);
}

4 个答案:

答案 0 :(得分:0)

当控件转移到您的动作侦听器时,您正在尝试打印初始化期间获得的用户名 - 这是空的。

您需要做的是:

  1. 在DMS类中保留JTextField的引用
  2. 在actionPerformed()上,从组件中获取数据。
  3. 这将确保您始终获取最新信息。

    希望有所帮助。

答案 1 :(得分:0)

尝试从cmd_loginActionPerformed删除此语句,以便每次ActionEvent发生时都不会调用此语句

someButton.addActionListener(actionListener);

答案 2 :(得分:0)

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

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

要从表单中获取最后一个值,我们需要从getText();方法调用actionPerformed(ActionEvent e)

public void actionPerformed(ActionEvent e) {
    DMS.username = textField1.getText(); 
    System.out.println(username);
}

答案 3 :(得分:0)

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