Слушатель действий моей программы не будет работать

Это снова я, и я просто не могу заставить этот код работать. Я в основном прошу совета о том, почему кнопка ничего не делает при нажатии. Вы хотите, чтобы я приложил исходный код?

Метод, который я пытаюсь реализовать:

   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(). Однако теперь, когда я нажимаю кнопку отправки, графический интерфейс исчезает. Просто для справки, которая может вам понадобиться, вот мой основной метод:

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

Что-нибудь еще, что вам нужно, дайте мне знать


person Keith Mattix    schedule 13.07.2011    source источник
comment
Я не вижу кусочка кода ActionListener в опубликованных вами блоках кода. Почему он называется таким образом, если не использует ActionListeners? Кроме того, в чем конкретно заключается ваша проблема и ваш вопрос? Все, что вы публикуете, - это смутное желание и какой-то несвязанный код. Думаю, нам понадобится больше, если мы хотим помочь вам.   -  person Hovercraft Full Of Eels    schedule 13.07.2011
comment
Хорошо, теперь мы видим некоторый код ActionListener, так что мы кое-что достигли. Я думаю, что на этом этапе вам нужно выполнить некоторую отладку, включая размещение операторов System.out.println("at position 002 in code and foo variable is: " + foo); в вашей программе, чтобы проверить, вызывается ли метод, который, по вашему мнению, должен быть вызван, и состояние его переменных в этот момент времени.   -  person Hovercraft Full Of Eels    schedule 14.07.2011
comment
Я добавил предложение System.out, а также поток в вызывающем объекте. Я использую Thread.start, Thread.wait и Thread.stop. Перед потоком System.out не появлялся. После этого это произошло, а также исключение Illegal monitor. Кстати, я поместил System.out в UserInput. Однако я знаю, что у меня есть ошибка времени выполнения. Каждое имя пользователя и пароль, которые я ввожу, даже если они находятся в базе данных, показывают сообщение об ошибке. Я могу попытаться отправить вам исходный код, чтобы вы могли убедиться сами. Что-нибудь еще вам нужно, чтобы я сделал?   -  person Keith Mattix    schedule 14.07.2011


Ответы (2)


PasswordDemo, как показано на Как использовать поля пароля, послужит хорошей отправной точкой для вашего обучения и станет эффективным sscce.

Приложение: При отсутствии полного примера или информации о том, какую базу данных вы используете, я получил следующий результат:

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

выполнив следующую модификацию PasswordDemo против базы данных H2:

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

выполнив следующую модификацию PasswordDemo против Apache Derby:

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);
    }
} ...
person trashgod    schedule 13.07.2011
comment
Сотрите это. Мне пришлось удалить все потоки, потому что после некоторых изменений я получил сообщение об ошибке (набор результатов не открыт. Пожалуйста, убедитесь, что автофиксация отключена). Пожалуйста помоги - person Keith Mattix; 14.07.2011
comment
@Keith: я подробно рассказал выше. - person trashgod; 14.07.2011
comment
Я не понимаю, что ты делаешь. Я использую Apache derby для своей базы данных. Могу ли я отправить вам исходный код? - person Keith Mattix; 14.07.2011
comment
Я обновил приведенные выше примеры, чтобы показать сопоставимые запросы для H2 и Derby. Теперь, когда у вас есть полный работающий пример, вы сможете определить, где вы ошиблись. - person trashgod; 14.07.2011
comment
Извините, мне всего 13. Пожалуйста, подробно все объясните. Не проще ли будет запустить исходный код самостоятельно? - person Keith Mattix; 14.07.2011
comment
К сожалению, это не бесплатная служба отладки для людей любого возраста. Если вы не можете найти курс в местной школе, воспользуйтесь руководством. хорошее место для начала. - person trashgod; 14.07.2011
comment
Не это имел в виду, извините. Я просто попробую сам. - person Keith Mattix; 14.07.2011
comment
Превосходно; это хороший подход. Публикуйте вопросы по мере их возникновения, но наилучший результат даст sscce. Принятие ответов тоже поможет. - person trashgod; 14.07.2011

Наконец-то я заработал! У меня был другой конструктор с теми же именами переменных, и мой вызов JTextFields был ошибочно принят за вызов другого конструктора. Утверждения foo действительно помогли!!! Всем спасибо!

person Keith Mattix    schedule 15.07.2011
comment
Спасибо, что поделились своим результатом; Я уверен, что совершил аналогичную ошибку. Я голосую за ваш ответ как за полезный, за что вы получите 10 очков репутации. Конечно, принятие собственного ответа не приносит очков; но если бы вы вместо этого приняли мой ответ, вы бы получили дополнительные два балла. Дополнительную информацию см. в часто задаваемых вопросах. - person trashgod; 16.07.2011