我的程序的动作监听器不起作用

Posted

技术标签:

【中文标题】我的程序的动作监听器不起作用【英文标题】:My program's Action Listener won't work 【发布时间】:2011-07-13 03:25:19 【问题描述】:

又是我,我似乎无法让这段代码工作。我基本上是在询问有关为什么单击按钮时什么都不做的任何建议。要不要我附上源代码?

我正在尝试实现的方法:

   public static void UserInput() 
      try 
         stmt = connect.createStatement();
         ResultSet res = stmt.executeQuery("SELECT * FROM " + tableName);
         while (res.next()) 
            if (res.getString("Username").equals(usernameField.getText())) 
               if (res.getString("Password").equals(passwordField.getPassword())) 
                  JOptionPane.showMessageDialog(null, "Correct", "Correct",
                           JOptionPane.INFORMATION_MESSAGE);
                else 
                  JOptionPane.showMessageDialog(null, "Error. Incorrect "
                           + "username or password.", "Error",
                           JOptionPane.ERROR_MESSAGE);
               
             else 
               JOptionPane.showMessageDialog(null, "Error. Incorrect "
                        + "username or password.", "Error",
                        JOptionPane.ERROR_MESSAGE);
            
         
         res.close();
         stmt.close();
         connect.close();

       catch (SQLException sqlExcept) 
         sqlExcept.printStackTrace();
      

   

我是这样称呼它的:

             if(firstTime == false) 
              JavaDB jdb = new JavaDB();
         

        JavaDB window = new JavaDB("");
        window.addWindowListener(new WindowAdapter()
            public void windowClosing(WindowEvent e)
                    System.exit(0);
                
            );
        

这里是 actionListner:

            submit = new JButton("Submit");
            c.add(submit);
              submit.addActionListener( new ActionListener()   
                    public void actionPerformed( ActionEvent e )  
                      if(e.getSource().equals(submit)) 
                         UserInput();
            
           
     );  ;        

如果您需要更多信息,请告诉我。我一直在自学 Java,但我真的不知道该学什么,所以欢迎任何提示。我也是堆栈溢出和发布代码的新手,所以你能给我的任何东西都将不胜感激。提前致谢。

编辑:我现在添加了一个用于事件处理的类,其中包含这样的线程;

             public class ButtonHandler implements ActionListener
    public void actionPerformed(ActionEvent e)
        if(e.getSource().equals(submit))
            Thread th = new Thread(new JavaDB());
            th.start();
            th.run();
            try 
                th.wait();
             catch (InterruptedException e1) 
            
        
        else
        System.exit(0);
           
    

我将 UserInput 更改为 run()。但是,现在当我单击提交按钮时,GUI 消失了。仅供参考,这是我的主要方法:

             public static void main(String args[]) throws SQLException,
        InterruptedException 
    createConnection();
    boolean firstTime = firstTime();
    if (firstTime) 
        JavaDB db = new JavaDB("");
        db.createAccount();
        try 
            connect = DriverManager
                    .getConnection("jdbc:derby:\\KeithDB;shutdown=true");
         catch (SQLException XJ015) 
        
    
    if (firstTime == false) 
        JavaDB jdb = new JavaDB();
        Thread th = new Thread();
    

    JavaDB window = new JavaDB("");
    window.addWindowListener(new WindowAdapter() 
        public void windowClosing(WindowEvent e) 
            System.exit(0);
        
    );

还有什么需要告诉我

【问题讨论】:

