2015-12-21 3 views
0

Я создал два swing.JFrame s. графический интерфейс пользователя и пользовательский интерфейс пользователя. что я хочу, когда он переключается войти в графический интерфейс для пользователя графического интерфейса, есть в пользовательском графическом интерфейсе, который должен быть изменен как ("you're logged in as" + username);бегущие методы, объявленные в swing.Jframe Класс

Я попробовал этот код в user исходном коде JFrame Jlabel.

`loggedInAsLable.setText("you're logged in as" + username);` 

в способе, и это называется в главном методе пользователя jframe. но по некоторым причинам не работает.

Как я могу запустить некоторые методы, когда Jframe становится видимым?

public class CustomerServiceOfficerUI extends javax.swing.JFrame { 

private static Statement st; 
ResultSet rs; 
Connection con = null; 
Login loginUI = new Login(); // gets current user Id 
Employee cso = new CustomerServiceOfficer(); //creates new customer service officer object 

/** 
* Creates new form CustomerServiceOfficer 
*/ 
public CustomerServiceOfficerUI() { 
    initComponents(); 
} 

public void getCSOdetails() { 

    try { 
     Class.forName("com.mysql.jdbc.Driver"); 

     con = DriverManager.getConnection("jdbc:mysql://localhost:3306/flyingcarsdb", "root", ""); 
     System.out.println("database connected"); 

    } catch (ClassNotFoundException | SQLException ex) { 
     System.out.println("Error: " + ex); 
    } 

    try { 
     // Retrieve customer service officer details 
     st = con.createStatement(); 
     String query = "select * FROM customerserviceofficer WHERE Id = '" + loginUI.getCurrentUserId() + "'"; 

     rs = st.executeQuery(query); 

     while (rs.next()) { 
      //Assign the details with setters 
      cso.setFname(rs.getString("Fname")); 
      cso.setEmail(rs.getString("Email")); 
     } 

    } catch (Exception ex) { 
     System.out.println("Error : " + ex); 
    } 
loggedInAsLable.setText("you're logged in as : " + cso.getId()); 
//this is where LABLE is changed, 'cso.getId()' returns the user ID 
    } 
+0

Показать свой код, где вы меняете метку –

+0

Во-первых, не используйте для этого фрейм, используйте диалоговое окно для входа в систему. Когда пользователь аутентифицируется и диалог закрывается, он должен возвращать информацию о сеансе вызывающего. Это основа для [Model-View-Controller] (http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) – MadProgrammer

+0

Я добавил код. lable обрабатывается методом. 'getCSOdetails()', и этот метод вызывается в основном методе класса CustomerServiceOfficerUI. –

ответ

1

Если вам действительно нужно обновить JFrame, когда оно становится видимым (как подсказывает ваше последнее утверждение), вы можете использовать в WindowListener называть свои getCSODetails() метод ,

public CustomerServiceOfficerUI() { 
    initComponents(); 
    this.addWindowListener(new WindowAdapter() { 

     @Override 
     public void windowOpened(WindowEvent e) 
     { 
      this.getCSODetails(); 
     } 

     @Override 
     public void windowDeiconified(WindowEvent e) 
     { 
      this.getCSODetails(); 
     } 

     @Override 
     public void windowActivated(WindowEvent e) 
     { 
      this.getCSODetails(); 
     } 

    }); 
} 

Я включил три события активации - открытие, активацию и деионизацию; вы можете удалить любой из них, чтобы ограничить обновление определенным событием в соответствии с вашими потребностями. Если вам нужно обновить ярлык только после того, как откроется окно, удалите методы windowDeiconified() и windowActivated(). Обратите внимание, однако, что метод getCSODetails() разработан довольно плохо и вызывает его всякий раз, когда окно становится видимым/сфокусированным, это приведет к снижению производительности, и на отзывчивость вашего графического интерфейса будет в большой степени влиять производительность вашей базы данных. Я предполагаю, что данные клиента, которые вы показываете, не изменяются во время сеанса входа в систему, поэтому было бы более целесообразно выполнить запрос один раз, кэшировать данные и затем отображать их из кеша.

+0

Спасибо. он работал, когда я удалил методы 'windowDeiconified()' и 'windowActivated()'. у него есть небольшая задержка, чтобы изменить lable (1 сек), но все в порядке. Я работаю над улучшением кода, спасибо за руководство. –

0

попробовать это:

public class CustomerServiceOfficerUI extends javax.swing.JFrame { 

    private static Statement st; 
    ResultSet rs; 
    Connection con = null; 
    Login loginUI = new Login(); // gets current user Id 
    Employee cso = new CustomerServiceOfficer(); //creates new customer service officer object 

    /** 
    * Creates new form CustomerServiceOfficer 
    */ 
    public CustomerServiceOfficerUI() { 
     initComponents(); 
    } 

    public void getCSOdetails() { 

     try { 
      Class.forName("com.mysql.jdbc.Driver"); 

      con = DriverManager.getConnection("jdbc:mysql://localhost:3306/flyingcarsdb", "root", ""); 
      System.out.println("database connected"); 




      // Retrieve customer service officer details 
      st = con.createStatement(); 
      String query = "select * FROM customerserviceofficer WHERE Id = '" + loginUI.getCurrentUserId() + "'"; 

      rs = st.executeQuery(query); 

      while (rs.next()) { 
       //Assign the details with setters 
       cso.setFname(rs.getString("Fname")); 
       cso.setEmail(rs.getString("Email")); 
      } 

SwingUtilities.invokeLater(new Runnable() 
     { 

      public void run() 
      { 
       loggedInAsLable.setText("you're logged in as : " + cso.getId()); 
       loggedInAsLable.repaint(); 

      } 
     }); 

     } catch (Throwable ex) { 
      System.out.println("Error : " + ex); 
SwingUtilities.invokeLater(new Runnable() 
     { 

      public void run() 
      { 
       loggedInAsLable.setText("There is a problem with your code : " + ex); 
       loggedInAsLable.repaint(); 

      } 
     }); 

     } finally { 

     } 
    //this is where LABLE is changed, 'cso.getId()' returns the user ID 
     } 
+1

Нет необходимости переписывать. 'invokeLater' должно быть достаточно. –

Смежные вопросы