我在您发布的代码块中看不到一点 ActionListener 代码。为什么它在不涉及使用 ActionListeners 的情况下如此命名?另外,您的问题和问题具体是什么?您发布的只是一个模糊的愿望和一些不相关的代码。我认为,如果我们有机会帮助您,我们可能需要更多。 好的,现在我们看到了一些 ActionListener 代码,所以我们到了某个地方。我认为此时您需要进行一些调试,包括在程序中放置 System.out.println("at position 002 in code and foo variable is: " + foo); 语句以检查是否正在调用您认为应该调用的方法以及该时间点其变量的状态。 我在调用者中添加了 System.out 子句和一个线程。我使用 Thread.start、Thread.wait 和 Thread.stop。在 Thread 之前,System.out 没有出现。之后,它确实如此,以及非法监视器异常。顺便说一下,我将 System.out 放在了 UserInput 中。但是,我知道有一个运行时错误。我输入的每个用户名和密码,即使它在数据库中,也会显示错误消息。我可以尝试将源代码发送给您,以便您自己查看。还有什么需要我做的吗? 【参考方案1】:

PasswordDemo,如How to Use Password Fields 所示,将是您学习的一个很好的起点,它将成为有效的sscce。

附录:没有完整的示例或不知道您正在使用什么数据库,我得到了以下结果,

Version: H2 1.3.157 (2011-06-25) 1.3

通过针对H2 Database 对PasswordDemo 运行以下修改:

if (isPasswordCorrect(input)) 
    try 
        Connection conn = DriverManager.getConnection(
            "jdbc:h2:mem:", "sa", "secret");
        DatabaseMetaData metaData = conn.getMetaData();
        System.out.println("Version:"
            + " " + metaData.getDatabaseProductName()
            + " " + metaData.getDatabaseProductVersion()
            + " " + metaData.getDatabaseMajorVersion()
            + "." + metaData.getDatabaseMinorVersion());
     catch (SQLException ex) 
        ex.printStackTrace(System.err);
    
 ...

附录:我得到了以下结果,

Version: Apache Derby 10.6.2.1 - (999685) 10.6

通过针对Apache Derby 对PasswordDemo 运行以下修改:

if (isPasswordCorrect(input)) 
    try 
        EmbeddedDataSource ds = new EmbeddedDataSource();
        ds.setDatabaseName("/home/trashgod/.netbeans-derby/dbtest");
        Connection conn = ds.getConnection("sa", "secret");
        DatabaseMetaData metaData = conn.getMetaData();
        System.out.println("Version:"
            + " " + metaData.getDatabaseProductName()
            + " " + metaData.getDatabaseProductVersion()
            + " " + metaData.getDatabaseMajorVersion()
            + "." + metaData.getDatabaseMinorVersion());
     catch (SQLException ex) 
        ex.printStackTrace(System.err);
    
 ...

【讨论】:

从头开始。我不得不删除所有线程,因为在进行了一些更改后,我收到了一条错误消息(结果集未打开。请确保自动提交已关闭)。请帮忙 @Keith:我已经在上面详细说明了。 我不明白你在做什么。我正在为我的数据库使用 Apache derby。可以pm你源代码吗? 我已经更新了上面的示例以显示 H2 和 Derby 的可比较查询。现在您已经有了一个完整的、有效的示例,您或许可以确定哪里出错了。 抱歉,这不是为任何年龄的人提供的免费调试服务。如果您在当地学校找不到课程,tutorial 是一个不错的起点。【参考方案2】:

我终于让它工作了!我有另一个具有相同变量名称的构造函数,我对 JTextFields 的调用被误认为是对另一个构造函数的调用。 foo 语句真的很有帮助!!!谢谢大家!

【讨论】:

感谢您分享您的结果;我确定我犯了类似的错误。我认为您的答案很有用,因此您将获得 10 点声誉。当然,接受你自己的答案不会得分。但是,如果您改为接受我的回答,您将获得额外的两分。有关详细信息,请参阅faq。

以上是关于我的程序的动作监听器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 动作不起作用

嵌套表上的刷新控制不起作用(ios 开发)

Primefaces FileUploadEvent 侦听器方法不起作用

image_url 在动作邮件程序中不起作用(Ruby on rails)

删除 Typescript 的事件侦听器不起作用

除非应用程序已经在运行,否则 URL 方案侦听器不起作用